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

Звуковые процедуры SOUND и NOSOUND дают доступ к встроенному динамику ПЭВМ. Процедура SOUND включает звук с заданной частотой тона в герцах. После включения звука программа продолжает выполняться и, если в программе выключение звука не предусмотрено, звуковой фон будет служить аккомпанементом выполняемых машиной команд. Набор звуковых команд всегда должен завершаться вызовом процедуры NOUSOUD, которая выключает динамик. Если знать частоты звучания музыкальных нот и использовать последовательность процедур SOUND с параметрами-частотами, соответствующими нотам, можно заставить динамик издавать мелодию. Часто процедуры SOUND и NOUSOUND используют вместе с процедурой задержки времени DELAY(ms). Например, последовательность операторов SOUND(500); DELAY(1000); NOUSOUD; вызовет звук на частоте 500 гц и продолжительностью 1 с. На рис 5 показана часть клавиатуры пианино, охватывающая две октавы (в октаве 8 нот) и указана частота звучания каждой ноты в герцах. Первая октава начинается с нижней ноты ДО и кончается на средней ноте ДО, а вторая начинается со средней ноты ДО и кончается на верхней ноте ДО.

ДО 130.8

ДО-ДИЕЗ, РЕ-БЕМОЛЬ 138.6

РЕ 146.8

РЕ-ДИЕЗ, МИ-БЕМОЛЬ 155.6

МИ 164.8

ФА 174.6

ФА-ДИЕЗ, СОЛЬ-БЕМОЛЬ 185.0

СОЛЬ 196.0

СОЛЬ-ДИЕЗ, ЛЯ-БЕМОЛЬ 207.7

ЛЯ 220.0

ЛЯ-ДИЕЗ, СИ-БЕМОЛЬ 233.1

СИ 246.9

Среднее ДО 261.7

ДО-ДИЕЗ, РЕ-БЕМОЛЬ 277.2

РЕ 293.7

РЕ-ДИЕЗ, МИ-БЕМОЛЬ 311.1

МИ 329.6

ФА 349.2

ФА-ДИЕЗ, СОЛЬ-БЕМОЛЬ 370.0

СОЛЬ 392.0

СОЛЬ-ДИЕЗ, ЛЯ-БЕМОЛЬ 415.3

ЛЯ 440.0

ЛЯ-ДИЕЗ, СИ-БЕМОЛЬ 466.2

СИ 493.9

ДО 523.3

В качестве примера приведём программу печати символов в звуковом сопровождении. Итак, организуем звучание нот и высвечивание символов (в качестве примера взят символ ‘*’) в зависимости от случайным образом выбранных значений координат и цвета символа.

Программа на Паскале:

Uses CRT;

Const pause=1000;

Var freq, color: integer;

Begin

Textbackground(black);

Clrscr;{очистить экран}

Randomize; {инициализация генератора случайных чисел}

While not keypressed do {организация цикла до нажатия клавиши}

Begin

Color:=random(8); {цвет символа в диапазоне 0-7}

Textcolor(color);

Gotoxy(random(80),random(25));

{место для размещения символа выбирается случайным образом}

Write(‘*’);

Case color of {выбор частоты звука по цвету символа}

0: frec:=262; {до}

1: frec:=294; {ре}

2: frec:=330; {ми}

3: frec:=349; {фа}

4: frec:=392; {соль}

5: frec:=440; {ля}

6: frec:=494; {си}

7: frec:=524; {до}

end; {case}

sound(freq); delay(pause); {озвучить}

nousound {отменить звук}

end {while}

end.

Здесь была использована стандартная функция Random(m) из стандартного модуля System. Функция может быть использована как функция без параметров, так и с параметрами. Функция Random(m) формирует случайное число целого или вещественного типа. Результат функции – значение в пределах от 0 до m, имеющее тип Word. Если параметр m не задан, результат функции будет иметь тип Real в пределах от 0.0 до 1.0.

Модуль Graph

Процедуры и функции

Процедура InitGraph. Инициирует графический режим работы адаптера. Заголовок процедуры:

Procedure InitGraph(var Driver,Mode: Integer; Path: String);

Здесь Driver - переменная типа Integer, определяет тип графического драйвера; Mode - переменная того же типа, задающая режим работы графического адаптера; Path - выражение типа String, содержащее имя файла драйвера и, возможно, маршрут его поиска.

К моменту вызова процедуры на одном из дисковых носителей информации должен находиться файл, содержащий нужный графический драйвер. Процедура загружает этот драйвер в оперативную память и переводит адаптер в графический режим работы. Тип драйвера должен соответствовать типу графического адаптера. Для указания типа драйвера в модуле предопределены следующие константы:

Таблица 18. Коды драйверов графических устройств

Имя Значение Назначение
Detect CGA MCGA EGA EGA64 EGAMono IBM8514 HercMono АТТ400 VGA PC3270 CurrentDriver 0 1 2 3 4 5 6 7 8 9 10 -128 Автоматический выбор драйвера Текущий драйвер

Таблица 17. Константы графических режимов модуля Graph

Имя Значение Размер поля Палитра Число страниц
АТТ400С0 АТТ400С1 АТТ400С2 АТТ400СЗ ATT400Med ATT400Hi CGAC0 CGAC1 CGAC2 CGAC3 CGAHi EGALo EGAHi EGA64LO EGA64Hi EGAMonoHi HercMonoHi IBM8514LO IBM8514Hi MCGAC0 MCGAC1 MCGAC2 MCGAC3 MCGAMed MCGAHi РС3270Hi VGALo VGAMed VGAHi 0 1 2 3 4 5 0 1 2 3 4 0 1 0 1 0 0 0 0 0 1 2 3 4 5 0 0 1 2 320x200 320x200 320x200 320x200 640x200 640x400 320x200 320x200 320x200 320x200 640x200 640x200 640x350 640x200 640x350 640x350 720x348 640x480 1024x768 320x200 320x200 320x200 320x200 640x200 640x480 720x350 640x200 640x350 640x480 С0 С1 С2 СЗ 2 цвета 2 цвета С0 C1 С2 С3 2 цвета 16 цветов 16 цветов 16 цветов 4 цвета 2 цвета 2 цвета 256 цветов 256 цветов С0 С1 С2 С3 2 цвета 2 цвета 2 цвета 16 цветов 16 цветов 16 цветов 1 1 1 1 1 1 1 1 1 1 1 4 2 1 1 1 или 2 2 1 1 1 1 1 1 1 4 2 1

Пусть, например, драйвер CGA.BGI находится в каталоге TP\BGI на диске С и устанавливается режим работы 320x200 с палитрой 2. Тогда обращение к процедуре будет таким:

Uses Graph;

var

Driver, Mode: Integer;

begin

Driver:= CGA;{Драйвер}

Mode:= CGAC2;{Режим работы}

InitGraph(Driver, Mode,' С:\TP\BGI');

.......

Если тип адаптера ПК неизвестен или если программа рассчитана на работу с любым адаптером, используется обращение к процедуре с требованием автоматического определения типа драйвера:

Driver:= Detect;

InitGraph(Driver, Mode, 'C:\TP\BGI');

После такого обращения устанавливается графический режим работы экрана, а при выходе из процедуры переменные Driver и Mode содержат целочисленные значения, определяющие тип драйвера и режим его работы. При этом для адаптеров, способных работать в нескольких режимах, выбирается старший режим, т.е. тот, что закодирован максимальной цифрой.

Процедура CloseGraph.

Завершает работу адаптера в графическом режиме и восстанавливает текстовый режим работы экрана. Заголовок:

Procedure CloseGraph;

Процедура RestoreCRTMode.

Служит для кратковременного возврата в текстовый режим. В отличие от процедуры CloseGraph не сбрасываются установленные параметры графического режима и не освобождается память, выделенная для размещения графического драйвера. Заголовок:

Procedure RestoreCRTMode;

Функция GetGraphMode.

Возвращает значение типа Integer, в котором содержится код установленного режима работы графического адаптера. Заголовок:

Function GetGraphMode: Integer;

Процедура SetGraphMode.

Устанавливает новый графический режим работы адаптера. Заголовок:

Procedure SetGraphMode(Mode: Integer);

Здесь Mode - код устанавливаемого режима.

Процедура DetectGraph.

Возвращает тип драйвера и режим его работы. Заголовок:

Procedure DetectGraph(var Driver,Mode: Integer);

Здесь Driver - тип драйвера; Mode - режим работы.

В отличие от функции GetGraphMode описываемая процедура возвращает в переменной Mode максимально возможный для данного адаптера номер графического режима.

Функция GetDriverName.

Возвращает значение типа String, содержащее имя загруженного графического драйвера. Заголовок:

Function GetDriverName: String;

Функция GetMaxMode.

Возвращает значение типа Integer, содержащее количество возможных режимов работы адаптера. Заголовок:

Function GetMaxMode: Integer;

Функция GetModeName.

Возвращает значение типа String, содержащее разрешение экрана и имя режима работы адаптера по его номеру. Заголовок:

Function GetModName(ModNumber: Integer): String;

Здесь ModNumber - номер режима.

Следующая программа после инициации графического режима выводит на экран строку, содержащую имя загруженного драйвера, а также все возможные режимы его работы.

Процедура GetModeRange.

Возвращает диапазон возможных режимов работы заданного графического адаптера. Заголовок:

Procedure GetModeRange(Drv: Integer; var Min, Max: Integer);

Здесь Drv - тип адаптера; Min - переменная типа Integer, в которой возвращается нижнее возможное значение номера режима; Мах - переменная того же типа, верхнее значение номера.

Если задано неправильное значение параметра Drv, процедура вернет в обеих переменных значение -1. Перед обращением к процедуре можно не устанавливать графический режим работы экрана.

Линии и точки

Процедура PutPixel.

Выводит заданным цветом точку по указанным координатам. Заголовок:

Procedure PutPixel(X,Y: Integer; Color: Word);

Здесь X, Y- координаты точки; Color - цвет точки.

Координаты задаются относительно левого верхнего угла окна или, если окно не установлено, относительно левого верхнего угла экрана.

Функция GetPixel.

Возвращает значение типа Word, содержащее цвет пикселя с указанными координатами. Заголовок:

Function GetPixel(X,Y: Integer): Word;

Здесь X, Y - координаты пикселя.

Процедура Line.

Вычерчивает линию с указанными координатами начала и конца. Заголовок:

Procedure Line(X1,Y1,X2,Y2: Integer);

Здесь XL..Yl - координаты начала (XI, Y1) и конца (Х2, Y2) линии.

Линия вычерчивается текущим стилем и текущим цветом

Процедура LineTo.

Вычерчивает линию от текущего положения указателя до положения, заданного его новыми координатами. Заголовок:

Procedure LineTo(X,Y: Integer);

Здесь X, Y - координаты нового положения указателя, они же - координаты второго конца линии.

Процедура LineRel.

Вычерчивает линию от текущего положения указателя до положения, заданного приращениями его координат. Заголовок:

Procedure LineRel (DX, DY: Integer);

Здесь DX, DY- приращения координат нового положения указателя. В процедурах LineTo и LineRel линия вычерчивается текущим стилем и текущим цветом.

Процедура SetLineStyle.

Устанавливает новый стиль вычерчиваемых линий. Заголовок:

Procedure SetLineStyle(Type,Pattern,Thick: Word)

Здесь Type, Pattern, Thick - соответственно тип, образец и толщина линии. Тип линии может быть задан с помощью одной из следующих констант:

const

SolidLn= 0; {Сплошная линия}

DottedLn= 1; {Точечная линия}

CenterLn= 2; {Штрих-пунктирная линия}

DashedLn= 3; {Пунктирная линия}

UserBitLn= 4; {Узор линии определяет пользователь}

Параметр Pattern учитывается только для линий, вид которых определяется пользователем (т.е. в случае, когда Туре = UserBitLn). При этом два байта параметра Pattern определяют образец линии: каждый установленный в единицу бит этого слова соответствует светящемуся пикселю в линии, нулевой бит - несветящемуся пикселю. Таким образом, параметр Pattern задает отрезок линии длиной в 16 пикселей. Этот образец периодически повторяется по всей длине линии.

Параметр Thick может принимать одно из двух значений:

const

NormWidth = 1; {Толщина в один пиксель}

ThickWidth = 3; {Толщина в три пикселя}

Отметим, что установленный процедурой стиль линий (текущий стиль) используется при построении прямоугольников, многоугольников и других фигур.

Процедура GetLineSettings.

Возвращает текущий стиль линий. Заголовок:

Procedure GetLineSettings(var Stylelnfo: LineSettingsType)

Здесь Stylelnfo - переменная типа LineSettingsType, в которой возвращается текущий стиль линий.

Тип LineSettingsType определен в модуле Graph следующим образом:

type

LineSettingsType = record

LineStyle: Word; {Тип линии}

Pattern: Word; {Образец}

Thickness: Word {Толщина}

end;

Процедура SetWriteMode.

Устанавливает способ взаимодействия вновь выводимых линий с уже существующим на экране изображением. Заголовок:

Procedure SetWriteMode(Mode);

Здесь Mode - выражение типа Integer, задающее способ взаимодействия выводимых линий с изображением.

Если параметр Mode имеет значение 0, выводимые линии накладываются на существующее изображение обычным образом (инструкцией МОV центрального процессора). Если значение 1, то это наложение осуществляется с применением логической операции XOR (исключительное ИЛИ): в точках пересечения выводимой линии с имеющимся на экране изображением светимость пикселей инвертируется на обратную, так что два следующих друг за другом вывода одной и той же линии на экран не изменят его вид.

Режим, установленный процедурой SetWriteMode, распространяется на процедуры Drawpoly, Line, LineRel, LineTo и Rectangle. Для задания параметра Mode можно использовать следующие определенные в модуле константы:

const

CopyPut = 0;{Наложение операцией MOV}

XORPut = 1;{Наложение операцией XOR}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: