5. Оператор PLAY
С этой главы начинается часть книги,
посвященная музыкальному сопроцессору AY-
3-8910 (или AY-3-8912), встроенному в ZX-
Spectrum 128, а также во все его модифика-
ции.
При включении ZX-Spectrum 128 на экра-
не появляется меню, предлагающее на выбор
несколько пунктов. Все они неплохо описа-
ны в [2], в нашем же случае выберите пункт
128 BASIC. В этом режиме Вам становится
доступен оператор PLAY, обслуживающий му-
зыкальный сопроцессор.
В общем виде формат оператора PLAY вы-
глядит так:
PLAY A$[,B$,C$,D$,E$,F$,G$,H$]
где A$...H$ - символьные строки, задающие
музыкальную программу. Сам сопроцессор ис-
пользует для управления своими тремя кана-
лами (A, B и C) только A$, B$ и C$. Если
для Вас три канала много, то Вы можете ис-
пользовать только два, или даже один, за-
дав соответствующее количество стрингов
(пустой стринг также указывает на то, что
канал не используется).
Остальные строки (D$...H$) предназначе-
ны для управления музыкальными инструмен-
тами, которые можно подключить к ZX-Spec-
trum 128 через MIDI-интерфейс.
Все заданные стринги исполняются однов-
ременно, что позволяет создавать сложные и
красивые мелодии.
В стрингах используются специальные ко-
манды. Остановимся на них подробнее.
Ноты ДО, РЕ, МИ, ФА, СОЛЬ, ЛЯ и СИ те-
кущей октавы обозначаются строчными латин-
скими буквами, соответственно, c, d, e, f,
g, a и b (по международному стандарту).
Ноты следующей октавы обозначаются пропис-
ными латинскими буквами C, D, E, F, G, A и
B. Например, оператор
PLAY "cdefgabC"
проиграет гамму ДО-мажор.
Полутона задаются знаками # (диез) и $
(бемоль), стоящими перед нотой. Например,
ДО-диез запишется как #c, а СИ-бемоль -
$b. Чтобы проиграть гамму ДО-минор, введи-
те
PLAY "cd$efg$a$bC".
Допустимо использование нескольких дие-
зов или бемолей подряд. Так, ноту d можно
записать как ##c.
Длительность определяется числом от 1
до 9, стоящим перед нотой (табл. 3). Уста-
новленная длительность распространяется на
все последующие ноты и паузы (см. команду
&). По умолчанию устанавливается длитель-
ность, равная 5 (одна четвертая).
Кроме обычных нот, Вы можете задавать
триоли. Для этого используются числа от 10
до 12. Ноты триоли следуют непосредствен-
но за числом. Например:
PLAY "3fed&11fed&fed"
Триоли не изменяют установленной дли-
тельности нот. Кроме стандартных длитель-
ностей нот Вы можете использовать произ-
вольные. Для этого перед нотой через сим-
вол подчеркивания ("_") ставят несколь-
ко параметров, задающих требуемую длитель-
ность. Например, ноту ДО длительностью 3/8
(1/8 +1/4) можно записать так: "3_5c".
Длительность всех последующих нот и пауз
определяет последний параметр в связке.
Довольно странные эффекты получаются
при соединении длительностей обычных нот и
триолей (например: "3_12cde"). Поэкспери-
ментируйте с этим.
Про запись нот, вроде бы, все. Теперь о
командах:
O - изменение октавы. Номер октавы за-
дается числом от 0 до 8, следующим за ко-
мандой (по умолчанию установлена октава
5).
Соответствие параметра команды O музы-
кальным октавам приведено в табл. 4. Обра-
тите внимание, что ноты ниже b октавы 1
без MIDI-интерфейса воспроизводиться бу-
дут неправильно. Также немаловажно, что
хотя максимальный номер октавы равен вось-
ми, ничто Вам не мешает использовать сле-
дующую - девятую, обозначая ноты прописны-
ми буквами.
N - разделитель параметров. Использует-
ся для отделения двух числовых параметров
друг от друга. Например, когда надо задать
длительность ноты сразу за установкой ок-
тавы: "O4N5d". По существу, эта команда
является излишеством, так как вместо нее
можно использовать пробел: "O4 5d".
& - пауза. Длительность паузы устанав-
ливается так же, как и длительность ноты
(см. выше). Например: "6c&de3&de".
V - установка громкости. Громкость за-
дается числом от 0 (минимальная - выключе-
но) до 15 (максимальная). Например: "V10".
По умолчанию установлена громкость 15.
W - программирование эффектов. Ноты мо-
гут воспроизводиться не только с фиксиро-
ванной громкостью, но и со всевозможными
эффектами: затуханиями, всплесками и т.д.
Характер эффекта задается числом от 0 до
7, в соответствии с табл. 5. По умолчанию
установлен эффект 0.
X - временной параметр звукового эффек-
та. Для эффектов 0...3 параметр задает
длительность действия, для 4 и 5 - период,
6 и 7 - полупериод (см. табл.5). Значение
параметра выбирается из диапазона 0...
65535. По умолчанию установлено 65535.
Эффекты отключаются по завершении стри-
нга либо при изменении громкости (команда
V).
Следующая программа продемонстрирует
действие всех эффектов:
10 FOR A=0 TO 7
20 PLAY "UX1000W"+STR$ A+"cdef&"
30 NEXT A
К сожалению, в музыкальном сопроцессо-
ре всего один генератор огибающей, поэто-
му Вам не удастся настроить несколько ка-
налов на разные эффекты одновременно. Хо-
тя одинаковые эффекты Вы можете использо-
вать сразу в нескольких каналах, причем
параметры огибающей необходимо задать
только в одном из них, а в остальных дос-
таточно указать команду U (см. выше).
T - темп исполнения. Задается числом от
60 до 240. По умолчанию устанавливается
темп, соответствующий команде T120. За-
дать темп можно лишь для всей мелодии в
целом, поэтому он определяется только в
стринге канала A (в других каналах коман-
да T игнорируется).
(.) - повтор (репризы). Музыкальная
фраза, взятая в скобки, повторится два ра-
за. Допустимо использовать скобки в скоб-
ках (до 4 вложений). Закрывающая скобка
без соответствующей ей открывающей заста-
вит музыкальную фразу повторяться беско-
нечно от начала стринга. Используется это,
например, в басовых и ударных партиях.
H - останов оператора PLAY. Встретив
эту команду в стринге любого канала, опе-
ратор PLAY закончит свою работу. Команда
используется, например, для выхода из "за-
цикленной" басовой партии, когда заканчи-
вается основная мелодия.
!.! - комментарий. Используется для
вставки пояснений. Например:
PLAY "!SCALE:!cdefgabC".
Если после комментария в стринге ника-
ких команд нет, то закрывающий знак "!"
ставить необязательно.
M - устанавливает режим работы каналов.
Каждый канал может воспроизводить не толь-
ко чистый тон, но и так называемый белый
шум. Распределение режимов задается чис-
лом от 1 до 63, определяемым суммой кодов,
соответствующих режиму каждого из каналов
(табл. 6). Как и генератор огибающей, ге-
нератор шума в музыкальном сопроцессоре
только один, поэтому Вам не удастся нас-
троить несколько каналов одновременно на
шум с разной частотой. По умолчанию все
три канала настроены на тон (команда M7).
В следующем примере канал A настраи-
вается на тон, а канал B - на шум:
PLAY "M17cegbdfaCH","O3cC)".
Если Вы укажете команду M0, то все ка-
налы будут молчать, а Вы услышите потрес-
кивание.
Y - установка канала MIDI-интерфейса.
Число от 1 до 16, следующее за командой,
задает номер канала интерфейса, в который
необходимо направить вывод музыкальных
данных.
Z - передача управляющих кодов MIDI-ин-
терфейсу. Код MIDI (число от 0 до 255)
должен располагаться сразу за командой.
Допустимо передавать сразу два байта. В
этом случае их значения нужно отделить
друг от друга пробелом или командой N.
Обратите внимание, что все команды опе-
ратора PLAY должны быть набраны прописны-
ми буквами!
В заключение приведу краткую сводку ко-
манд оператора PLAY (табл. 7) и сообщения
об ошибках, которые могут возникать во
время его выполнения (табл. 8).