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