🎛️ Введение в PLAY

🟥 При включении ZX-Spectrum 128 на экране появляется меню, предлагающее на выбор несколько пунктов. Все они неплохо описаны в [2], в нашем же случае выберите пункт 128 BASIC. В этом режиме Вам становится доступен оператор PLAY, обслуживающий музыкальный сопроцессор.

📝 В общем виде формат оператора PLAY выглядит так:
  • где А$…Н$ - символьные строки, задающие музыкальную программу.
🎹 Сам сопроцессор использует для управления своими тремя каналами (А, В и С) только А$, В$ и С$. Если для Вас три канала много, то Вы можете использовать только два, или даже один, задав соответствующее количество стрингов (пустой стринг также указывает на то, что канал не используется).

🎚️ Остальные строки (D$…H$) предназначены для управления музыкальными инструментами, которые можно подключить к ZX-Spectrum 128 через MIDI-интерфейс.

🔄 Все заданные стринги исполняются одновременно, что позволяет создавать сложные и красивые мелодии.

📋 Команды оператора PLAY

В стрингах используются специальные команды. Остановимся на них подробнее.

🎼 Обозначение нот

НотаОбозначение (строчные)Обозначение (прописные)
ДОcC
РЕdD
МИeE
ФАfF
СОЛЬgG
ЛЯaA
СИbB

📌 Ноты ДО, РЕ, МИ, ФА, СОЛЬ, ЛЯ и СИ текущей октавы обозначаются строчными латинскими буквами: 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 (одна четвертая).
1771001678701.png

🎵 Триоли​

🔢 Кроме обычных нот Вы можете задавать триоли. Для этого используются числа от 10 до 12. Ноты триоли следуют непосредственно за числом.

Пример:
Бейсик ZX:
PLAY "3fed&11fed&fed"
ℹ️ Триоли не изменяют установленной длительности нот.

✨ Произвольная длительность

📐 Кроме стандартных длительностей нот Вы можете использовать произвольные. Для этого перед нотой через символ подчеркивания "_" ставят несколько параметров, задающих требуемую длительность.

Пример: ноту ДО длительностью 3/8 (1/8 +1/4) можно записать так:
🔄 Длительность всех последующих нот и пауз определяет последний параметр в связке.

🎛️ Довольно странные эффекты получаются при соединении длительностей обычных нот и триолей (например: "3_12cde"). Поэкспериментируйте с этим.

🎮 Команды управления

O — Изменение октавы

📊 Номер октавы задается числом от 0 до 8, следующим за командой .
1771001883302.png

⚠️ Обратите внимание, что ноты ниже b октавы 1 без MIDI-интерфейса воспроизводиться будут неправильно.
💡 Также немаловажно, что хотя максимальный номер октавы равен восьми, ничто Вам не мешает использовать следующую — девятую, обозначая ноты прописными буквами.

N — Разделитель параметров

📌 Используется для отделения двух числовых параметров друг от друга. Например, когда надо задать длительность ноты сразу за установкой октавы:

💡 По существу, эта команда является излишеством, так как вместо нее можно использовать пробел:

& — Пауза

⏱️ Длительность паузы устанавливается так же, как и длительность ноты (см. выше).

Пример:

V — Установка громкости

📊 Громкость задается числом от 0 до 15:
  • 0 — минимальная (выключено)
  • 15 — максимальная
Пример:

⚙️ По умолчанию установлена громкость 15.

W — Программирование эффектов

🎚️ Ноты могут воспроизводиться не только с фиксированной громкостью, но и со всевозможными эффектами: затуханиями, всплесками и т. д.

📊 Характер эффекта задается числом от 0 до 7:
КодЭффект
0плавное затухание
1линейное затухание
2быстрое затухание
3нарастание и затухание
4периодический повтор
5затухающий повтор
6включение/выключение
7затухающее включение/выключение

⚙️ По умолчанию установлен эффект 0.

X — Временной параметр звукового эффекта

📊 Для эффектов:

  • 0…3 — параметр задает длительность действия
  • 4 и 5 — период
  • 6 и 7 — полупериод
📏 Значение параметра выбирается из диапазона 0…65535.
⚙️ По умолчанию установлено 65535.
1771002085898.png

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, определяемым суммой кодов, соответствующих режиму каждого из каналов:
КаналТонШум
A18
B216
C432

Пример: M17 = 16 (шум в B) + 1 (тон в A) — канал A настраивается на тон, канал B — на шум.

⚠️ Как и генератор огибающей, генератор шума в музыкальном сопроцессоре только один, поэтому Вам не удастся настроить несколько каналов одновременно на шум с разной частотой.

⚙️ По умолчанию все три канала настроены на тон (команда M7).

Пример:
Бейсик ZX:
PLAY "M17cegbdfaCH","O3cC)"
💡 Если Вы укажете команду МО, то все каналы будут молчать, а Вы услышите потрескивание.

Y — Установка канала MIDI-интерфейса

🔢 Число от 1 до 16, следующее за командой, задает номер канала интерфейса, в который необходимо направить вывод музыкальных данных.

Z — Передача управляющих кодов MIDI-интерфейсу

🔢 Код MIDI (число от 0 до 255) должен располагаться сразу за командой.

📨 Допустимо передавать сразу два байта. В этом случае их значения нужно отделить друг от друга пробелом или командой N.


⚠️ Важное замечание

❗ Все команды оператора PLAY должны быть набраны прописными буквами!

📊 Таблицы для справки

1771002267355.png

1771002282440.png


🎧 Создание эффектов на 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! 🎹
  • Like
Реакции: AzAtom