Основна теорія звуку та синтезу
Основи теорії звуку та синтезу.
Звук це те, що ви чуєте. Ви чуєте те, що фіксують ваші вуха, ваші вуха фіксують тонкі та швидкі зміни атмосферного тиску. Ці зміни тиску, або хвиль тиску, що циркулюють у повітрі, як правило, виникають внаслідок руху об'єктів або руху частин об'єктів. При русі предмета він починає, як би тиснути на повітря перед собою, що викликає хвилю тиску, яка поширюючись все далі стає дедалі слабшою. Це, по суті, те саме явище, яке можна спостерігати від бавовни руками по поверхні води.
Ці хвилі тиску можуть бути різної інтенсивності (наприклад звук, дуже гучні звуки можуть бути відчуті іншими частинами вашого тіла), і вони коливаються туди-сюди з тією ж швидкістю, з якою змусив їх об'єкт. Наші вуха можуть інтерпретувати звукові частоти в діапазоні від 20 Гц (герц) до 20000 Гц (або 20 кГц). Один герц відповідає одному поворотно-поступальному руху на секунду.
Один герц може бути створений від руху руки вперед, але він не проявитися як звук, так як наші вуха не можуть чути низькочастотні звуки. Рука, тим не менш, рухає повітря, яке можна легко відчути. Якби ви могли помахати рукою швидше, на більш ніж 20 поворотно-поступальних рухів за секунду, ви почуєте звук схожий на сильний бас.
Як приклад того, що ви справді можете почути, це звук шведського гудку, як правило, 440 Гц. Це означає, що об'єкт робить коливання туди сюди 440 разів на секунду, що досить швидко для повсякденного руху. Мабуть американський еквівалент є сумішшю 2 тонів 350 і 440 Гц, але результат все ж таки в тому ж діапазоні.

Як щодо синтезу звуку, як створити звук?
Таким чином, щоб створити звук нам потрібний рух об'єкта. Достатньо зручно, якщо об'єкти доступні і їх можна переміщати туди сюди довільним чином. Їх називають динаміками. Динамік заснований на електромагніті з рухомим конусом, таким чином, що при різному електричному сигналі, що на нього подається, конус слідуватиме за сигналом.
Традиційний спосіб створення звуків – це дублювання природних звуків. Це робиться за допомогою мікрофона, який, по суті, є динаміком навпаки, він генерує сигнал від звуків, що впливають на нього. Цей сигнал або зберігатиметься, або передається безпосередньо через підсилювач на одну або кілька колонок. Коли колонки отримують сигнал, вони рухаються також, як пересунулася мікрофонна мембрана (конус), коли він був схильний до оригінального звуку, так що кінцевий результат ще раз той же звук, але з невеликою тимчасовою затримкою і зміненим звуком (як правило, сильнішим).
Відтворення звуків природи це добре, але не те, що нам потрібне. Якщо ви потребуєте конкретного звуку, вам доведеться шукати його за допомогою генерації реальних фізичних процесів, що практично неможливо. Проте, звукові техніки старої школи у виробництві фільмів створили чудові роботи з практично фізичною генерацією звуку. Прикладом є звук лазерної TIE Fighter у "Зоряних війнах" (надлом металевого дроту) і гарчання T-Rex в "Парку Юрського періоду (великі транспортні машини). Очевидно, існує безліч інших ефектів, вибухи, шуми монстрів і, звичайно, найпопулярніші бійки на кулаках.
Зараз є зручні системи для створення звуку. Звукова карта комп'ютера має те, що називається цифро-аналоговий перетворювач (ЦАП), який здатний генерувати електричні сигнали із цифр, які йому дані. Номер повинен бути в межах певного діапазону, скажімо, -1,0 до 1,0 (з довільною точністю між ними). Як правило, нуль дає нам спокій / вільне становище динаміка, при позитивних числах виявляється тиск на при негативних чисел на задню частину, тобто в іншому напрямку. Це насправді неважливо куди йде вона, ви чуєте звук буде більш менш однакові.
Тому наше завдання буде придумувати цікаві послідовності чисел для звукової карти. Якщо ми просто візьмемо один номер і не змінимо його, спочатку дифузор рухатиметься до цієї позиції, а потім залишатиметься там, внаслідок чого може бути клацання та подальше мовчання. Цікаві речі відбуваються лише тоді, коли ми неодноразово змінюватимемо номер за певним шаблоном.
З практичної точки зору, ви не можете очікувати, що сучасний комп'ютер досить стійкий, щоб зберегти цикл і явно відправити кожен номер на звукову карту. Все відбувається за заздалегідь встановленою частотою, як правило, на 44100 вибірок за секунду (CD-якість звуку). Цю частоту дискретизації іноді називають "Hz".
Гаразд, ми маємо підійти до цифр. Повторювати моделі чисел. Як ми це зробимо? Це абсолютно просто - будь-який набір чисел, що повторюється, створить звуковий сигнал (якщо ви їх діапазон досить великий).
* Будь-яка модель ви говорите? Ну, що ж 1,0,1,0,1,0,1,0.
Так, це спрацює. Але, на жаль, ви не почуєте, жоден звук, навіть якщо він використовує більшу частину діапазону. Пам'ятайте, ті зразки, які ми годували через D/A конвертер на 44100 в секунду, і ці цифри описують коливання (поворотно-поступальний, пам'ятаєте?), якцього:

…але картина повторюється кожні два зразки, тому в результаті динаміка коливань на 22050 Гц. Це трохи вище за 20 кГц, які ви, ймовірно, пам'ятаєте, як верхня межа для людського слуху. Це дійсно причина використання 44,1 кГц, частота дискретизації - тому ми можемо відтворювати звуки по всьому діапазону людського вуха, але не більше.
* Добре, що якщо я тримаю кожне з чисел на деякий час?
Ти маєш на увазі щось на зразок 1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0.
* Та ось так. Або навіть більше за те ж саме до зміни.
Ура, ви тільки що створили прямокутні хвилі, які, мабуть, є найкласичнішим цифровим синтезованим сигналом. Скільки разів ми повторюємо кількість до переходу до іншої? Якщо ми збільшимо, ця кількість, сигнал буде більш розтягнутим у часі, і коливання відбуватиметься повільніше, оскільки він займає більше часу, щоб завершити рух. Число повторів (також званий "період", якщо вимірювати за часом) прямий спосіб керування частотою сигналу, яку ми генеруємо. Більше тривалий термін означає нижчу частоту, і навпаки.
Маленька замітка до працездатності це те, що ви зазвичай хочете, щоб сигнал коливався рівномірно навколо нульової точки, інакше не буде звукового клацання/кліка на початку та в кінці виклику. Це викликано середнім рівнем сигналу, який переноситься раптово. Це ілюструється досить ясно, як аудіо системи побудовані. Вони, як правило фільтрують все, що рухається повільніше, ніж група Гц, щоб завжди тримати дифузор коливається біля фізичної точки спокою динаміка. Так ви отримаєте максимально доступний діапазон руху з неї, навіть якщо ваш аудіо сигнал постійного струму.
Такщо ми повинні робити, а наші квадратні хвилі складаються з позитивних чи негативних чисел тієї ж величини. Наприклад, -0,5 до +0,5 або -1,0 до +1,0
Хоча прямокутна хвиля має властивість бути дуже простою для розшифровки комп'ютером, насправді дуже складна з музичної точки зору. Вона містить велику кількість резонансних частот вище одиниці, які ми створюємо з обраною величиною періоду, який може зробити звук "повним" та характерним. Насправді деякі з них можна описати швидше як "порожні" або "повітряні", але мають певний характер.
З фізичної точки зору, найпростіша форма сигналу – синусоїдальна. Вона проста в описі ідеального коливання і схожа на вид коливань, який можна отримати за допомогою маятника чи вантажу, що підвішений на пружині. Об'єкти, як правило, віддають перевагу такій формі руху, коли вони здійснюють поступально-обертальний рух туди-сюди по медіані.
Суб'єктивно, синусоїда досить нудна, вона може бути охарактеризована тільки як дуже чистий сигнал, і не більше. Для вироблення можливих чистих звуків вона має переваги, і це також дуже цінний компонент у створенні складніших звуків. Найбільше важливі теоретична та математична конструкція цієї величини. Наприклад, -0,5 до +0,5 або -1,0 до +1,0.

Синусоїда досить складна у створенні комп'ютером, але здебільшого функція sin() моделюється на розумній швидкості. Повний період коливань sin(t) досягається циклічною зміною t від 0 до 2*пі і виводить значення в діапазоні від -1 до +1. Причини використання таких, здавалося б, непарні параметрів діапазону математичні і пов'язані з колом, традиційні функції, такі як синус і косинус. Кола радіуса 1 дорівнює 2 пі.
Трикутна хвиля є спробою імітувати синусоїдальну хвилю більш точно, ніж ви могли б прямокутною, але її використання вимагає дуже простих обчислень. Це просто зростання та падіння рамп цінностей. Результат звучить дуже схоже на синусоїду. Але звучить нудно, хоча, звісно.

Це половина трикутної хвилі, скидання у вихідне значення значення, коли воно досягає вершини. З цього стрибка в рівні сигналу ви отримаєте жорсткі характеристики аналогічні прямокутної хвилі, але є тільки один такий стрибок в період (у порівнянні з прямокутною хвилею, яка має 2 стрибки - вгору і вниз), а решта плавні форми, тому, як правило, звук трохи тепліше і органічніший, ніж у прямокутної хвилі.

Якщо ви хочете більш хаотичних, звуків, що нагадують вибухи або ударів, вам не доведеться мати справу з простими моделями, що повторюються. Прямий шлях отримання хаотичної моделі - це використання генератора випадкових чисел. Більшість мов програмування мають такі генератори. У C ви могли б зробити щось на зразок цього:
next_number = (float) (rand()% 20000-10000) / 10000
. Щоб отримати випадкове число між -1,0 та +1,0. Подивіться rand() та srand() для деталей.
Незважаючи на це модель не буде повністю випадковою, ви можете як і раніше контролюєте очевидну "частоту" і легкість звучання. Це можна зробити декількома способами, але найпростішим є затримка між перемиканням на нові випадкові значення на основі якості. Модель дуже схожа на прямокутні хвилі в цьому відношенні, крім вас, доведеться тримати на період набагато коротший за довжину шуму.
Загальні форми хвиль (для програмістів)
Щоб випробувати різні види сигналів з використаннямоднією і тією ж базовою функцією, ви повинні зберегти змінну, яка буде змінюватися від 0 до 1 і пройти повний період обраної функції. У періоді довжина визначатиме бажані частоти. Для отримання фактичних значень можна використовувати різні функції (залежно від того, який сигнал ви хочете), щоб знайти відповідне значення, засноване на поточному положенні періоду.
Для прямокутної хвилі, ви можете просто перевірити період менше або більше 0,5. Якщо він менший, виводити -1, або 1 (навпаки). Щоб отримати пилкоподібну хвилю, ви напишіть щось на кшталт (-1,0 + period_pos*2,0), що призведе до ухилу сигналу від -1 до +1 над положеннями діапазону періоду.
Одну річ, я знайшов корисними для шуму це відновлення буфера випадкових моделей щоразу в період підрахунку витків, і постійне зчитування значень цього буфера на заснованого на поточному положенні в межах періоду. Ви можете вибрати розмір буфера буде відповідне значення, на основі яких значення частот ви хочете використовувати. Він не повинен бути довгим, але кілька сотень моделей, ймовірно, гарна ідея, щоб уникнути перерахунку весь цей час.
Для зміни частоти звуку вам потрібно просто встановити нове значення для довжини періоду (хоча це впливає лише на швидкість, з якою становище періоду збільшується, він завжди буде в проміжку між 0 та 1). Для контролю звуку потрібно помножити вихідний семпл за допомогою значення звуку (скажімо, між 0.0 за мовчання та 1.0 для максимальної гучності). Можна також змішати кілька незалежних сигналів, поєднавши їх семпли разом, хоча будьте впевнені, що він не перевищує допустимого діапазону вашої звукової карти (які, ймовірно, дорівнюють -1,0 до +1,0). Іншими словами, ви повинні використовувати звук нижче для кожного сигналу (або"каналу"), якщо ви збираєтеся змішати (додати) деякі з них разом. або ви можете просто помножити підсумкову суму зі значенням гучності, якщо вам не потрібне регулювання гучності на кожен канал.
Ще одне невелике застереження, яке варто розглянути це те, що ви не повинні використовувати числа з плаваючою точкою, ніби вони були невід'ємними типами даних. Тобто не збільшувати маленькі кроки у великому діапазоні. Вони мають обмежену точність і буде неправильно, якщо ви це зробите. Це може виявлятися як невелика, але помітна зміна в полі, ні гірша. Ви збільшити числа з комою стільки, скільки хочете тримати їх у розумних межах, як між 0,0 та 1,0. Проблеми виникають, коли розмір збільшення набагато менше, ніж поточне значення (наприклад, 50000,0 + 0,1).
Якщо ви маєте збільшення в широкому діапазоні, краще збільшувати ціле і кинути плавати в міру необхідності. Однак таке приведення призвело б до втрати продуктивності. Звичайно, можна також зробити всі розрахунки з використанням тільки цілої математики, але це досить незручно і важко підтримувати для більш складних звуків. Сучасні комп'ютери досить швидко вважають, з плаваючою точкою, що математики зазвичай можуть дозволити собі цю розкіш.