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