Czy istnieje biblioteka dźwięków dla C do generowania próbek dźwięku z kodu? [Zamknięte]


10

Pracuję nad silnikiem do gry w stylu retro w C. Poszukuję biblioteki dźwięków, która produkowałaby dźwięki chipów z kodu ... Chcę stworzyć swój własny prosty moduł do śledzenia chiptune dla silnika do tworzenia muzyki. Czy coś takiego istnieje?

Byłbym także zainteresowany biblioteką do używania plików .nsf w moim projekcie.

Używam Linuksa do programowania.


Myślę, że to pytanie należy do kategorii „Której technologii użyć”. Chociaż zazwyczaj te niszowe żądania nie generują dużej listy odpowiedzi, myślę, że nie jest to konstruktywne.
MichaelHouse

Problem polega na tym, że nie mogę nic znaleźć. Nie wiem nawet, od czego zacząć ... Każda znaleziona biblioteka koncentruje się na ładowaniu z plików takich jak .wav. Mogę użyć libmikmod, jeśli chcę po prostu załadować moduł .mod lub .xm, ale nie to chcę robić.
rzrscm

Nie sądzę, że tak naprawdę należy to do tworzenia gier. To bardziej ogólne media niż gry.
PixelArtDragon

Spróbuj wyszukać „mod tracker” lub „demoscene tracker”, aby uzyskać bardziej ogólne tło i zasoby.
Patrick Hughes

1
Osobiście uważam to pytanie za dobre. Ponieważ lubię programować gry w stylu retro, ciężko jest znaleźć zasoby na takie rzeczy, nie będąc częścią jakiejś niejasnej społeczności.
Zack The Human

Odpowiedzi:


3

Prawdopodobnie nie jest to poprawna odpowiedź, ale tutaj jest biblioteka różnych silników audio

(Przewiń w dół do drugiego segmentu, aby znaleźć biblioteki audio)

Co najmniej 9 z 12 silników współpracuje z C. Większość z nich obsługuje także pliki śledzenia. Co nie różni się tak bardzo od plików nsf (zakładam, że są to pliki muzyczne NES).


16

Jasne, że tak, ale brzmi to „ładnie”.

Nie wiem, jak to zrobić w systemie Linux, ale jeśli możesz odtworzyć bufor PCM, wszystko, co musisz zrobić, to wypełnić go czymkolwiek chcesz.

Załóżmy więc, że twój bufor jest ustawiony na odtwarzanie monofonicznych, 16-bitowych próbek z prędkością 44100 próbek na sekundę, tworzenie czystego (sinusoidalnego) dźwięku A4 (440 Hz) jest tak proste, jak

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);
}

Jednak ten dźwięk jest prawdopodobnie bardzo nudny dla twoich zainteresowań, więc musisz robić bardziej skomplikowane rzeczy. Ogólnie istnieją dwa rodzaje syntezy dźwięku: addytywny i subtraktywny . Jest wiele innych, ale te dwa są prawdopodobnie najprostsze. Dzisiaj porozmawiam o syntezie addytywnej.

Aby uzyskać syntezę addytywną, robisz to samo, co przed chwilą, ale zamiast używać tylko jednej częstotliwości przy jednej amplitudzie, dodajesz kilka fal razem. To tak, jak naciśnięcie kilku klawiszy na pianinie jednocześnie. Więc modyfikujesz kod, aby wyglądał mniej więcej tak:

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);
    }
}

a następnie użyj go w następujący sposób:

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);

Nawiasem mówiąc, ja dostaję moje częstotliwości od tutaj (używam równe temperament , ale istnieje wiele od innych strojów dostępny).

Zauważ, że do tej pory używałem tylko fal sinusoidalnych, ale stare syntezatory obsługują również fale kwadratowe , trójkątne i piły , z których każda ma swoje własne interesujące właściwości dźwiękowe. Ich wdrożenie jest dość proste.

Inne rzeczy, które możesz zrobić, aby zwiększyć różnorodność dźwięków, które możesz stworzyć, to:

  1. Modulacja amplitudy : zmiana amplitudy fali w buforze
  2. Modulacja częstotliwości : zmiana częstotliwości fali w buforze
  3. Pogłos : Powtarzanie próbki poprzez zmianę jej kształtu i położenia w buforze. Sam w sobie bardzo złożony temat.
  4. Obwiednia : zmiana amplitudy próbki, aby dać jej więcej życia

Chodzi o to, że same techniki nie są bardzo trudne, więc tak naprawdę nie potrzebujesz biblioteki, aby je streścić. Wykorzystuje je do tworzenia interesujących dźwięków, co jest trudne.

Ostatnia uwaga. Podczas eksperymentowania z takim dźwiękiem przydatne może być zapisanie danych w plikach WAV, a następnie wizualizacja ich w oprogramowaniu takim jak Audacity. W ten sposób możesz wyraźniej zobaczyć, co robisz.


+1 za wyrzucenie własnego. Nie widzę wielu bibliotek Linuksa, które wspierałyby NSF. Ale oto specyfikacja: webcache.googleusercontent.com/…
michael.bartnett

Dziękuję za informację. Mogę trzymać się tworzenia plików .nsf dla mojego projektu teraz, kiedy zdaję sobie sprawę, ile muszę włożyć, aby dźwięki brzmiały we właściwy sposób.
rzrscm

+1 Zakładam, że jakakolwiek odpowiedź na to pytanie będzie nużąca. Nie wiem dużo o AM / FM, ale generalnie fale najpierw będą kierowane do filtra, tak jak w syntezie subtraktywnej. Również twój przykład wielu nut fortepianowych jest poprawny, lepszym przykładem byłaby tylko jedna nuta! Pojedyncza nuta fortepianu tworzy wiele harmonicznych, co nadaje jej barwę. Fortepian utworzy> 5 fal dodanych razem, podczas gdy w większości syntezatorów 2 lub 3 będą w porządku.
Tony

jaki jest prawidłowy sposób sprawdzania przelewów w funkcji „add_sine_wave”?
eadmaster

@eadmaster: Miałem na myśli wycinek. Upewnij się, że wartość mieści się w a, shortzanim rzucisz ją na a short.
Panda Pajama

4

W przypadku efektów dźwiękowych chiptune istnieje jedna konkretna odpowiedź: sfxr .

Jest to samodzielna aplikacja, której można używać do generowania próbek, ale kod źródłowy jest również dostępny, jeśli chcesz go zintegrować z kodem.


3

Mogę osobiście polecić biblioteki audio Blargga . Coś, co może Cię szczególnie zainteresować, to jego Blip_Buffer .

Strona Blargga ma kilka „retro” syntezatorów audio i aktywnie używam jego Game_Music_Emu do odtwarzania plików NSF w klonie Mega Man, który piszę.

Wiele bibliotek jest napisanych w języku C ++, ale niektóre zapewniają również interfejs C.


Zdecydowanie wypróbuję niektóre z nich ... Mogą być właśnie tym, czego szukam, ponieważ pracuję nad silnikiem gry, który ma naśladować wygląd gry NES.
rzrscm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.