Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Инструкция пользователю по работе с программой ⇐ ПредыдущаяСтр 3 из 3
Эта инструкция предназначена для программы 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; Просмотров: 154; Нарушение авторского права страницы