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. А художе-
ственную часть индикатора вы сможете сами сделать так, как поже-
лаете!





Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Программистам - Вывод трехсимвольных расширений файлов.
Lyrics - Он жрет мой мозг и травит душу, Он мир расскрасил в серый цвет.
Warez pack - новый софт: Аdventurer#10, Supaplex & Snake, DejaVu#08.

В этот день...   19 ноября