Справочник программиста на персональном компьютере фирмы 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 большие значения
на следующем цикле.