(C) WLODEK BLACK
ПРОСТОЙ ПРОИГРЫВАТЕЛЬ
МЕЛОДИЙ С ИНДИКАТОРОМ
УРОВНЯ СИГНАЛА
Программируемый генератор звука AY-3-8910 (далее AY) содержит
множество внутренних регистров, назначение которых я не стану
здесь описывать, так как об этом рассказано в инструкции к ком-
пьютеру. Любой проигрыватель мелодий, созданный с помощью музы-
кальных редакторов Sound Tracker, Pro Tracker, ASC Sound Master
и т.п., обращается к AY каждую 1/50 секунды (по прерываниям)
(это не относится к "цифровой" музыке Digital Studio и т.п.;
там принцип совершенно иной), определенным образом настраивая
его, после чего тот до следующего перепрограммирования работает
сам, генерируя звуковые сигналы. Программирование AY, в частнос-
ти, задает уровень сигнала в каждом из каналов A,B и C. Регист-
ры AY, предназначенные для записи всевозможных управляющих наст-
роек, доступны и для чтения. Благодаря этому программа пользова-
теля может "узнать" текущую громкость звучания, просто опросив
регистры громкости. Это действительно самый простой способ полу-
чения информации об уровне сигнала, к тому же он не привязан к
какому-либо конкретному виду проигрывателя музыки.
За уровень сигнала отвечают регистры 8,9 и 10 (#A) - соответ-
ственно для каналов A,B и C. Строго говоря, не только они опре-
деляют уровень звучания - можно, например, вообще запретить ра-
боту любого канала. Однако в реальных мелодиях обычно задейство-
ваны все три канала. Громкость определяется битами 0,1,2 и 3 ре-
гистра громкости. Бит 4 задает управление модуляцией звука, но
его значением можно пренебречь. Используемые в "демо" индикато-
ры уровня несут чисто художественный смысл, и пренебрежение не-
которыми параметрами AY вполне допустимо - как говорится, "лишь
бы прыгало". :-)
Чтобы узнать значение какого-либо регистра AY, нужно вначале
занести номер регистра в порт 65533 (#FFFD), а затем прочитать
из этого же порта.
Ниже приводится текст программы-индикатора с простейшим вызо-
вом проигрывателя мелодий, созданных в ASC Sound Master. Адрес
компиляции предполагается 49152.
; Простой проигрыватель ASM мелодий.
START CALL INIT1
;-
PLLOOP EI
HALT
PLAY0 CALL 49166 ; проигрывание мелодии по прерываниям
XOR A ; 0 - канал A
CALL PLAY
LD A,1; 1 - канал B
CALL PLAY
LD A,2; 2 - канал C
CALL PLAY
XOR A
IN A,(#FE) ; это просто опрос клавиатуры
CPL
AND #1F
JR Z,PLLOOP
CALL 49169 ; заглушение AY
EI
RET
;-
PLAY LD E,A ; отсюда начинается собственно индикатор.
ADD A,8 ; прибавляем 8 к номеру канала для получения
номера регистра
LD BC,65533
OUT (C),A ; записываем номер регистра
IN A,(C) ; читаем регистр
AND 15 ; маскируем лишние биты
LD HL,OLDS ; проверка на предыдущее значение
LD D,0
ADD HL,DE
CP (HL)
JR NC,PLAY1
LD A,(HL)
DEC A ; плавное уменьшение показаний индикатора
при резком спадании уровня звука
PLAY1 LD (HL),A
LD B,A
INC B
LD IX,VBASE ; процедура рисования "столбиков"
L1 LD L,(IX+0)
INC IX
LD H,(IX+0)
INC IX
ADD HL,DE
LD (HL),#7E
DJNZ L1
L2 LD L,(IX+0)
INC IX
LD H,(IX+0)
INC IX
LD A,L
OR H
RET Z
ADD HL,DE
LD (HL),0
JR L2
;-
INIT1 CALL 49163 ; инициализация проигрывателя
LD A,2
CALL #1601
XOR A
LD (23659),A
LD DE,AMPTXT
LD BC,AMPTXE-AMPTXT
CALL #203C ; печать на экране поля под "столбики"
LD A,2
LD (23659),A
RET
;-
VBASE
DEFW 22496,21984,21472,20960 ; адреса видеопамяти
DEFW 22464,21952,21440,20928
DEFW 22432,21920,21408,20896
DEFW 22400,21888,21376,20864
DEFW 0,0
;-
AMPTXT DEFB 22,20,0,16,4,17,0,32,32,32 ; "текст" поля для
DEFB 13,32,32,32; "столбиков".
DEFB 13,32,32,32
DEFB 13,32,32,32
DEFB 22,0,0
AMPTXE
;-
OLDS DEFB 0,0,0 ; переменные - предыдущие значения гром-
кости в каналах.
;-
END
...Конечно, это дело вкуса, но лично мне не нравится, когда при
резком спадании уровня сигнала так же резко спадает индикатор.
Чтобы увеличить, как говорят, "время обратного хода" индикатора,
я решил запоминать предыдущее значение уровня. Если при очеред-
ном опросе регистра громкости обнаружится, что уровень стал мен-
ьше более чем на единицу, то индикатор "откатится" только на
единицу. Таким образом, полное время обратного хода от максима-
льного уровня 15 до нуля составит 15/50=0.3 секунды, что хорошо
различается визуально и не раздражает, как резкое мелькание.
Вспомните, как работают индикаторы уровня записи в магнитофонах:
их стрелки или светящиеся полоски быстро реагируют на увеличе-
ние уровня сигнала (время интеграции), но обратно откатываются
гораздо медленнее (время обратного хода).
Мой индикатор вы могли видеть в некоторых простеньких поздра-
вительных демках - слева внизу прыгают три столбика зеленого
цвета.
Посмотрите, как в данной программе опрашивается AY. А художе-
ственную часть индикатора вы сможете сами сделать так, как поже-
лаете!