Разработка программы генератора звука в среде Borland Delphi с использованием стандартных классов TMemoryStream (для хранения звука в виде бинарных данных) и TStrings (для хранения характеристик конкретной частоты). Запись звука в файл (форматы).
При низкой оригинальности работы "Разработка синтезатора звука в среде визуального программирования Delphi. Программная реализация", Вы можете повысить уникальность этой работы до 80-100%
В узком смысле под звуком имеют в виду эти колебания, рассматриваемые по отношению к тому, как они воспринимаются органами чувств животных и человека. Как и любая волна, звук характеризуется амплитудой и спектром частот. Звук характеризуется частотой (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;
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;
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)));
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 с.
Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность своей работы