Есть ли звуковая библиотека для C, чтобы генерировать звуковые образцы из кода? [закрыто]

10

Я работаю над движком для игры в стиле ретро в C. Я ищу звуковую библиотеку, которая бы производила звуки микросхем из кода ... Я хочу создать свой собственный простой трекер чиптюнов для движка для создания музыки. Существует ли такая вещь?

Я также был бы заинтересован в библиотеке для использования файлов .nsf в моем проекте.

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

rzrscm
источник
Я думаю, что этот вопрос относится к категории «Какие технологии использовать». Хотя обычно эти нишевые запросы не генерируют большой список ответов, я думаю, что это не конструктивно.
MichaelHouse
Ну, проблема в том, что я не могу ничего найти. Я даже не знаю с чего начать ... Каждая библиотека, которую я нашел, фокусируется на загрузке из таких файлов, как .wav. Я могу использовать libmikmod, если я хочу просто загрузить модуль .mod или .xm, но я не хочу этого делать.
rzrscm
Я не думаю, что это действительно подпадает под разработку игр. Это более общие средства массовой информации, чем игры.
PixelArtDragon
Попробуйте поискать "mod tracker" или, возможно, "demoscene tracker" для более общего понимания и ресурсов.
Патрик Хьюз
1
Я лично считаю этот вопрос хорошим вопросом. Поскольку я люблю программировать игры в стиле ретро, ​​трудно найти ресурсы для подобных вещей, не будучи частью какого-то малоизвестного сообщества.
Зак Человек

Ответы:

3

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

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

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

Sidar
источник
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: я имел в виду отсечение. Убедитесь, что значение вписывается в, shortпрежде чем вы приведете его к short.
Панда Пижама
4

Для звуковых эффектов чиптюна есть один определенный ответ: sfxr .

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

Яри ​​Комппа
источник
3

Я могу лично порекомендовать аудио библиотеки Blargg . Что-то, что может представлять для вас особый интерес, это его Blip_Buffer .

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

Многие библиотеки написаны на C ++, но некоторые также предоставляют интерфейс C.

Зак Человек
источник
Определенно собираюсь попробовать некоторые из них ... Они могут быть именно тем, что я ищу, так как я работаю над игровым движком, который предназначен для имитации внешнего вида игры NES.
rzrscm