Глава 2. Таймеры и звук.
Раздел 2. Создание звука.
2.2.8 Создание звуковых эффектов.
Звуковые эффекты обычно достигаются непрерывным изменением частоты тона. Только PCjr достаточно хорошо оборудован для этой цели (см. обсуждение в {2.2.1}). Hа других машинах нельзя производить звуковые эффекты одновременно с другими операциями.
Hизкий уровень.
Любой из способов, показанных на Бейсике может быть реализован на ассемблере, хотя, как видно из предыдущих разделов, это требует затрат на программирование. Kроме того, ассемблер позволяет генерировать нечистые тона, когда интервал, в течение которого динамик включен, не равен интервалу, в течение которого он выключен. Такое нарушение симметрии может приводить к жужжащим и брякающим звукам. Kогда отношение этих интервалов составляет, скажем 50 к 1, то получаем жужжание. Если увеличить отношение еще в 10 - 20 раз, то жужжание переходит в отдельные брякающие звуки. В любом случае звук генерируется микросхемой интерфейса с периферией 8255, с помощью техники показанной в {2.2.2}. Вот пример жужжания:
NUMBER_CYCLES EQU 300 | ;число переключений динамика |
FREQUENCY1 EQU 50 | ;время, когда динамик включен |
FREQUENCY2 EQU 3200 | ;время, когда динамик выключен |
PORT_B EQU 61H | ;адрес порта B микросхемы 8255 |
CLI | ;запрет прерываний |
MOV DX,NUMBER_CYCLES | ;DX считает длину тона |
IN AL,PORT_B | ;получаем статус порта |
AND AL,11111110B | ;отключаем динамик от таймера |
NEXT_CYCLE: OR AL,00000010B | ;включаем динамик |
OUT PORT_B,AL | ;посылаем команду |
MOV CX,FREQUENCY1 | ;задержка для первой части |
FIRST_HALF: LOOP FIRST_HALF | ; |
AND AL,11111101B | ;выключаем динамик |
OUT PORT_B,AL | ;посылаем команду |
MOV CX,FREQUENCY2 | ;задержка для второй части |
SECND_HALF: LOOP SECND_HALF | ; |
DEC DX | ;уменьшаем число циклов |
JNZ NEXT_CYCLE | ;если 0, то пора кончать |
STI | ;разрешаем прерывания |
<~-2.2.7 Создание плавного перехода тонов.
Содержание
2.2.9 Одновременная генерация разных звуков.-~>