Вы используете устаревший браузер. Он может отображать этот и другие веб-сайты некорректно. Вам следует обновить браузер или использовать альтернативный браузер.
[ГАЙД]🎼 Программирование музыки и сложные звуковые эффекты на ZX Spectrum - Оператор PLAY
При включении ZX-Spectrum 128 на экране появляется меню, предлагающее на выбор несколько пунктов. Все они неплохо описаны в [2], в нашем же случае выберите пункт 128 BASIC. В этом режиме Вам становится доступен оператор PLAY, обслуживающий музыкальный сопроцессор.
где А$…Н$ - символьные строки, задающие музыкальную программу.
Сам сопроцессор использует для управления своими тремя каналами (А, В и С) только А$, В$ и С$. Если для Вас три канала много, то Вы можете использовать только два, или даже один, задав соответствующее количество стрингов (пустой стринг также указывает на то, что канал не используется).
Остальные строки (D$…H$) предназначены для управления музыкальными инструментами, которые можно подключить к ZX-Spectrum 128 через MIDI-интерфейс.
Все заданные стринги исполняются одновременно, что позволяет создавать сложные и красивые мелодии.
Команды оператора PLAY
В стрингах используются специальные команды. Остановимся на них подробнее.
Обозначение нот
Нота
Обозначение (строчные)
Обозначение (прописные)
ДО
c
C
РЕ
d
D
МИ
e
E
ФА
f
F
СОЛЬ
g
G
ЛЯ
a
A
СИ
b
B
Ноты ДО, РЕ, МИ, ФА, СОЛЬ, ЛЯ и СИ текущей октавы обозначаются строчными латинскими буквами: c, d, e, f, g, a, b (по международному стандарту). Ноты следующей октавы обозначаются прописными латинскими буквами: C, D, E, F, G, A, B.
Пример: оператор
Бейсик ZX:
PLAY "cdefgabC"
проиграет гамму ДО-мажор.
Полутона
Знак
Значение
#
диез
$
бемоль
Полутона задаются знаками # (диез) и $ (бемоль), стоящими перед нотой.
Примеры:
ДО-диез: #c
СИ-бемоль: $b
Гамма ДО-минор:
Бейсик ZX:
PLAY "cd$efg$a$bC"
Допустимо использование нескольких диезов или бемолей подряд. Так, ноту d можно записать как ##c.
Длительность нот
Длительность определяется числом от 1 до 9, стоящим перед нотой:
Число
Длительность
1
целая
2
половинная
3
четверть с точкой
4
четверть
5
восьмая с точкой
6
восьмая
7
шестнадцатая с точкой
8
шестнадцатая
9
тридцатьвторая
Установленная длительность распространяется на все последующие ноты и паузы. По умолчанию устанавливается длительность, равная 5 (одна четвертая).
Триоли
Кроме обычных нот Вы можете задавать триоли. Для этого используются числа от 10 до 12. Ноты триоли следуют непосредственно за числом.
Пример:
Бейсик ZX:
PLAY "3fed&11fed&fed"
Триоли не изменяют установленной длительности нот.
Произвольная длительность
Кроме стандартных длительностей нот Вы можете использовать произвольные. Для этого перед нотой через символ подчеркивания "_" ставят несколько параметров, задающих требуемую длительность.
Пример: ноту ДО длительностью 3/8 (1/8 +1/4) можно записать так:
Длительность всех последующих нот и пауз определяет последний параметр в связке.
Довольно странные эффекты получаются при соединении длительностей обычных нот и триолей (например: "3_12cde"). Поэкспериментируйте с этим.
Команды управления
O — Изменение октавы
Номер октавы задается числом от 0 до 8, следующим за командой .
Обратите внимание, что ноты ниже b октавы 1 без MIDI-интерфейса воспроизводиться будут неправильно. Также немаловажно, что хотя максимальный номер октавы равен восьми, ничто Вам не мешает использовать следующую — девятую, обозначая ноты прописными буквами.
N — Разделитель параметров
Используется для отделения двух числовых параметров друг от друга. Например, когда надо задать длительность ноты сразу за установкой октавы:
Ноты могут воспроизводиться не только с фиксированной громкостью, но и со всевозможными эффектами: затуханиями, всплесками и т. д.
Характер эффекта задается числом от 0 до 7:
Код
Эффект
0
плавное затухание
1
линейное затухание
2
быстрое затухание
3
нарастание и затухание
4
периодический повтор
5
затухающий повтор
6
включение/выключение
7
затухающее включение/выключение
По умолчанию установлен эффект 0.
X — Временной параметр звукового эффекта
Для эффектов:
0…3 — параметр задает длительность действия
4 и 5 — период
6 и 7 — полупериод
Значение параметра выбирается из диапазона 0…65535. По умолчанию установлено 65535.
U — Включение звукового эффекта
После этой команды все ноты будут воспроизводиться с эффектом, установленным командами W и X.
Эффекты отключаются:
по завершении стринга
при изменении громкости (команда V)
Демонстрация всех эффектов
Бейсик ZX:
10 FOR A=0 TO 7
20 PLAY "UX1000W"+STR$ A+"cdef&"
30 NEXT A
К сожалению, в музыкальном сопроцессоре всего один генератор огибающей, поэтому Вам не удастся настроить несколько каналов на разные эффекты одновременно. Хотя одинаковые эффекты Вы можете использовать сразу в нескольких каналах, причем параметры огибающей необходимо задать только в одном из них, а в остальных достаточно указать команду U (см. выше).
Т — Темп исполнения
Задается числом от 60 до 240. По умолчанию устанавливается темп, соответствующий команде Т120.
Задать темп можно лишь для всей мелодии в целом, поэтому он определяется только в стринге канала А (в других каналах команда Т игнорируется).
(.) — Повтор (репризы)
Музыкальная фраза, взятая в скобки, повторится два раза. Допустимо использовать скобки в скобках (до 4 вложений).
Закрывающая скобка без соответствующей ей открывающей заставит музыкальную фразу повторяться бесконечно от начала стринга. Используется это, например, в басовых и ударных партиях.
Н — Останов оператора PLAY
Встретив эту команду в стринге любого канала, оператор PLAY закончит свою работу.
Команда используется, например, для выхода из "зацикленной" басовой партии, когда заканчивается основная мелодия.
!...! — Комментарий
Используется для вставки пояснений.
Пример:
Бейсик ZX:
PLAY "!SCALE:!cdefgabC"
Если после комментария в стринге никаких команд нет, то закрывающий знак "!" ставить необязательно.
M — Устанавливает режим работы каналов
Каждый канал может воспроизводить не только чистый тон, но и так называемый белый шум.
Распределение режимов задается числом от 1 до 63, определяемым суммой кодов, соответствующих режиму каждого из каналов:
Канал
Тон
Шум
A
1
8
B
2
16
C
4
32
Пример: M17 = 16 (шум в B) + 1 (тон в A) — канал A настраивается на тон, канал B — на шум.
Как и генератор огибающей, генератор шума в музыкальном сопроцессоре только один, поэтому Вам не удастся настроить несколько каналов одновременно на шум с разной частотой.
По умолчанию все три канала настроены на тон (команда M7).
Пример:
Бейсик ZX:
PLAY "M17cegbdfaCH","O3cC)"
Если Вы укажете команду МО, то все каналы будут молчать, а Вы услышите потрескивание.
Y — Установка канала MIDI-интерфейса
Число от 1 до 16, следующее за командой, задает номер канала интерфейса, в который необходимо направить вывод музыкальных данных.
Z — Передача управляющих кодов MIDI-интерфейсу
Код MIDI (число от 0 до 255) должен располагаться сразу за командой.
Допустимо передавать сразу два байта. В этом случае их значения нужно отделить друг от друга пробелом или командой N.
Важное замечание
Все команды оператора PLAY должны быть набраны прописными буквами!
Таблицы для справки
Создание эффектов на PLAYe
С помощью оператора PLAY можно создавать очень интересные звуковые эффекты. Причем, делается это значительно проще, чем в случае с ВЕЕРом. Количество возможных эффектов ограничено только фантазией программиста. Чаще всего в них используются громкостные эффекты, многоголосие и генератор шума.
Так как количество эффектов в данном случае неимоверно велико, не буду описывать каждый из них, а приведу несколько примеров с необходимыми комментариями.
Пример 1: Плавно затухающая нота
Бейсик ZX:
10 PLAY "X16384W0O6U9B"
Воспроизводит плавно затухающую ноту.
Пример 2: Мягкая атака и затухание
Бейсик ZX:
10 PLAY "O6X1000W3U1BX16384W0 9B"
Модификация предыдущего эффекта. Громкость ноты сначала возрастает от минимальной до максимальной (мягкая атака), а затем плавно затухает.
Пример 3: Другой вариант
Бейсик ZX:
10 PLAY "T240W0X3000UO8(B&c&)"
Этот эффект практически полностью аналогичен предыдущим, но звучит совсем по-другому.
Пример 4: Мягкая атака
Бейсик ZX:
10 PLAY "O4X16384W3U9B"
Здесь используется эффект, который в музыке называется мягкой атакой звука.
Пример 5: Смесь тона с шумом
В этих четырех эффектах применяется чистый тон, но Вы можете использовать и шум, вставив команду M8, или смесь тона с шумом (команда M9).
Бейсик ZX:
10 LET A$="T240"
20 FOR A=1 TO 8
30 LET A$=A$+"O"+STR$ A+" 1CDEFGAB"
40 NEXT A: PLAY A$
В этом эффекте сначала подготавливается музыкальная программа, а затем проигрывается. Её можно было бы задать прямо в операторе PLAY, но тогда это выглядело бы ужасно (несколько строк однотипного текста!). Если же воспроизводить её одновременно с созданием (в цикле), то появятся нежелательные паузы.
Перед заданием основных данных в переменную A$ заносится команда Т240, что позволяет ускорить эффект. Попробуйте кроме Т240 добавить M8 или M9.
Пример 6: Два голоса в противоход
Бейсик ZX:
10 LET A$="T240": LET B$=""
20 FOR A=1 TO 8
30 LET A$=A$+"O"+STR$ A+" 1CDEFGAB"
40 LET B$=B$+"O"+STR$ (9-A)+" 1BAGFEDC"
50 NEXT A: PLAY A$, B$
Этот эффект очень похож на предыдущий. Но в данном случае используются два голоса, частоты которых смещаются в противоположных направлениях.
Пример 7: Три канала с разными частотами
Бейсик ZX:
10 PLAY "O3 1cdefgabC","O5 1cdefgabC","O6 1cdefgabC"
Здесь используются все три канала, настроенные на разные частоты, что звучит довольно интересно.
Пример 8: Необычный тембр через генератор огибающей
Бейсик ZX:
10 PLAY "W4X1UcdefgabCW7X4cdefgabC"
В последнем примере нетрадиционно используется генератор огибающей. С его помощью формируется необычный тембр.
Возможности оператора PLAY не исчерпываются приведенными эффектами. Вы можете поэкспериментировать с ним.
Критика оператора PLAY
И в заключение немного критики. Оператор PLAY, несмотря на все свои достоинства (которые принадлежат скорее музыкальному сопроцессору), имеет и недостатки:
Например, он не позволяет воспроизводить ноты в режиме легато (слитно) А также очень короткие ноты
Создание музыки на PLAYe
С помощью оператора PLAY можно очень легко создавать неплохие трехголосые мелодии. Все его возможности описаны ранее, поэтому здесь я ограничусь несколькими примерами:
Пример мелодии 1
Бейсик ZX:
10 PLAY "T60W0X10000U3g4g1CCb5b3f4f1aag5g3eag1g#f5f3feda5g"
Пример мелодии 2
Бейсик ZX:
10 PLAY "T180W0X10000U7c6e3f9&7c6e3f&O4efefe5g&", "O3U3c&&&e&&f&E&F&6G3c&&&e&&f&O4EFEFE5G3c"
Пример: "В траве сидел кузнечик" в стиле панк-рок
Бейсик ZX:
10 PLAY "T240M35fcfcfee&ececeff&fcfcfee&ececefH", "V14O4&f&c&e&c&e&c&f&c&f&c&e&c&e&c&f", "W0X2000Uc&)"
Заключение
Несмотря на то, что с помощью оператора PLAY можно создавать неплохую музыку и эффекты, самые красивые варианты получаются в кодах.
Удачи в музыкальных экспериментах на ZX Spectrum 128!