Литература. 1. В. Б. Попов. Turbo Pascal для школьников.
2. В. П. Леонтьев. Новейшая энциклопедия ПК 2003 г. «ОЛМА ПРЕСС», 2003 г.
3. О. Ефимов, В Морозов, Ю. Шафрин. Курс компьютерной технологии (уч. пособие для старших классов). «Финансы и статистика», 2002 г.
Модуль Graph
Генерация звука в модуле Crt
1. Общие сведения. Для создания звуковых эффектов в Паскале используются стандартные процедуры Sound, NoSound и Delay модуля Crt.
Sound(I:word) – активизирует звуковые средства персонального компьютера. Целочисленное значение I указывает частоту звучания звука в герцах. Звук указанной частоты будет генерироваться до тех пор, пока на будет отменен процедурой NoSound.
Для указания времени, в течение которого будет продолжаться звучание, используется процедура Delay.
Пример. Звуковой сигнал с частотой 500 Гц будет звучать в течение 2 с (2000 мс).
Program Primer;
Uses Crt;
Begin
Sound(500);
Delay(2000);
NoSound;
End.
С помощью указанных трёх процедур и операторов цикла можно создать самые разнообразные звуковые эффекты: звучание сирены, метронома, будильника, пение птиц, фрагменты музыкальных произведений и т. д. Звуковым сигналом можно сопровождать вывод информации, например, заставок, подсказок, сообщений об ошибках. Звук можно использовать в качестве дополнительного средства контроля решения задачи на персональном компьютере (сопровождение этапов выполнения программы).
Для создания разнообразных звуковых эффектов используется набор частот или элементы массива, соответствующие нотам различных октав (см. табл.).
Нота
Большая октава
Малая октава
Первая октава
Вторая октава
До
130,81
261,63
523,25
1046,50
Ре
146,83
293,66
587,33
1174,07
Ми
164,81
329,63
659,26
1318,05
Фа
174,61
349,23
698,46
1396,09
Соль
196,00
392,00
784,99
1568,00
Ля
220,00
440,00
880,00
1760,00
Си
246,94
493,88
987,77
1975,00
Для использования в процедуре Sound все указанные в таблице значения частот округляются.
2. Генерация мелодий. Одним из способов построения мелодичных звуковых рядов является использование частот, соответствующих нотам. Частоты загружаются в один массив, продолжительность звучания каждой ноты – в соответствующие элементы другого массива.
Пример
Программа, генерирующая гамму с нарастающей продолжительностью звучания каждой ноты.
Program Gamma; {заголовок программы}
Uses Crt; {подключение модуля Crt}
Const {объявление констант – массивов}
M : Array[1..7] of Integer = (262, 294, 330, 349, 392, 440, 494); {массив нот}
T : Array[1..7] of Integer = (100, 110, 120, 130, 140, 150, 160); {массив длительностей}
Var i:Integer; {объявление переменной}
Begin
While not KeyPressed {пока не нажата любая клавиша,}
Do Begin
For i:=1 to 7 {воспроизводим гамму из семи нот,}
Do Begin {каждая из которых имеет свою}
Sound(M[i]); {длительность}
Delay(T[i]);
NoSound;
End;
End;
End. {конец программы}
Меняя значения элементов массивов М и Т, можно добиться довольно хорошей имитации музыкальных произведений.
Пример
Воспроизведение музыкальной гаммы с полутонами на 4 октавы.
Program Gamma;
Uses Crt;
Const {объявление констат}
F:array[1..12] of Real = (130.8, 138.6, 146.8, 155.6, 164.8, 174.6, 185.0, 196.0, 207.7, 220.0, 233.1, 246.9); {массив полутонов для одной октавы}
Temp = 150; {длительность каждой ноты}
Var
i, j : Integer; {объявление переменных – параметров циклов}
Begin {вывод гаммы с нарастающей частотой}
For i:=0 to 3 {i – счетчик октав}
Do For j:=1 to 12 {j – счетчик нот-полутонов}
Do Begin {при переходе от одной октавы к соседней}
Sound(Round(F(j)*(1 shl i))); {частоты изменяются в два раза,}
Delay(Temp); {поэтому исходные частоты самой низкой}
NoSound; {октавы надо умножать на 2 j, а степени}
End; {числа 2 получаются сдвигом 1 влево на j разрядов}
For i:=3 downto 0 {вывод гаммы с убывающей частотой звука}
Do For j:=12 downto 1
Do Begin
Sound(Round(F(j)*(1 shl i)));
Delay(Temp);
NoSound;
End;
End.
Пример
Требуется вывести в центр экрана элемент заставки «Добрый день!» в сопровождении звукового сигнала.
Program ZvukOut;Uses Crt;Var St : string[40];I : Byte;BeginClrscr;St:=’Д О Б Р Ы Й Д Е Н Ь ! ! !’;GotoXY(18,12);For I:=1 to Length(St)Do BeginWrite(St[I]);Sound(5000);Delay(70);NoSound;End;End.