Nicron
#28
03 апреля 1997 |
|
Программирование - простой проигрыватель мелодий с индикатором уровня сигнала.
(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. А художе- ственную часть индикатора вы сможете сами сделать так, как поже- лаете!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября