Справочник программиста на персональном компьютере фирмы IBM. Таймеры и звук - Создание плавного перехода тонов
ОГЛАВЛЕНИЕ
2.2.7 Создание плавного перехода тонов.
Плавные переходы тонов производятся за счет непрерывного изме-
нения частоты. Этого можно достигнуть как в Бейсике, так и прог-
раммируя на низком уровне. Этот звуковой эффект можно сделать
более выразительным, если немного уменьшать длительность каждого
сегмента тона при повышении звука или слегка увеличивать длитель-
ность при понижении.
Высокий уровень.
В Бейсике надо просто поместить оператор SOUND [2.2.2] в цикл,
используя очень малые длины тонов. При каждом новом проходе цикла
надо увеличивать частоту. Смотрите [2.2.8], где приведен пример
использования оператора PLAY для более быстрых переходов.
100 FOR N = 1 TO 500 STEP 15
110 SOUND 400 + N,1
120 NEXT
Низкий уровень.
Проще всего использовать метод генерации звука, управляемый
микросхемой интерфейса с периферией 8255. Просто меняйте значение
бита 1 порта B между 0 и 1, используя для отсчета времени пустой
цикл, как показано в [2.2.2]. При начале каждого нового пустого
цикла, засчет засылки значения в CX, слегка изменяйте это значе-
ние. Здесь тон повышается:
;---запрет микросхемы таймера
PB EQU 61H ;адрес порта B микросхемы 8255
IN AL,PB ;получаем из него байт
OR AL,1 ;сбрасываем бит 0
OUT PB,AL ;возвращаем байт в порт
;---установка частоты и длительности звука
MOV BX,9000 ;начальное значение счетчика
MOV DX,3000 ;длительность звука 3000 циклов
REPEAT: ;сюда возвращаемся после цикла
;---установка бита динамика
OR AL,00000010B ;устанавливаем бит 1
OUT PB,AL ;посылаем байт в порт B
MOV CX,BX ;установка счетчика для 1/2 цикла
CYCLE1: LOOP CYCLE1 ;пустой цикл на 1000 повторов
;---сброс бита динамика
AND AL,11111101B ;сбрасываем бит 1
OUT PB,AL ;посылаем байт в порт
MOV CX,BX ;установка счетчика
CYCLE2: LOOP CYCLE2 ;пустой цикл
;---переход к следующему циклу
DEC BX ;увеличиваем частоту, уменьшая
DEC BX ;счетчик
DEC DX ;уменьшаем оставшуюся длительность
JNZ REPEAT ;если DX не 0, то новый цикл
Этот простой метод приводит к тому, что высокие тона проходят
значительно быстрее, чем низкие. Для коротких интервалов такой
эффект может быть желательным, а когда он не нужен, надо добавить
код, который при повышении тона пересылает в DX большие значения
на следующем цикле.