Чи є звукова бібліотека для C для генерації звукових зразків з коду? [зачинено]


10

Я працюю над двигуном для гри в стилі ретро в C. Я шукаю звукову бібліотеку, яка видаватиме чіпові звуки з коду ... Я хочу створити свій власний простий трекер чіптуна для двигуна для створення музики. Чи існує така річ?

Мене також зацікавила би бібліотека використовувати файли .nsf у своєму проекті.

Я використовую Linux для розробки.


Я думаю, що це питання підпадає під категорію "Яку технологію використовувати". Хоча зазвичай ці нішеві запити не генерують великий список відповідей, я думаю, що це не конструктивно.
MichaelHouse

Ну, проблема в тому, що я, здається, нічого не можу знайти. Я навіть не знаю, з чого почати ... Кожна бібліотека, яку я знайшла, фокусується на завантаженні файлів, таких як .wav. Я можу використовувати libmikmod, якщо хочу просто завантажити модуль .mod або .xm, але це не те, що я хочу робити.
rzrscm

Я не думаю, що це насправді підпадає під розвиток ігор. Це більш загальний медіа, ніж ігри.
PixelArtDragon

Спробуйте пошукати "мод трекер" або, можливо, "демосцен трекер" для більш загальної інформації та ресурсів.
Патрік Х'юз

1
Я особисто вважаю це питання гарним питанням. Оскільки я люблю програмувати ігри в ретро-стилі, важко знайти ресурси для подібних речей, не будучи частиною якоїсь незрозумілої спільноти.
Зак Людина

Відповіді:


3

Можливо, не правильна відповідь, але ось бібліотека різних аудіо-двигунів

(Прокрутіть вниз до другого сегмента аудіобібліотеки)

Щонайменше, 9 з 12 двигунів постачаються з C. Більшість з них також підтримують файли трекера. Що не так відрізняється від файлів nsf (я припускаю, що це музичні файли NES).


16

Звичайно, ви можете, просто не банально, щоб це звучало "приємно".

Я не знаю, як це зробити в Linux, але якщо ви можете грати в буфер PCM, все, що вам потрібно зробити, - це заповнити його всім, що ви хочете.

Отже, якщо припустити, що ваш буфер налаштований на відтворення в однотонних, 16-бітних зразках, зі швидкістю 44100 зразків в секунду, створювати чистий (синусоїдальний) формат A4 (440 Гц) так само просто, як

int16_t buffer[44100];
float frequency = 440.0f;
float sampling_ratio = 44100.0f;
float amplitude = 0.5f;
float t;
for (int i = 0; i < 44100; i++)
{
    float theta = ((float)i / sampling_ratio) * PI;
    buffer[i] = (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}

Однак цей звук, мабуть, дуже тьмяний для ваших інтересів, тому вам доведеться робити кілька складніших речей. Взагалі існує два типи синтезу звуку: аддитивний і віднімаючий . Є багато інших, але ці двоє, мабуть, найпростіші. Сьогодні я просто поговорю про синтез добавок.

Для синтезу добавок ви робите те саме, що я робив саме там, але замість того, щоб просто використовувати одну частоту на одній амплітуді, ви додаєте кілька хвиль разом. Це так само, як одночасно натискати кілька клавіш на піаніно. Таким чином, ви модифікуєте свій код таким чином:

void add_sine_wave(int16_t* buffer, int buffer_length, float frequency, float sampling_ratio, float amplitude)
{
    for (int i = 0; i < buffer_length; i++)
    {
        float theta = ((float)i / sampling_ratio) * M_PI;
        // make sure to correct for overflows and underflows
        buffer[i] += (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
    }
}

а потім використовуйте його так:

int16_t buffer[44100];
memset(buffer, 0, sizeof(buffer));
// Create an A Major chord
add_sine_wave(buffer, 44100, 440.0f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 554.37f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 659.26f, 44100.0f, 0.5f);

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

Зауважте, що до сих пір я використовував тільки синусоїди, але старі синтезатори також підтримують квадратні , трикутні та пилові хвилі, кожен з яких має свої цікаві звукові властивості. Реалізація цих методів досить проста.

Інші речі, які ви можете зробити для збільшення різноманітності звуків, які ви можете створювати:

  1. Модуляція амплітуди : Зміна амплітуди хвилі протягом усього буфера
  2. Частота модуляції : Зміна частоти хвилі у всьому буфері
  3. Реверберація : повторення зразка шляхом зміни його форми та положення в буфері. Сама дуже складна тема.
  4. Обволікання : Зміна амплітуди вибірки, щоб дати їй більше життя

Сенс у тому, що самі методи не дуже складні, тому вам не потрібна бібліотека, щоб їх абстрагувати. Це використовує їх для створення цікавих звуків, що важко.

Одне заключне зауваження. Експериментуючи із таким звуком, може бути дуже корисно зберегти свої дані у файлах WAV, а потім візуалізувати їх у такому програмному забезпеченні, як Audacity. Таким чином ви можете зрозуміти, що ви робите більш чітко.


+1 для прокатки власних. Я не бачу багатьох лібусів Linux, які б підтримували NSF. Але ось специфікація: webcache.googleusercontent.com/…
michael.bartnett

Дякую за інформацію. Я можу дотримуватися створення файлів .nsf для свого проекту тепер, коли я усвідомлюю, скільки мені потрібно вкласти, щоб звуки звучали правильно.
rzrscm

+1 Я припускав, що будь-яка відповідь на це питання буде нудною. Я мало знаю про AM / FM, але, як правило, хвилі спочатку перейдуть до фільтра, як у субтрактивному синтезі. Крім того, ваш приклад кількох фортепіано нот правильний, кращим прикладом буде лише одна нота! Одна нота фортепіано створить кілька гармонік, що надає їй тембр. Піаніно створить> 5 хвиль, доданих разом, тоді як у більшості синтезаторів 2 або 3 будуть добре.
Тоні

який правильний спосіб перевірити переливи у функції "add_sine_wave"?
eadmaster

@eadmaster: Я мав на увазі відсікання. Переконайтеся, що значення відповідає розміру a, shortперш ніж ви передасте його а short.
Піжама Panda

4

Для звукових ефектів чіптуна є одна певна відповідь: sfxr .

Це окрема програма, яку можна використовувати для створення зразків, але вихідний код також доступний, якщо ви хочете інтегрувати його у свій код.


3

Я особисто можу порекомендувати аудіобібліотеки Blargg . Щось, що може вас зацікавити, це його Blip_Buffer .

На сайті Blargg є кілька "ретро" аудіо синтезаторів, і я активно використовую його Game_Music_Emu для відтворення файлів NSF у клоні Mega Man, про який я пишу.

Багато бібліотек написані на C ++, але деякі з них також мають інтерфейс C.


Безумовно, я спробую випробувати деякі з них ... Вони можуть бути саме тим, що я шукаю, оскільки я працюю над ігровим двигуном, призначеним для імітації зовнішнього вигляду гри NES.
rzrscm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.