Gibt es eine Soundbibliothek für C, um Soundbeispiele aus Code zu generieren? [geschlossen]

10

Ich arbeite an einer Engine für ein Spiel im Retro-Stil in C. Ich suche nach einer Soundbibliothek, die Chip-Sounds aus Code erzeugt ... Ich möchte meinen eigenen einfachen Chiptune-Tracker für die Engine erstellen, um Musik zu erstellen. Gibt es so etwas?

Ich würde mich auch für eine Bibliothek interessieren, um .nsf-Dateien in meinem Projekt zu verwenden.

Ich benutze Linux für die Entwicklung.

rzrscm
quelle
Ich denke, diese Frage fällt unter die Kategorie "Welche Technologie soll verwendet werden?". Obwohl diese Nischenanforderungen normalerweise keine große Liste von Antworten generieren, denke ich, dass dies nicht konstruktiv ist.
MichaelHouse
Das Problem ist, dass ich scheinbar nichts finde. Ich weiß nicht einmal, wo ich anfangen soll ... Jede Bibliothek, die ich gefunden habe, konzentriert sich auf das Laden aus Dateien wie .wav. Ich kann libmikmod verwenden, wenn ich nur ein .mod- oder .xm-Modul laden möchte, aber das ist nicht das, was ich tun möchte.
rzrscm
Ich denke nicht, dass dies wirklich unter die Spieleentwicklung fällt. Es sind allgemeinere Medien als Spiele.
PixelArtDragon
Suchen Sie nach "Mod Tracker" oder "Demoscene Tracker", um einen allgemeineren Hintergrund und Ressourcen zu erhalten.
Patrick Hughes
1
Ich persönlich finde diese Frage eine gute Frage. Da ich gerne Spiele im Retro-Stil programmiere, ist es schwierig, Ressourcen für solche Dinge zu finden, ohne Teil einer obskuren Community zu sein.
Zack The Human

Antworten:

3

Wahrscheinlich keine richtige Antwort, aber hier ist eine Bibliothek verschiedener Audio-Engines

(Scrollen Sie für Audiobibliotheken zum zweiten Segment.)

Mindestens 9 von 12 Engines passen zu C. Die meisten von ihnen unterstützen auch Tracker-Dateien. Das ist nicht so anders als nsf-Dateien (ich nehme an, das sind NES-Musikdateien).

Sidar
quelle
16

Sicher können Sie, es ist einfach nicht trivial, es "schön" klingen zu lassen.

Ich weiß nicht, wie es unter Linux geht, aber wenn Sie einen PCM-Puffer abspielen können, müssen Sie ihn nur mit dem füllen, was Sie wollen.

Angenommen, Ihr Puffer ist so eingestellt, dass er in monauralen, vorzeichenbehafteten 16-Bit-Samples mit 44100 Samples pro Sekunde abgespielt wird. Die Erzeugung eines reinen (sinusförmigen) A4-Sounds (440 Hz) ist so einfach wie

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

Dieser Sound ist jedoch wahrscheinlich sehr langweilig für Ihre Interessen, so dass Sie einige kompliziertere Dinge tun müssen. Im Allgemeinen gibt es zwei Arten der Klangsynthese: Additiv und Subtraktiv . Es gibt viele andere, aber diese beiden sind wahrscheinlich die einfachsten. Heute werde ich nur über additive Synthese sprechen.

Für die additive Synthese machen Sie dasselbe wie ich dort oben, aber anstatt nur eine Frequenz mit einer Amplitude zu verwenden, addieren Sie mehrere Wellen. Dies ist wie das gleichzeitige Drücken mehrerer Tasten auf einem Klavier. Sie ändern Ihren Code also so, dass er ungefähr so ​​aussieht:

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

und dann benutze es so:

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

By the way, ich bin immer meine Frequenzen von hier (ich verwende gleich Temperament , aber es gibt viele von anderen Tunings erhältlich).

Beachten Sie, dass bisher habe ich nur Sinuswellen benutzen, aber alte Synthesizern auch unterstützen Platz , dreieckige und Säge Wellen als auch, jeder mit seinen eigenen interessanten Klangeigenschaften. Die Implementierung ist ziemlich einfach.

Andere Dinge, die Sie tun können, um die Vielfalt der Sounds zu erhöhen, die Sie erstellen können, sind:

  1. Amplitudenmodulation : Ändern der Amplitude der Welle im gesamten Puffer
  2. Frequenzmodulation : Ändern der Frequenz der Welle im gesamten Puffer
  3. Reverb : Wiederholen eines Samples durch Ändern seiner Form und Position im Puffer. Selbst ein sehr komplexes Thema.
  4. Hüllkurve : Ändern der Amplitude einer Probe, um ihr mehr Leben zu geben

Der Punkt hier ist, dass die Techniken selbst nicht sehr schwierig sind, so dass Sie nicht wirklich eine Bibliothek benötigen, um sie für Sie zu abstrahieren. Es benutzt sie, um interessante Klänge zu erzeugen, was schwierig ist.

Eine letzte Anmerkung. Wenn Sie mit einem solchen Sound experimentieren, kann es sehr nützlich sein, Ihre Daten in WAV-Dateien zu speichern und sie dann in einer Software wie Audacity zu visualisieren. Auf diese Weise können Sie klarer sehen, was Sie tun.

Panda Pyjama
quelle
+1 für das Rollen deiner eigenen. Ich sehe nicht viele Linux-Bibliotheken, die NSF unterstützen würden. Aber hier ist die Spezifikation: webcache.googleusercontent.com/…
michael.bartnett
Danke für die Info. Ich bleibe vielleicht beim Erstellen von .nsf-Dateien für mein Projekt, da mir klar wird, wie viel ich investieren muss, damit die Sounds genau richtig klingen.
rzrscm
+1 Ich nahm an, dass jede Antwort auf diese Frage mühsam wäre. Ich weiß nicht viel über AM / FM, aber im Allgemeinen werden Wellen zuerst zu einem Filter geleitet, wie bei der subtraktiven Synthese. Auch Ihr Beispiel für mehrere Klaviernoten ist korrekt, ein besseres Beispiel wäre nur eine Note! Eine einzelne Klaviernote erzeugt mehrere Harmonische, die ihr Timbre verleihen. Ein Klavier erzeugt> 5 Wellen, während in den meisten Synthesizern 2 oder 3 in Ordnung sind.
Tony
Was ist der richtige Weg, um Überläufe in der Funktion "add_sine_wave" zu überprüfen?
eadmaster
@eadmaster: Ich meinte Clipping. Stellen Sie sicher, dass der Wert in a passt, shortbevor Sie ihn in a umwandeln short.
Panda Pyjama
4

Für Chiptune-Soundeffekte gibt es eine eindeutige Antwort: sfxr .

Es ist eine eigenständige Anwendung, mit der Sie Beispiele generieren können. Der Quellcode ist jedoch auch verfügbar, wenn Sie ihn in Ihren Code integrieren möchten.

Jari Komppa
quelle
3

Ich kann Blarggs Audiobibliotheken persönlich empfehlen . Etwas, das für Sie von besonderem Interesse sein könnte, ist sein Blip_Buffer .

Auf Blarggs Website gibt es mehrere "Retro" -Audiosynthesizer, und ich verwende aktiv sein Game_Music_Emu , um NSF-Dateien in einem Mega Man-Klon abzuspielen , den ich schreibe.

Viele der Bibliotheken sind in C ++ geschrieben, einige bieten jedoch auch eine C-Schnittstelle.

Zack der Mensch
quelle
Ich werde auf jeden Fall einige davon ausprobieren ... Sie könnten genau das sein, wonach ich suche, da ich an einer Spiel-Engine arbeite, die das Erscheinungsbild eines NES-Spiels emulieren soll.
rzrscm