Разработка синтезатора звука в среде визуального программирования Delphi. Программная реализация - Курсовая работа

бесплатно 0
4.5 176
Разработка программы генератора звука в среде Borland Delphi с использованием стандартных классов TMemoryStream (для хранения звука в виде бинарных данных) и TStrings (для хранения характеристик конкретной частоты). Запись звука в файл (форматы).

Скачать работу Скачать уникальную работу

Чтобы скачать работу, Вы должны пройти проверку:


Аннотация к работе
В узком смысле под звуком имеют в виду эти колебания, рассматриваемые по отношению к тому, как они воспринимаются органами чувств животных и человека. Как и любая волна, звук характеризуется амплитудой и спектром частот. Звук характеризуется частотой (f), обычно измеряемой в герцах, т.е. количеством колебаний в секунду, и амплитудой (у). Колебания с частотой менее 20 Гц называются инфразвуком, колебания с частотой более 20 КГЦ - ультразвуком. Суть метода генерации состоит в следующем: в текстовом виде хранятся характеристики конкретной частоты (длина волны, частота и т.д.)в формате TFREQOBJ, затем создается экземпляр класса TWAVEFORMATEX (он предназначен для приведения звуковой информации в понятный аудиоплате вид), этот класс заполняется информацией о звуке и затем в него добавляется сгенерированная в зависимости от характеристик конкретной частоты информация (грубо говоря, звук в виде бинарных данных) и отсылается функцией PLAYSOUND на аудиоплату.В ходе выполнения курсового проекта были изучены основы программирования для работы со звуком: изучены основные понятия, некоторые классы для работы со звуком, а также использование потоков в создаваемом приложении.Скриншот работы программыprocedure LOADSOUND(name:string); begin with WAVEFORMATEX do begin for j:=0 to freqlist.count-1 do if TFREQOBJ(freqlist.objects[j])nil then with TFREQOBJ(freqlist.objects[j]) do begin if ftemp>sampdiv2 then freqerror:=true; for j:=0 to freqlist.count-1 do if TFREQOBJ(freqlist.objects[j])nil then with TFREQOBJ(freqlist.objects[j]) do begin if ftemp< sampdiv2 then begin ptspercycle:=samplerate/Ftemp; with listbox1 do if items.count>0 then begin for i:=0 to items.count-1 do if checked[i] then freqlist.addobject(items[i],items.

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

Как и любая волна, звук характеризуется амплитудой и спектром частот. Обычно человек осознает колебания, передаваемые по воздуху, в диапазоне частот от 16-20 Гц до 15-20 КГЦ. Звук ниже диапазона слышимости человека называют инфразвуком; выше: до 1 ГГЦ, - ультразвуком, от 1 ГГЦ - гиперзвуком.

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

Среди слышимых звуков следует особо выделить фонетические, речевые звуки и фонемы (из которых состоит устная речь) и музыкальные звуки (из которых состоит музыка).

Различают продольные и поперечные звуковые волны в зависимости от соотношения направления распространения волны и направления механических колебаний частиц среды распространения.

В своем проекте я подробно рассмотрю генерацию звуковых волн и создание собственного источника (генератора звука) с помощью средства разработки Delphi.

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

1. Основные сведения о генераторе звука

Источниками звука могут стать любые явления, вызывающие местное изменение давления или механическое напряжение. Широко распространены источники звука в виде колеблющихся твердых тел (например, диффузоры громкоговорителей и мембраны телефонов, струны и деки музыкальных инструментов; в ультразвуковом диапазоне частот - пластинки и стержни из пьезоэлектрических материалов или магнитострикционных материалов). Источниками звука могут служить и колебания ограниченных объемов самой среды (например, в органных трубах, духовых музыкальных инструментах, свистках и т.п.).

Чистый звуковой тон представляет собой звуковую волну, подчиняющуюся синусоидальному закону: у = , где - максимальная амплитуда синусоиды;

- частота ( = );

- количество колебаний упругой среды в секунду ( );

- период;

- время (параметрическая переменная).

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

Для монотонного звука (меандр.) характерно постоянство амплитуды во времени.

Затухающие звуковые колебания характеризуются уменьшением амплитуды с течением времени.

Человек воспринимает механические колебания частотой 20 Гц - 20 КГЦ (дети - до 30 КГЦ) как звуковые. Колебания с частотой менее 20 Гц называются инфразвуком, колебания с частотой более 20 КГЦ - ультразвуком. Для передачи разборчивой речи достаточен диапазон частот от 300 до 3000 Гц.

Если несколько чистых синусоидальных колебаний смешать, то вид колебания изменится - колебания станут несинусоидальными.

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

Основная гармоника имеет частоту, и амплитуду а1; вторая гармоника - частоту f2 и амплитуду а2; третья гармоника соответственно f3 и a3.

Причем f1а2>а3,При бесконечном количестве таких гармоник образуется периодический сигнал, состоящий из прямоугольных импульсов.

На слух всякое отклонение от синусоиды приводит к изменению звучания. В IBM PC источником звуковых колебаний является динамик (PC Speaker), воспроизводящий частоты приблизительно от 2 до 8 КГЦ. Для генерации звука в PC Speaker используются прямоугольные импульсы.

Синусоидальные сигналы в ЭВМ можно получить только с помощью специальных устройств - аудиоплат.

1.1 Частотный синтез

Многоголосый частотный синтезатор предназначен для генерации звуковых сигналов сложной формы. Существуют два принципиально различных способа синтеза звуковых сигналов: частотный синтез (FM - Fregueney Modulation);

волновой синтез (WS - Ware Synthesys).

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

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

Впервые о применении частотной модуляции для синтеза звука задумался в 1966 году американец John Chowning , в будущем директор Центра компьютерных исследований музыки и акустики (CCRMA) Стенфордского университета, а на тот момент времени - преподаватель композиции кафедры электронной музыки.

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

2. Технология разработки генератора звука

Я разработал программу генератор звука в среде Borland Delphi с использованием стандартных классов TMEMORYSTREAM (для хранения звука в виде бинарных данных) и TSTRINGS (для хранения характеристик конкретной частоты). Также описал новый класс TFREQOBJ и использовал достаточно нестандартный класс TWAVEFORMATEX для хранения формата аудиоданных.

При запуске пользователь может настроить громкость и частоту звука, также он должен выбрать качество звука и время проигрывания в миллисекундах (0 - зациклить). После нажатия кнопки “Старт” пользователь услышит синусоидальный звук соответствующей громкости и частоты.

Сейчас я подробно опишу используемые классы, а в дальнейшем подробно разберу процедуру MAKECOMPLEXSOUND.

2.1 Класс TFREQOBJ

Я создал класс TFREQOBJ для удобства хранения и последующего использования характеристик частоты звука, таких, как: - максимальная амплитуда синусоиды;

- частота ( = );

- количество колебаний упругой среды в секунду ( ).

Также в нем описан простейший конструктор с параметрами и функция приведения всех параметров в одну форматированную строку.

2.2 Класс TWAVEFORMATEX

Для хранения информации об аудиоданных мы будем использовать класс TWAVEFORMATEX. Структура TWAVEFORMATEX определена следующим образом: typedef struct

{

WORD WFORMATTAG;

WORD NCHANNELS;

DWORD NSAMPLESPERSEC;

DWORD NAVGBYTESPERSEC;

WORD NBLOCKALIGN;

WORD WBITSPERSAMPLE;

WORD CBSIZE;

} WAVEFORMATEX;

Описание полей следующее: WFORMATTAG указывает тип аудиоданных. Нас интересуют только несжатые аудио-данные (PCM), поэтому для нас нужно чтобы тут было значение 0x0001 (то есть 1).

NCHANNELS определяет количество каналов.

NSAMPLESPERSEC определяет норму отбора в секунду. Обычно используется значение 44100 Гц.

NAVGBYTESPERSEC чаще всего определяет среднюю скорость передачи байтов в секунду.

NBLOCKALIGN определяет выравнивание в байтах.

WBITSPERSAMPLE определяет количество бит для выборки. Обычно равно 8 либо 16.

CBSIZE определяет размер всей структуры WAVEFORMATEX. Что в итоге равняется 18 байтам.

3 Алгоритмы и программная реализация генератора звука

Суть метода генерации состоит в следующем: в текстовом виде хранятся характеристики конкретной частоты (длина волны, частота и т.д.)в формате TFREQOBJ, затем создается экземпляр класса TWAVEFORMATEX (он предназначен для приведения звуковой информации в понятный аудиоплате вид), этот класс заполняется информацией о звуке и затем в него добавляется сгенерированная в зависимости от характеристик конкретной частоты информация (грубо говоря, звук в виде бинарных данных) и отсылается функцией PLAYSOUND на аудиоплату.

3.1 Процедура MAKECOMPLEXSOUND

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

Заполнение формата TWAVEFORMATEX: with WAVEFORMATEX do begin

WFORMATTAG := WAVE_FORMAT_PCM;

NCHANNELS := Mono;

NSAMPLESPERSEC := SAMPLERATE;

WBITSPERSAMPLE := $0008;

NBLOCKALIGN := (NCHANNELS * WBITSPERSAMPLE) div 8;

NAVGBYTESPERSEC := NSAMPLESPERSEC * NBLOCKALIGN;

CBSIZE := 0;

end;

Заполнение объекта типа TMEMORYSTREAM для последующего его отправления в процедуру PLAYSOUND: MS[n] := TMEMORYSTREAM.Create;

with MS[n] do begin

DATACOUNT := (Duration * SAMPLERATE) div 1000;

RIFFCOUNT := Length(WAVEID) Length(FMTID) SIZEOF(DWORD)

SIZEOF(TWAVEFORMATEX) Length(DATAID) SIZEOF(DWORD) DATACOUNT;

Write(RIFFID[1], 4); // "RIFF"

Write(RIFFCOUNT, SIZEOF(DWORD)); // file data size

Write(WAVEID[1], Length(WAVEID)); // "WAVE"

Write(FMTID[1], Length(FMTID)); // "fmt "

TEMPINT := SIZEOF(TWAVEFORMATEX);

Write(TEMPINT, SIZEOF(DWORD)); // TWAVEFORMAT data size

Write(WAVEFORMATEX, SIZEOF(TWAVEFORMATEX)); // WAVEFORMATEX record

Write(DATAID[1], Length(DATAID)); // "data"

Write(DATACOUNT, SIZEOF(DWORD)); // sound data size minfreq:=TFREQOBJ(freqlist.objects[0]).ftemp;

maxval:=0;

freqerror:=false;

sampdiv2:=samplerate div 2;

for i := 0 to trunc(2/minfreq*samplerate) do begin soundvalue:=0;

for j:=0 to freqlist.count-1 do if TFREQOBJ(freqlist.objects[j])nil then with TFREQOBJ(freqlist.objects[j]) do begin if ftemp>sampdiv2 then freqerror:=true;

w := 2 * Pi * Ftemp;

ph:=p/pi;

SOUNDVALUE:=soundvalue trunc(Volume*a/1000*sin(ph i*w/SAMPLERATE);

end;

If soundvalue>maxval then maxval:=soundvalue;

end;

for i := 0 to DATACOUNT - 1 do begin soundvalue:=127;

for j:=0 to freqlist.count-1 do if TFREQOBJ(freqlist.objects[j])nil then with TFREQOBJ(freqlist.objects[j]) do begin if ftemp< sampdiv2 then begin ptspercycle:=samplerate/Ftemp;

if j=0 then setlength(imagedata,min(datacount,trunc(5*ptspercycle)));

x:=frac(i/ptspercycle p/360);

amp:=a/1000 ;

w := 2 * Pi * Ftemp;

ph:=p/pi;

SOUNDVALUE:=soundvalue trunc(Volume*amp*sin(ph i*w / SAMPLERATE));

end;

end;

if maxval>127 then byteval:=soundvalue*127 div maxval else byteval:=soundvalue;

Write(Byteval, SIZEOF(Byte));

If i<=high(imagedata) then imagedata[i]:=byteval;

end;

end;

3.2 Запись звука в файл

Получившийся звук можно записать в файл формата .WAV. Создавая поток для проигрывания нашей волны, мы уже задали в самом его начале формат данных, все характеристики нашей звуковой волны, то есть мы имеем заголовок и собственно звуковую волну в виде потока данных. Класс TMEMORYSTREAM, которым мы пользуемся для хранения потока в памяти, содержит метод SAVETOFILE. С помощью данного метода мы сохраняем наш поток в файл формата .WAV длиной в 1 секунду. Данный файл может быть воспроизведен в любом проигрывателе.

Ниже представлен код процедуры записи звука в файл: procedure TFORM1.Button1Click(Sender: TOBJECT);

begin программа генератор звук if Button1.Caption="Запись в файл" then begin

PLAYBTN.Click;

Button1.Caption:="Сохранить";

end else if Button1.Caption="Сохранить" then begin

PLAYSOUND(nil,0,SND_Purge);

playing:=false;

if SAVEDIALOG2.Execute then begin ms[streaminuse].SAVETOFILE(SAVEDIALOG2.FILENAME);

Button1.Caption:="Запись в файл";

if assigned (ms[streaminuse]) then freeandnil(Ms[streaminuse]);

end;

end;

end;

Вывод
В ходе выполнения курсового проекта были изучены основы программирования для работы со звуком: изучены основные понятия, некоторые классы для работы со звуком, а также использование потоков в создаваемом приложении. В качестве примера полученных навыков было разработано приложение “Генератор звука”.

Разработанное приложение состоит из следующих основных классов: TFREQOBJ, TMEMORYSTREAM, TWAVEFORMATEX; также был использован модуль MMSYSTEM. Класс TFREQOBJ хранит в себе характеристики конкретной частоты, TMEMORYSTREAM используется для хранения аудиоданных в бинарном виде для последующего воспроизведения, а TWAVEFORMATEX - для хранения формата аудиоданных и таких его характеристик, как качество звуки и типа данных.

Результат работы может использоваться на любом ПК для создания и изучения синусоидального звука.

Список литературы
Википедия - свободная энциклопедия // URL: https://www.wikipedia.org

GAMEDEV.ru - крупнейший ресурс в России о создании компьютерных игр // URL: https://www.gamedev.ru

Soundcoding.ru - программирование звука в среде Windows // URL: https://www.soundcoding.ru

Кинтцель, Т. Руководство программиста по работе со звуком / Т. Кинтцель. - М.: ДМК, 2000. - 432 с.

Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность
своей работы


Новые загруженные работы

Дисциплины научных работ





Хотите, перезвоним вам?