Аппаратное обеспечение IBM PC



         

Таймер и музыка - часть 3


cnt = 1193180L / freq;

// Загружаем регистр счетчика таймера - сначала // младший, затем старший байты

outp(0x42, cnt & 0x00ff);

outp(0x42, (cnt &0xff00) >> 8);

// Включаем громкоговоритель. Сигнал от // канала 2 таймера теперь будет проходить // на вход громкоговорителя.

outp(0x61, inp(0x61) | 3);

// Выполняем задержку.

tm_delay(time);

// Выключаем громкоговоритель.

outp(0x61, inp(0x61) & 0xfc);

}

Если подготовить для этой функции таблицы частот и длительностей, то можно с ее помощью проигрывать простейшие мелодии. В следующем примере мы так и поступили:

#include <stdio.h> #include <conio.h> #include "sysp.h"

void main(void); void sound(int, int);

// Массив частот для мелодии

int mary[] = { 330, 294, 262, 294, 330, 330, 330, 294, 294, 294, 330, 392, 392, 330, 294, 262, 294, 330, 330, 330, 330, 294, 294, 330, 294, 262, 0 };

// Массив длительностей

int del[] = { 5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 5, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 20 };

void main(void) {

int i;

for(i=0 ;mary[i] != 0 ;i++) tm_sound(mary[i], del[i]);

}

Запускайте эту программу и слушайте, как она работает!

Для подготовки таблиц частот по нотам вам помогут учебники по элементарной теории музыки и следующая таблица, в которой приведены частоты для второй октавы. Для других октав при понижении или повышении тона значения частот надо умножать (при повышении тона) или делить (при понижении тона) на 2.

Нота Частота, Гц

До 261,7 До-диез 277,2

Ре 293,7 Ре-диез 311,1

Ми 329,6

Фа 349,2 Фа-диез 370,0

Соль 392,0 Соль-диез 415,3

Ля 440,0 Ля-диез 466,2

Си 493,9

Приведем еще одну программу, генерирующую звук без использования таймера. Эта программа формирует импульсы при помощи манипуляций с разрядом 1 порта 61h:

#include <stdio.h> #include <conio.h>

#define FREQUENCY 200 #define CYCLES 10000

void main(void);

void main(void) {

int cnt;

// Во время генерации звука прерывания должны // быть запрещены.

_disable();

_asm {




Содержание  Назад  Вперед