а допомогою спеціальних пристроїв - аудіоплат.
.1 Частотний синтез
Багатоголосий частотний синтезатор призначений для генерації звукових сигналів складної форми. Існують два принципово різних способу синтезу звукових сигналів:
частотний синтез (FM - Fregueney Modulation);
хвильової синтез (WS - Ware Synthesys).
Частотні синтезатори (модулятори) генерують звукові коливання синусоїдальної форми заданої частоти і амплітуди, завдяки чому значно поліпшується якість звуку (порівняно зі спробами генерувати звук за допомогою прямокутних коливань). Наявність декількох генераторів дозволяє використовувати ці пристрої для синтезу складних звукових сигналів, у тому числі мови.
Тембр звуку формується впливом однієї простої хвилі на іншу з метою зміни її частоти. Під воздейтсвия частотної модуляції виникають більш спектрально багаті і складні звуки, які неможливо отримати іншими типами синтезу.
Вперше про застосування частотної модуляції для синтезу звуку задумався в 1966 році американець John Chowning, в майбутньому директор Центру комп'ютерних досліджень музики і акустики (CCRMA) Стенфордського університету, а на той момент часу - викладач композиції кафедри електронної музики.
У своєму проекті я скористався методом генерації шляхом частотної модуляції, тому що він є досить ефективним і простим для реалізації, до того ж спектр звуків, створюваний за допомогою частотної модуляції, дійсно величезний.
2. Технологія розробки генератора звуку
Я розробив програму генератор звуку в середовищі Borland Delphi з використанням стандартних класів TMemoryStream (для зберігання звуку у вигляді бінарних даних) і TStrings (для зберігання характеристик конкретної частоти). Також описав новий клас TFreqObj і використовував досить нестандартний клас TWaveFormatEx для зберігання формату аудіоданих.
При запуску користувач може налаштувати гучність і частоту звуку, також він повинен вибрати якість звуку і час програвання в мілісекундах (0 - зациклити). Після натискання кнопки Старт користувач почує синусоїдальний звук відповідної гучності і частоти.
Зараз я детально опишу використовувані класи, а в подальшому детально розберу процедуру MakeComplexSound.
.1 Клас TFreqObj
Я створив клас TFreqObj для зручності зберігання і подальшого використання характеристик частоти звуку, таких, як:
- максимальна амплітуда синусоїди;
- частота (=);
- кількість коливань пружного середовища в секунду ().
Також в ньому описаний найпростіший конструктор з параметрами і функція приведення всіх параметрів в одну форматований рядок.
.2 Клас TWaveFormatEx
Для зберігання інформації про аудіо-даних ми будемо використовувати клас TWaveFormatEx. Структура TWaveFormatEx визначена наступним чином:
typedef struct
{wFormatTag; nChannels; nSamplesPerSec; nAvgBytesPerSec; nBlockAlign; wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
Опис полів наступне: вказує тип аудіо-даних. Нас цікавлять тільки нестислі аудіо-дані (PCM), тому для нас потрібно щоб тут було значення 0x0001 (тобто 1) Визначається кількість каналов.определяет норму відбору в секунду. Зазвичай використовується значення 44100 Гц.чаще всього визначає середню швидкість передачі байтів в секунду.определяет вирівнювання в байтах.определяет кількість біт для вибірки. Зазвичай одно 8 або 16.определяет розмір всієї структури WAVEFORMATEX. Що в підсумку дорівнює 18 байтам.
3 Алгоритми і програмна реалізація генератора звуку
Суть методу генерації полягає в наступному: в текстовому вигляді зберігаються характеристики конкретної частоти (довжина хвилі, частота і т.д.) у форматі TFreqObj, потім створюється екземпляр класу TWaveFormatEx (він призначений для приведення звукової інформації в зрозумілий Аудіоплата вигляд), цей клас заповнюється інформацією про звук і потім в нього додається згенерувала залежно від характеристик конкретної частоти інформація (грубо кажучи, звук у вигляді бінарних даних) і відсилається функцією PlaySound на Аудіоплата.
3.1 Процедура MakeComplexSound
Дана процедура заповнює формат аудіоданих TWaveFormatEx, потім його заповнює спочатку необхідними низькими частотами (вони потрібні для коректного відтворення звуку), а потім даними в залежності від обраної користувачем частоти.
Заповнення формату TWaveFormatEx: WaveFormatEx do:=WAVE_FORMAT_PCM;:=Mono;:=SampleRate;:=$ 0008;:=(nChannels * wBitsPerSample) div 8;:=nSamplesPerSec * nBlockAlign; :=0;
end;
Заповнення об'єкта типу TMemoryStream для подальшого його відправлення в процедуру PlaySound:
MS [n]:=TMemoryStream.Create; MS [n] do:=(Duration * SampleRate) div 1000;:=Length (WaveId) + Length (FmtId) + SizeOf (DWORD) + (TWav...