Проигрывание музыки в фоновом режиме
Для проигрывания мелодии в фоновом режиме можно предложить следующий способ, основанный на использовании периодического прерывания от канала 0 таймера.
Основная идея заключается в использовании прерывания INT1Ch, которое вырабатывается таймером с частотой примерно 18,2 Гц. Ваш обработчик этого прерывания осуществляет контроль за выборкой нот из массива, содержащего мелодию, и программирование микросхемы 8254. Например, один раз в полсекунды обработчик проверяет, не пора ли прекратить звучание одной ноты и начать проигрывание следующей ноты. Если пора, он выключает громкоговоритель и перепрограммирует канал 8254 на новую частоту, соответствующую следующей ноте.
Основное преимущество использования таймера для проигрывания мелодии - независимость констант, используемых для программирвания канала таймера от производительности системы. Ваша мелодия будет звучать одинаково и на медленной IBM PC/XT и на совеменном компьютера с процессором Pentium, но при условии, что вы будете использовать таймер и для организации задержек при исполнении мелодии.
Для определения значения, которое должно быть записано в регистр счетчика канала 2 таймера, надо разделить число 1193180 на частоту ноты в герцах.
Для подготовки таблиц частот по нотам вам поможет список частот для нот второй октавы:
Нота | Частота, Гц | ||
До
| 261,7 | ||
До-диез | 277,2 | ||
Ре | 293,7 | ||
Ре-диез | 311,1 | ||
Ми | 329,6 | ||
Фа | 349,2 | ||
Фа-диез | 370,0 | ||
Соль | 392,0 | ||
Соль-диез | 415,3 | ||
Ля | 440,0 | ||
Ля-диез | 466,2 | ||
Си | 493,9 |
Для других октав при понижении или повышении тона значения частот надо умножать (при повышении тона) или делить (при понижении тона) на 2.