15. звукогенератор 13.09.90 Звукогенератор представляет собой аппаратно─программные средства, позволяющие создавать звуковые эффекты и проигрывать трехголосные музыкальные произведения с раздельной регулировкой громкости по каждому из голосов. Аппаратная часть состоит из двух БИС программируемых таймеров КР580ВИ53. Программное средства звукогенератора включают три компоненты: ─ компилятор MML.SAV с внешнего языка описания мелодий во внутреннее (более компактное представление); внешний язык совместим с "музыкальным макро языком" MML, используемым в ПЭВМ стандарта MML; ─ эмулятор звукогенератора SNC.PRC, управляющий аппаратными средствами на физическом уровне; эмулятор реализован с помощью двух процессов: один процесс принимает мелодию во внутреннем формате и заносит ее во внутренний буфер, второй процесс ─ выполняет непосредственное управление аппаратурой, т.е. проигрывание мелодии; ─ драйвер звукогенератора SN.SYS, выполняющий интерфейсные функции между прикладными программами, работающими под управлением ДОС, и эмулятором. Дополнительно в комплект поставки входят несколько файлов *.MUS, содержащих музакальные фрагменты. В процессе проигрывания мелодий эмулятор приостанавливает учет использования процессорного времени (см. запросы ВПО TIMON, TIMOFF). Для удобства кодирования мелодий, как отмечалось выше, используется язык MML. На этом языке мелодия задается в текстовом представлении в виде последовательности строк. Мелодией называется звуковая последовательность, в которой все три голоса одновременно начинаются и одновременно завершаются. Мелодия записывается тройками строк: 1─ая строка управляет первым голосом, 2─я ─ вторым, 3─я ─ третьим. Если один из голосов не должен участвовать в мелодии, то ему должны соответствовать пустые строки. Аппаратно все три голоса звукогенератора эквивалентны. Для целей удобства (если мелодия длинная), то она может быть продолжена на следующих трех строках и т.д. Команда компилятору MML имеет следующий формат СSI: .R MML *SND,LST=MUS или .MML SND,LST=MUS или .MML MUS SND,LST где MUS ─ спецификация входного файла с описаниями мелодий на языке MML; тип файла по умолчанию ─ .MUS; SND ─ спецификация выходного файла, который будет содержать описание мелодий во внутреннем формате; тип файла по умолчанию ─ .SND; LST ─ спецификация выходного файла, который будет содержать листинг с ошибками, обнаруженными в процессе трансляции; тип файла по умолчанию ─ .LST. При описании мелодий на языке MML используются следующие односимвольные команды: A─G ─ играет указанную ноту (С ─ до, D ─ ре, E ─ ми, F ─ фа, G ─ соль, A ─ ля, B ─ си) в текущей (предварительно выбранной) октаве; R ─ задает музыкальную паузу; + ─ увеличивает высоту звучания ноты (за которой следует +) на полтона; соответствует диезу; ─ ─ уменьшает высоту звучания ноты (за которой следует ─) на полтона; соответствует бемолю; . ─ увеличивает длительность ноты на половину; после ноты может указываться несколько точек; On ─ устанавливает в качестве текущей октаву #т; всего доступны октавы с номерами 1─7 (по умолчанию 4); Ln ─ задает длительность для следующих нот; фактическая длитель─ ность определяется как 1/n; следующая таблица поясняет задание длительности: L1 ─ целая нота L2 ─ половина ноты L3 ─ одна третья ноты L4 ─ одна четвертая ноты L5 ─ одна пятая ноты L6 ─ одна шестая ноты ... L64 ─ одна шестьдесят четвертая ноты длительность ноты может следовать непосредственно за самой нотой; в этом случае длительность задается только для ноты, за которой она следует; например, A16 эквивалентно L16A; по умолчанию используется длительность L4; если за нотой (или нотой с числовым аргументом) стоят одна или более точек, то каждая точка увеличивает длительность звучания ноты на половину от первоначальной длительности; например, С4... ─ будет длиться 1/4+3/8; Tn ─ задает темп проигрывания мелодии; т ─ количество четвертей в минуту; может принимать значения 32─255; по умолчанию значение т принимается равным 120; Vn ─ задает громкость звучания; т может принимать значения 1─16; по умолчанию используется значение 8; Mn ─ задает период огибающей в тиках (т.е. 1/50 секунды); т может принимать значения 1─255; Sn ─ задает номер формы огибающей; допустимые значения для номера огибающей 1─7; по умолчанию не используется ни одна из огибающих; имеются следующие формы огибающих: ( ╠══╣ ─ период огибающей) ├──┤ ├──┤ ╮ ╭╯│ ╰─────────────────────────────┤(1) ╯ └───────────────────────────┤(2) ├───┤ ├───┤ ╮ ┌───────────────────────────┤(3) ╭────────────────────────────┤(4) ╰╮│ ╭╯ ├───┤ ├───┤ ╭╮ ╭╮ ╭╮ ╭╮ ╭╮ ╮ │╮ │╮ │╮ │╮ │╮ │╮ ╭╯ ╰╮╭╯ ╰╮╭╯ ╰╮╭╯ ╰╮╭╯ ╰╮ ╰╮│ ╰╮│ ╰╮│ ╰╮│ ╰╮│ ╰╮│ ╰╮ (5) (6) ├───┤ ├────┤ ╭│ ╭│ ╭│ ╭│ ╭│ ╮ ╭╮ ╭╮ ╭╮ ╭╮ ╭╯ │╭╯ │╭╯ │╭╯ │╭╯ │ ╰╮╭╯ ╰╮╭╯ ╰╮╭╯ ╰╮╭╯ ╰╮ (7) (8) Команды, используемые при описании мелодий во внутреннем формате (коды команд ─ восьмеричные): 200 ─ устанавливает в качестве текущей октаву #n; 201 ─ задает громкость звучания; 202 ─ задает период огибающей в тиках; 203 ─ задает номер формы огибающей; 210 ─ переключение на канал #0; 211 ─ переключение на канал #1; 212 ─ переключение на канал #2; Во внутреннем представлении (файл .SND) признаком конца мелодии служат два байта, содержащих код 0. Перед командами переключения на какой─либо канал должен стоять байт, содержащий код 0. Байт, задающий ноту, имеет следующую структуру: 7 6 5 4 3 2 1 0 ╔═╦═╦═╦═╦═╦═╦═╦═╗ ║0║0║0║$║ ║ ║ ║ ║ ╚═╩═╩═╩═╩═╩═╩═╩═╝ │└───┬───┘ │ └──── код ноты в соответствии с таблицей └────── 0 ─ за нотой следует один байт длительности 1 ─ за нотой следуют два байта длительности (длительность в тиках) таблица кодирования нот Программный доступ к эмулятору осуществляется с помощью двух регистров (эмулятор может работать с прерываниями): SNCSR (176240) ─ регистр состояния звукогенератора; SNBUF (176242) ─ буферный регистр звукогенератора; SNVEC ═ 154 ─ вектор прерывания звукогенератора. ╔═══════════════════════╦══╦══╦══╦═════╦════════╗ SNCSR ║15 14 13 12 11 10 9 8║ 7║ 6║ 5║ 4 3║ 2 1 0║ ╚═══════════════════════╩══╩══╩══╩═════╩════════╝ │ │ │ └───┬──┘ │ │ │ #3 #2 #1 │ │ │ (R/W) └ 0 ─ продолжить │ │ │ 1 ─ приостановить │ │ │ звучание соответствующего │ │ │ голоса │ │ └──── (R/O) ─ 0 ─ идет проигрывание │ │ 1 ─ внутренний буфер │ │ пуст │ └───── (R/W) 0 ─ запретить прерывания │ 1 ─ разрешить прерывания │ при установке в 1 │ разряда 7 └───── (R/O) 0 ─ внутренний буфер заполнен 1 ─ во внутреннем буфере есть свободное место ╔═══════════════════════╦═══════════════════════╗ SNBUF ║15 14 13 12 11 10 9 8║ 7 6 5 4 3 2 1 0║ ╚═══════════════════════╩═══════════════════════╝ └──────────┬──────────┘ └┤в младший байт регистра заносится очередной байт управляющей информации для эмулятора Драйвер SN.SYS позволяет упростить использование звукогенера─ тора в прикладных программах, в том числе написанных на языках высокого уровня. Для этой цели необходимо "открыть файл" на физическое устройство с именем "SN:" и обычными операторами (процедурами) записи вывести на это устройство мелодию (во внутреннем формате). Драйвер SN.SYS позволяет также использовать обычные системные программы для проигрывания мелодий, например, для того чтобы прослушать мелодию, находящуюся в файле MUSIC1.SND, достаточно воспользоваться следующей командой монитора: .COPY MUSIC1.SND SN: