С для профессиональных программистов

Создание "космической музыки".


Соединив воедино произвольное количество стандартных функций Си rend() и sound(), вы создадите "космическую" музыку. Звук, получаемый при выполнении программы, представленной ниже, напоминает "музыку звезд" в старых научно-фантастических фильмах. Несмотря на то, что все звуки генерируются произвольным образом, ритм и рисунок мелодии, возникающие время от времени, действительно оставляют впечатление "небесной музыки".

/* Космическая музыка звезд */

#define DELAY 64000

#include "dos.h"

void sound();

main()

int freq;

do

do

freq = rand();

 while (freq>5000); /* после персонального

прослушивания */ sound(freq);

 while (!kbhit());



/* звучание динамика на специфицированной частоте */

void sound(freq)

int freq;

unsigned i;

union

long divisor;

unsigned char c[2];

 count;

unsigned char p;

count.divisor = 1193280 / freq; /* вычисление нужного

значения счетчика */ outportb(67,182); /* обращение к таймеру 8253 после

определения значения счетчика */ outportb(66,count.c[0]); /* пересылка младшего байта */ outportb(66,count.c[1]); /* пересылка старшего байта */

p = inportb(97); /* чтение существующего шаблона бит */

outportb(97,p|3); /* установка бит 0 и 1 */

for (i = 0;i<DELAY;++i); /* задержка 64000 для 10+ Мгц

компьютеров

32000 для 6 МГц PC/AT

20000 для стандарта PC и XT */

outportb(97,p); /* восстановление начального вида

шаблона бит для отключения динамика */

Эта программа генерирует звуки частотой менее 5000 Гц, так как звуки именно в пределах этой частоты наиболее мягко воспринимаются слухом и не выходят за границы, воспринимаемые ухом человека.

Рекомендуем вам поэкспериментировать с этой программой, установив произвольную длину интервала времени между звуками или фильтруя значения, передаваемые в sound(). Возможны и другие варианты развития вашего творчества.



Содержание раздела