Подача звуковых сигналов




Звуковые процедуры 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 (окончание)

Вообще говоря, встроенный в ПЭВМ «слабенький» одноголосый динамик можно «заставить» играть джаз и говорить на сносном русском языке. Но это делается с помощью специальных программ, а вручную вряд ли возможно. Зато ввести в программу нехитрые мотивы можно, зная ноты и их частотные эквиваленты в герцах.

Мы предоставляем заинтересованному читателю поупражняться в программировании и написать программу составления таблицы нот по рабочей формуле (в терминах Турбо Паскаля):

VAR

Hz: Word;

OKT: Integer;

NOTA: Byte;

Hz:=Round(440 * Exp(Ln(2) * (OKT - (10 - NOTA)/12)));

Здесь OKT — номер одной из восьми октав, покрывающих диапазон от 32 Гц до почти 8 кГц. Самая низкотональная октава в таком диапазоне имеет отрицательный номер (-3) и дальнейшая нумерация соответственно будет -2, -1, 0, 1,..., +4. Параметр NOTA — это номер ноты в октаве: «До» --> 1, «До-диез» --> 2, «Ре» --> 3,.... «Си» --> 12. {341}

Использование встроенного таймера

Процедура Delay (ms: Word) программирует паузу в ms миллисекунд. Обычное место процедуры Delay — рядом с оператором Sound или после операторов вывода рекламной или аварийной информации. Не стоит только использовать ее для очень точных отсчетов времени — реальная задержка может отличаться на несколько процентов от заказанной.

Опрос клавиатуры

15.4.7.1. Функция KeyPressed. Эта функция возвращает логическое значение True, если в буфере ввода с клавиатуры имеется хотя бы один символ, и False, если буфер пуст.

Когда программа стартует, буфер обычно пуст. Но любое нажатие клавиши (кроме клавиши регистров Ctrl, Shift, Alt и переключателей типа NumLock, CapsLock и т.п.) занесет ее код в буфер. Коды в буфере будут храниться до тех пор, пока они либо не будут считаны, либо буфер не будет очищен самой программой.

Очищают буфер полностью процедуры Read и ReadLn, а также операция Reset над файлом, связанным с консолью. Вообще говоря, процедуры Read и ReadLn получают ввод с клавиатуры через еще один специальный буфер. (Этим, кстати, и объясняется ограничение в 126 символов для одной вводимой строки — такова емкость буфера строки.)

Имеется еще одна функция, очищающая буфер клавиатуры — ReadKey. Но в отличие от Read и ReadLn, которые очищают весь буфер после своей работы, ReadKey как бы «вынимает» последовательно введенные в него символы по одному за каждое обращение.

Мы неспроста дали такое подробное описание механизма работы буфера ввода с клавиатуры. Ведь самое естественное место логической функции KeyPressed — в опросе состояния клавиатуры:

if KeyPressed then Действие;

и очень заманчиво использовать ее как флаг факта нажатия клавиши. Но такая трактовка не всегда корректна. Функция KeyPressed является флагом не только сиюминутного нажатия, но и нажатий вообще во время работы программы. Так, если пользователь заденет несколько клавиш во время «молчаливого» счета своей задачи, то внешне ничего не произойдет. Но буфер запомнит все, что было «введено», и функция KeyPressed совершенно резонно не захочет работать так, как от нее ожидалось бы. {342}

Чтобы узнать, как очистить буфер перед опросом и как опрашиватъ клавиатуру в реальном времени, мы должны рассмотреть вторую функцию работы с клавиатурой.

15.4.7.2. Функция опроса ReadKey. Пользователь может считать, что эта функция опрашивает клавиатуру, но программист обязан знать, что на самом деле эта функция опрашивает буфер ввода с клавиатуры со всеми рассмотренными выше последствиями и особенностями.

Функция возвращает всегда один символ, т.е. одно значение типа Char. Есть две важные особенности:

1) полученные функцией символы никогда не отражаются на дисплее, т.е. ввод символа происходит вслепую;

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

Используя эти особенности, можно построить несколько довольно полезных конструкций, что мы и сделаем в качестве иллюстрации (переменная Ch должна быть типа Char):

while KeyPressed do ch:=ReadKey; { очистка буфера ввода }

repeat until KeyPressed; { ожидание нажатия любой клавиши }

Последний цикл завершится, когда в буфер попадет какой-либо символ. Программа должна в конце очистить буфер, иначе все, что накопилось в буфере, вывалится в строку MS-DOS или в редактор среды программирования.

Тех, кто не нашел ответы на свои вопросы в этом разделе, мы просим обратиться к гл. 21 «Как осуществить полный доступ к клавиатуре», где рассмотрены примеры разделения функциональных и символьных кодов, опрос регистров и многое другое.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: