#define FREQPORT 66 /* порт регулирует частоту звука*/
#define BEEPPORT 97 /* порт управляет громкоговорителем */
#define ON 97 /* сигнал включения громкоговорителя */
tone(freq, time)
int freq, time;
{
int hibyt, lobyt, port;
long i, count, divisor;
divisor = FREQSCALE/freq; /* масштабирование частоты в единицах таймера */
lobyt = divisor % 256; /* разбивает целое */
hibyt = divisor / 256; /* на два байта */
count = TIMESCALE * time; /* преобразует время в единицы таймера */
outp(T_MODEPORT, TIMERMODE); /* подготавливает таймер к вводу */
outp(FREQPORT, lobyt); /* устанавливает младший байт регистра таймера */
outp(FREQPORT, hibyt); /* устанавливает старший байт регистра таймера */
port = inp(BEEPPORT); /* запоминает состояние порта */
outp(BEEPPORT, ON) /* включает громкоговоритель */
for(i = 0, i < count; i++)
; /* отметка задержки */
outp(BEEPPORT, port); /* выключает Громкоговоритель, восстанавливает состояние */
Мы определяем TIMESCALE в директиве #define как целое тип long, потому что вычисление TIMESCALE * time будет выполняться для типа long, а не int. Иначе результат, если он больше 32767 будет усекаться перед занесением в count.
Использование функции tоnе( )
Наша функция tone( ) в значительной степени дублирует действие оператора SOUND языка Бейсик для компьютера IBM PC Здесь мы используем ее для создания довольно ограниченной ( 8 нот, одна октава) клавиатуры, в которой используются 8 клавишей, начиная с А, для воспроизведения нот. Ниже приведена соответствующая программа, а также некоторые пояснения к ней.
/* простая музыкальная клавиатура */
#include /* использует небуфсризованный ввод-вывод */
#include
#define С 262 /* определяет частоты */
#define D 294
#define E 330
#define F 349
#define G 392
#define А 440
#define В 494
#define C2 524
main( )
{
int key, freq, tempo, time;
puts(" Введите, пожалуйста, основной темп: 10 = 1 с.");
scanf(" %d", &tempo);
printf(" %d \n \r", tempo); /* эхо-ввод */
puts(" Спасибо. Используйте клавиши а - k для воспроизведения нот.\n\r");
puts(" Клавиша переключения регистра удваивает продолжительность звучания.
Символ ! прекращает работу.");
while((key = getchar( )) != '!')
{ time = isupper(key)? 2 * tempo : tempo;
key = tolower(key);
switch (key) {
case 'a' : tone(C, time);
break;
case 's' : tone(D, time);
break;
case 'd' : tone(E, time);
break;
case 'f' : tone(E, time);
break;
case 'g' : tone(G, time);
break;
case 'h' : tone(A, time);
break;
case 'j' : tone(B, time);
break;
case 'k' : tone(C2, time);
break;
default : break; }
}
рuts("До свидания!\n\r");
} }
Главной особенностью созданной программы является оператор switch, который присваивает разные звуки восьми клавишам от А до К. Кроме того, программа удваивает продолжительность звучания ноты, если вы используете верхний регистр. Эта продолжительность (time) устанавливается перед оператором switch, затем верхний регистр переключается на нижний, чтобы сократить число необходимых меток.