Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Инструкция пользователю по работе с программой



 

Эта инструкция предназначена для программы zvuko_zapis, который наглядно показан в приложении В (стр. 23). Для начала, чтобы получить работоспособную программу надо её текст вставить в Турбо Паскаль и откомпилировать её и она (наша программа) сохранится там, где сохранён исходник программы. Далее у нас появится екзешник (т.е. файл с расширением.EXE) – это и есть наша программа. Теперь осталось её запустить. После запуска наша программа будет иметь такой вид:

 

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

18

изм лист № докум Подпись Дата

 

 

 

Тут с её использованием всё просто. Если имеется микрофон, то можно сразу записывать звук нажав на кнопку «Запись», который выделен красным цветом. Кнопка «Start» предназначена для воспроизведения записанного звука. Кнопка «Stop» останавливает запись и подготавливает его для воспроизведения.

Записанный звук сохраняется под расширением.WAV. Кнопка «Входы» предназначен для приёма и показа звука с одного из входов. Звук показывается на рабочей области программы кривыми линиями. Кривые линии - это диапазон звука.

 

Выполнил

 Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

19

изм лист № докум Подпись Дата

 

 

Заключение

 

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

В этой курсовой работе мы описали в основном 3 программы: speaker1, speaker2 и zvuko_zapis.

В основу разработанной программы звука на языке Турбо Паскаль заложена программа speaker1 предназначенная для генерации последовательности прямоугольных звуковых импульсов и его улучшенный вариант - программа speaker2. Учтено, что манипуляции с мышью не должно приводить к прерывистому звучанию динамика, и использовано вещественное значение частоты, а также программа zvuko_zapis, предназначенный для записи звука и приёма и показа звука с одного из входов.

Также рассмотрена работа DirectShow, для чего он предназначен и как он воспроизводит видео форматы.

Рассмотрев много языков программирования, которые позволяют осуществлять программирование звука и видео, мы остановили свой выбор на языке Турбо Паскаль.

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

 

Выполнил

 Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   0 7.12.09.

 

20

изм Лист № докум Подпись Дата

  Приложения

                                                                                          Приложение А

Текст программы speaker 1

 

Листинг:

 

  Program speaker 1;

  Uses crt;

  Const

           Speaker_port = %61;

  Var

           Portval: byte;

 

  Begin

           Portval: = port[speaker_port] and $FC;

           While not KeyPressed do

begin

                     Port[speaker_port]: = portval or 2;

                     Delay(5);

                     Port[speaker_port]: = portval;

Delay(5);

           End;

           ReadKey;

  End.

 

Выполнил

 Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г. К.   0 7.12.09.

 

21

изм лист № докум Подпись Дата

 

                                                                Приложение Б

Текст программы speaker 2

Листинг:

 

Program speaker 2;

Uses crt;

Const

  Speaker_port = $61;

  Pit_control = $42;

  Pit_channel_2 = $42;

  Pit_freq = $1224dd;

Procedure sound (frequency: word);

Var

  Counter: word;

Begin

  Counter: = pit_freq div frequency;

Port[pit_control]: = $b6;

Port[pit_channel_2]: = lo(counter);

  Port[pit_channel_2]: = hi(counter);

Port[speaker_port]: = port[speaker_port] or 2;

  End;

  Procedure nosound;

  Begin

           Port[speaker_port]: = port[speaker_port] and $fc;

  End;

  Begin

           Sound(200);

Repeat until keypressed;

  Nosound;

End.

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

22

изм лист № докум Подпись Дата

 

Приложение В

Текст программы

Листинг:

 

unit zvuko_zapis;

 

interface

 

uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ExtCtrls, ComCtrls, MMSystem, Buttons;

 

type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Label1: TLabel;

Image1: TImage;

Button2: TButton;

Label2: TLabel;

BitBtn1: TBitBtn;

CheckBox1: TCheckBox;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

procedure Button2Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

private

{ Private declarations }

public

procedure OnWaveIn(var Msg: TMessage); message MM_WIM_DATA;

{ Public declarations }

end;

 

TData16 = array [0..127] of smallint;

PData16 = ^TData16;

tWaveFileHdr = packed record

riff: array[0..2] of Char;

len: DWord;

cWavFmt: array[0..7] of Char;

dwHdrLen: DWord;

wFormat: Word;

wNumChannels: Word;

dwSampleRate: DWord;

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

23

изм лист № докум Подпись Дата

 

  Продолжение Приложения В

dwBytesPerSec: DWord;

wBlockAlign: Word;

wBitsPerSample: Word;

cData: array[0..2] of Char;

dwDataLen: DWord;

end;

const BufSize=11000; { Размер буфера на 1 сек}

 

var

Form1: TForm1;

 

implementation

 

var

WaveIn: hWaveIn;

hBuf: THandle;

BufHead: TWaveHdr;

m: array[1..bufSize] of smallInt;

h, w, h2: integer;

zs: boolean=false; //запущен звук

//Для записи в wav

rec: boolean=false; //идет запись

mz: array of smallInt;

waveHdr: tWaveFileHdr;

qz: integer; //записано звука;

 

{$R *.DFM}

 

PROCEDURE iniWav;

begin

WaveHdr.riff: ='RIFF';

WaveHdr.cWavFmt: ='WAVEfmt ';

WaveHdr.dwHdrLen: =16;

WaveHdr.wFormat: =1;

WaveHdr.wNumChannels: =1;

WaveHdr.dwSampleRate: =11000;

WaveHdr.wBlockAlign: =4;

WaveHdr.dwBytesPerSec: =22000;

WaveHdr.wBitsPerSample: =16;

WaveHdr.cData: ='data';

WaveHdr.dwDataLen: =qz*2;

end;

 

 

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

24

изм лист № докум Подпись Дата

 

Продолжение Приложения В

procedure TForm1.Button1Click(Sender: TObject);

var

 header: TWaveFormatEx;

 BufLen: word;

 buf: pointer;

 

begin

if zs then exit;

 with header do begin

wFormatTag: = WAVE_FORMAT_PCM;

nChannels: = 1;     // количество каналов

nSamplesPerSec: = 11000; // частота

wBitsPerSample: = 16; // бит на отсчет

nBlockAlign: = nChannels * (wBitsPerSample div 8);

nAvgBytesPerSec: = nSamplesPerSec * nBlockAlign;

cbSize: = 0;

 end;

WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header), Form1.Handle, 0, CALLBACK_WINDOW);

 BufLen: = header.nBlockAlign * BufSize;

 hBuf: = GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen);

 Buf: = GlobalLock(hBuf);

 with BufHead do begin

lpData: = Buf;

dwBufferLength: = BufLen;

dwFlags: = WHDR_BEGINLOOP;

 end;

 WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead));

 WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));

 zs: =true;

 WaveInStart(WaveIn);

End;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

if not zs then Exit;

WaveInReset(WaveIn);

WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead));

WaveInClose(WaveIn);

GlobalUnlock(hBuf);

GlobalFree(hBuf);

zs: =false;

end;

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

25

изм лист № докум Подпись Дата

 

Продолжение Приложения В

 

procedure TForm1.OnWaveIn;

var

 data16: PData16;

 i, d, z, s, x, y, xx, max, s0: integer;

begin

//сразу пустим запись дальше чтоб не прерывалась

WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam), SizeOf(TWaveHdr));

data16: = PData16(PWaveHdr(Msg.lParam)^.lpData);

 

//перепишем звук из массива в который пишется

//в массив который обрабатывается чтоб запись его не портила

move(data16^[0], m, BufSize*2);

if data16^[0]< > m[1] then showMessage('Не успела');

 

//Обработка звука

s: =0;

s0: =0;

max: =0;

for i: = 1 to BufSize do begin

z: =m[i];

inc(s0, z);

z: =abs(z);

inc(s, z);

if z> max then max: =z;

end;

 

//показ звука

s: =s div bufSize;

s0: =s0 div bufSize;

label1.caption: ='Среднее: '+intToStr(s)+

       ', Максимум: '+intToStr(max)+

       ', Постоянный уровень: '+intToStr(s0);

 

with form1.image1.Picture.Bitmap.canvas do begin

fillRect(rect(0, 0, w, h));

pen.color: =$CCCCCC; moveTo(w, h2); lineTo(0, h2);

pen.color: =0;

 

max: =abs(max-abs(s0));

if max< 16 then max: =16;

if checkBox1.checked then d: =BufSize else d: =w;

for x: =1 to w do begin

xx: =x*BufSize div d;

 

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

26

изм лист № докум Подпись Дата

Продолжение Приложения В

y: =h2+(m[xx]-s0)*h2 div max;

if x=1 then moveTo(0, y) else lineTo(x, y);

end;

end;

if rec then begin

//запись в массив для файла

setLength(mz, qz+bufSize+1);

move(m[1], mz[qz+1], BufSize*2);

inc(qz, BufSize);

form1.label2.caption: ='Записано '+formatFloat('0.00', qz*2/1000000)+' мб';

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

w: =image1.width;

h: =image1.height;

h2: =h div 2;

image1.Picture.Bitmap.width: =w;

image1.Picture.Bitmap.height: =h;

Form1.Button1Click(Sender);

end;

 

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

Form1.Button2Click(Sender)

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

winExec('SndVol22.exe /r', SW_SHOW);

end;

 

procedure TForm1.BitBtn1Click(Sender: TObject);

var fw: file;

begin

if rec then begin

rec: =false;

if qz> 0 then begin

//вывод в файл wav

iniWav;

assignFile(fw, 'sound.wav');

rewrite(fw, 1);

blockWrite(fw, waveHdr, sizeOf(waveHdr));

Выполнил

 Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

27

изм лист № докум Подпись Дата

 

Продолжение Приложения В

 

blockWrite(fw, mz[1], qz*2);

closeFile(fw);

showMessage('Записано в " sound.wav" ');

label2.visible: =false;

BitBtn1.caption: ='Запись';

end;

end

else begin

qz: =0;

rec: =true;

label2.visible: =true;

BitBtn1.caption: ='Стой';

end;

end;

 

end.

 

const BufSize=11000; { Размер буфера на 1 сек}

var

Form1: TForm1;

 

implementation

 

var

WaveIn: hWaveIn;

hBuf: THandle;

BufHead: TWaveHdr;

m: array[1..bufSize] of smallInt;

h, w, h2: integer;

zs: boolean=false; //запущен звук

//Для записи в wav

rec: boolean=false; //идет запись

mz: array of smallInt;

waveHdr: tWaveFileHdr;

qz: integer; //записано звука;

 

{$R *.DFM}

PROCEDURE iniWav;

begin

WaveHdr.riff: ='RIFF';

WaveHdr.cWavFmt: ='WAVEfmt ';

WaveHdr.dwHdrLen: =16;

WaveHdr.wFormat: =1;

 

Выполнил

 Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

28

изм лист № докум Подпись Дата

         

Продолжение Приложения В

 

WaveHdr.wNumChannels: =1;

WaveHdr.dwSampleRate: =11000;

WaveHdr.wBlockAlign: =4;

WaveHdr.dwBytesPerSec: =22000;

WaveHdr.wBitsPerSample: =16;

WaveHdr.cData: ='data';

WaveHdr.dwDataLen: =qz*2;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

 header: TWaveFormatEx;

 BufLen: word;

 buf: pointer;

begin

if zs then exit;

 with header do begin

wFormatTag: = WAVE_FORMAT_PCM;

nChannels: = 1;     // количество каналов

nSamplesPerSec: = 11000; // частота

wBitsPerSample: = 16; // бит на отсчет

nBlockAlign: = nChannels * (wBitsPerSample div 8);

nAvgBytesPerSec: = nSamplesPerSec * nBlockAlign;

cbSize: = 0;

 end;

 WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header), Form1.Handle, 0, CALLBACK_WINDOW);

 BufLen: = header.nBlockAlign * BufSize;

 hBuf: = GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen);

 Buf: = GlobalLock(hBuf);

 with BufHead do begin

lpData: = Buf;

dwBufferLength: = BufLen;

dwFlags: = WHDR_BEGINLOOP;

 end;

WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead));

 WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));

 zs: =true;

 WaveInStart(WaveIn);

End;

procedure TForm1.Button2Click(Sender: TObject);

begin

if not zs then Exit;

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

29

изм лист № докум Подпись Дата

 

Продолжение приложения В

 

WaveInReset(WaveIn);

WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead));

WaveInClose(WaveIn);

GlobalUnlock(hBuf);

GlobalFree(hBuf);

zs: =false;

end;

 

procedure TForm1.OnWaveIn;

var

 data16: PData16;

 i, d, z, s, x, y, xx, max, s0: integer;

begin

//сразу пустим запись дальше чтоб не прерывалась

WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam), SizeOf(TWaveHdr));

data16: = PData16(PWaveHdr(Msg.lParam)^.lpData);

 

//перепишем звук из массива в который пишется

//в массив который обрабатывается чтоб запись его не портила

move(data16^[0], m, BufSize*2);

if data16^[0]< > m[1] then showMessage('Не успела');

 

//Обработка звука

s: =0;

s0: =0;

max: =0;

for i: = 1 to BufSize do begin

z: =m[i];

inc(s0, z);

z: =abs(z);

inc(s, z);

if z> max then max: =z;

end;

//показ звука

s: =s div bufSize;

s0: =s0 div bufSize;

label1.caption: ='Среднее: '+intToStr(s)+

       ', Максимум: '+intToStr(max)+

       ', Постоянный уровень: '+intToStr(s0);

with form1.image1.Picture.Bitmap.canvas do begin

fillRect(rect(0, 0, w, h));

pen.color: =$CCCCCC; moveTo(w, h2); lineTo(0, h2);

pen.color: =0;

 

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

30

изм лист № докум Подпись Дата

 

Продолжение приложения В

 

max: =abs(max-abs(s0));

if max< 16 then max: =16;

if checkBox1.checked then d: =BufSize else d: =w;

for x: =1 to w do begin

xx: =x*BufSize div d;

y: =h2+(m[xx]-s0)*h2 div max;

if x=1 then moveTo(0, y) else lineTo(x, y);

end;

end;

 

if rec then begin

//запись в массив для файла

setLength(mz, qz+bufSize+1);

move(m[1], mz[qz+1], BufSize*2);

inc(qz, BufSize);

form1.label2.caption: ='Записано '+formatFloat('0.00', qz*2/1000000)+' мб';

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

w: =image1.width;

h: =image1.height;

h2: =h div 2;

image1.Picture.Bitmap.width: =w;

image1.Picture.Bitmap.height: =h;

Form1.Button1Click(Sender);

end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

Form1.Button2Click(Sender)

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

winExec('SndVol22.exe /r', SW_SHOW);

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

var fw: file;

begin

if rec then begin

rec: =false;

 

 

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

31

изм лист № докум Подпись Дата

 

Продолжение приложения В

 

if qz> 0 then begin

//вывод в файл wav

iniWav;

assignFile(fw, 'sound.wav');

rewrite(fw, 1);

blockWrite(fw, waveHdr, sizeOf(waveHdr));

blockWrite(fw, mz[1], qz*2);

closeFile(fw);

showMessage('Записано в " sound.wav" ');

label2.visible: =false;

BitBtn1.caption: ='Запись';

end;

end

else begin

qz: =0;

rec: =true;

label2.visible: =true;

BitBtn1.caption: ='Стой';

end;

end;

end.

Выполнил

Муханов А.   05.12.09.

КР 3706002 000009 ПЗ

лист

Проверила

Енсепова Г.К.   07.12.09.

 

32

изм лист № докум Подпись Дата

 

Приложение Г


Поделиться:



Последнее изменение этой страницы: 2020-02-16; Просмотров: 133; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.29 с.)
Главная | Случайная страница | Обратная связь