Звуковые процедуры Sound ( Hz : Word ) и Nosound дают доступ к встроенному динамику ПЭВМ. Процедура Sound включает звук с заданной частотой тона в герцах. После включения звука программа выполняется дальше. Более того, если сама программа «забудет» выключить звук, то придется добавлять к ней в конец оператор NoSound под непрекращающийся аккомпанемент динамика. Набор звуковых команд всегда должна завершать процедура NoSound, выключающая динамик, хотя вызовов процедур Sound может быть сколько угодно. В таком случае звук не будет прекращаться, но будет менять свою частоту согласно заданным аргументам. Можно, например, в начало каждой процедуры поставить команду Sound с различными частотами. Тогда при работе программа будет издавать трели.
Очень часто процедуры Sound и NoSound используются вместе с процедурой задержки времени Delay(ms). Например, строка программы
Sound(300); Delay (1000); NoSound;
издает ровный звук на частоте 300 Гц продолжительностью 1 с. Но при этом во время звучания программа будет «стоять».
В качестве примера приведем несложную процедуру печати строк в звуковом сопровождении (рис. 15.15):
USES CRT;
{Процедура звуковой печати строк }
PROCEDURE SoundType( X, Y: Byte; S; String; ms: Word );
CONST
Hz = 50; {частота тона }
VAR i : Byte;{параметр цикла}
BEGIN
Dec(X);
for i:=1 to Lengh(S) do begin
Sound(Hz); Delay(ms); {первый сигнал }
GotoXY(X+i, Y); Write(S[i]); {печать символа }
Sound(2*Hz); Delay(ms); {второй сигнал }
Nosound {снятие звука }
end {for}
END;
BEGIN{--ПРИМЕР ВЫЗОВА--}
ClrScr;
SoundType(20, 10, ‘0123456789abcdeedcba9876543210’, 40);
Readln {пауза до нажатия клавиши ввода }
END.
Рис. 15.15 {339}
Если разделять вызовы Sound с разными частотами небольшими задержками, то можно «синтезировать» довольно сложные звуки. Интересные примеры этого приводятся в учебной программе Turbo Pascal Tutor фирмы Borland International. Некоторые из них приведены на рис. 15.16.
PROGRAM Sounds; { Демонстрация звуковых эффектов }
USES CRT;
{ -- ПРОЦЕДУРЫ СИНТЕЗА ЗВУКОВ — }
PROCEDURE Phone; { телефонный сигнал }
VAR i : Word;
BEGIN
Repeat { Цикл: }
for i:=1 to 100 do begin { собственно сигнал }
Sound(1200); Delay(10); NoSound
end;
Delay(800) { задержка 0,8 с }
until KeyPressed { выход - после нажатия клавиши }
END;
PROCEDURE Bell; { резкий звук }
BEGIN
Repeat { начало цикла показа }
Sound(1800); Delay(2);
Sound(2000); Delay(2);
Sound(2200); Delay(2);
Sound(2400); Delay(2)
until KeyPressed; { выход - после нажатия клавиши }
NoSound { отключение звучания }
END;
PROCEDURE Sirena; { имитация сигнала тревоги }
VAR i : Word;
BEGIN
Repeat { основной цикл }
for i := 400 to 800 do begin { восходящие тона }
Sound( i ); Delay( 3 ) end;
for i := 800 downto 400 do begin { нисходящие тона }
Sound( i ); Delay( 3 )
end;
NoSound { отключение звучания }
until KeyPressed { выход - после нажатия клавиши }
END;
Рис. 15.16 {340}
PROCEDURE Pause; { очистка буфера клавиатуры и пауза }
VAR
ch : Char;
BEGIN
While KeyPressed do ch:=ReadKey; { очистка буфера } Delay( 200 ) { задержка 0,2 с }
END;
BEGIN {=== основная часть ===}
ClrScr;
Write('Нажмите любую клавишу'#10#10#13);
{ Вызовы процедур - "исполнителей": }
Write('Звук телефона'#13);
Phone;
Pause;
Write(' Звук зуммера '#13); Bell; Pause;
Write(' Звук сирены '#13); Sirena;
Pause;
ClrScr
END.
Рис. 15.16 (окончание)
Вообще говоря, встроенный в ПЭВМ «слабенький» одноголосый динамик можно «заставить» играть джаз и говорить на сносном русском языке. Но это делается с помощью специальных программ, а вручную вряд ли возможно. Зато ввести в программу нехитрые мотивы можно, зная ноты и их частотные эквиваленты в герцах.
Мы предоставляем заинтересованному читателю поупражняться в программировании и написать программу составления таблицы нот по рабочей формуле (в терминах Турбо Паскаля):
Здесь OKT — номер одной из восьми октав, покрывающих диапазон от 32 Гц до почти 8 кГц. Самая низкотональная октава в таком диапазоне имеет отрицательный номер (-3) и дальнейшая нумерация соответственно будет -2, -1, 0, 1, ..., +4. Параметр NOTA — это номер ноты в октаве: «До» --> 1, «До-диез» --> 2, «Ре» --> 3, .... «Си» --> 12. {341}