Esiste una libreria audio per C per generare campioni audio dal codice? [chiuso]


10

Sto lavorando su un motore per un gioco in stile retrò in C. Sto cercando una libreria di suoni che produca suoni di chip dal codice ... Voglio creare il mio semplice tracker chiptune per il motore per creare musica. Esiste una cosa del genere?

Sarei anche interessato a una libreria per utilizzare i file .nsf nel mio progetto.

Sto usando Linux per lo sviluppo.


Penso che questa domanda rientri nella categoria "Quale tecnologia utilizzare". Tuttavia, in genere queste richieste di nicchia non generano un ampio elenco di risposte, penso che non sia costruttivo.
MichaelHouse

Bene, il problema è che non riesco a trovare nulla. Non so nemmeno da dove cominciare ... Ogni libreria che ho trovato si concentra sul caricamento da file come .wav. Posso usare libmikmod se voglio solo caricare un modulo .mod o .xm, ma non è quello che voglio fare.
rzrscm

Non penso che questo rientri davvero nello sviluppo del gioco. Sono i media più generici dei giochi.
PixelArtDragon

Prova a cercare "mod tracker" o forse "demoscene tracker" per uno sfondo e risorse più generali.
Patrick Hughes,

1
Personalmente trovo questa domanda una buona domanda. Dato che mi piace programmare giochi in stile retrò, è difficile trovare risorse per cose del genere senza far parte di una comunità oscura.
Zack The Human

Risposte:


3

Probabilmente non è una risposta corretta ma ecco una libreria di vari motori audio

(Scorri verso il basso fino al secondo segmento per le librerie audio)

Almeno 9 motori su 12 vanno con C. Molti di essi supportano anche i file tracker. Che non è così diverso dai file nsf (suppongo che questi siano file musicali NES).


16

Certo che puoi, non è banale farlo sembrare "carino".

Non so come farlo in Linux, ma se riesci a riprodurre un buffer PCM, tutto ciò che devi fare è riempirlo con quello che vuoi.

Quindi supponendo che il tuo buffer sia impostato per essere riprodotto in campioni mono a 16 bit con segno, a 44100 campioni al secondo, creare un suono A4 (sinusoidale) puro (440 Hz) è semplice come

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

Tuttavia, questo suono è probabilmente molto noioso per i tuoi interessi, quindi devi fare alcune cose più complicate. In generale, ci sono due tipi di sintesi sonora: additiva e sottrattiva . Ce ne sono molti altri, ma questi due sono probabilmente i più semplici. Oggi parlerò solo di sintesi additiva.

Per la sintesi additiva, fai la stessa cosa che ho fatto lassù, ma invece di usare solo una frequenza ad un'ampiezza, aggiungi diverse onde insieme. È come premere contemporaneamente più tasti su un piano. Quindi modifichi il tuo codice per assomigliare a questo:

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

e poi usalo in questo modo:

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

A proposito, io ricevo la mia frequenze da qui (sto usando temperamento uguale , ma ci sono un sacco di altre accordature disponibili).

Si noti che finora ho usato solo onde sinusoidali, ma i vecchi sintetizzatori supportano anche onde quadrate , triangolari e saw , ognuna con le sue interessanti proprietà sonore. L'implementazione di questi è piuttosto semplice.

Altre cose che puoi fare per aumentare la varietà di suoni che puoi creare sono:

  1. Modulazione dell'ampiezza : modifica dell'ampiezza dell'onda in tutto il buffer
  2. Modulazione di frequenza : modifica della frequenza dell'onda in tutto il buffer
  3. Riverbero : ripetere un campione modificandone la forma e la posizione nel buffer. È un argomento molto complesso.
  4. Avvolgimento : modifica dell'ampiezza di un campione per dargli più vita

Il punto qui è che le tecniche stesse non sono molto difficili, quindi non hai davvero bisogno di una libreria per astrarle per te. Li sta usando per creare suoni interessanti ciò che è difficile.

Un'ultima nota. Quando si sperimenta un suono del genere, può essere molto utile salvare i dati in file WAV e visualizzarli in alcuni software come Audacity. In questo modo puoi vedere cosa stai facendo più chiaramente.


+1 per il tuo lancio. Non vedo molte librerie Linux che supportano NSF. Ma, ecco le specifiche: webcache.googleusercontent.com/…
michael.bartnett

Grazie per le info. Potrei continuare con la creazione di file .nsf per il mio progetto ora che mi rendo conto di quanto dovrei mettere per ottenere il suono giusto.
rzrscm,

+1 Ho pensato che qualsiasi risposta a questa domanda sarebbe stata noiosa. Non so molto su AM / FM, ma generalmente le onde verranno prima indirizzate a un filtro, come nella sintesi sottrattiva. Inoltre, il tuo esempio di più note di piano è corretto, un esempio migliore sarebbe solo una nota! Una singola nota di pianoforte creerà più armoniche che le daranno il timbro. Un piano creerà> 5 onde sommate mentre nella maggior parte dei synth 2 o 3 andranno bene.
Tony

qual è il modo corretto di controllare gli overflow nella funzione "add_sine_wave"?
eadmaster il

@eadmaster: intendevo ritaglio. Assicurati che il valore si adatti a a shortprima di lanciarlo ashort .
Panda Pajama,

4

Per gli effetti sonori di chiptune, c'è una risposta definitiva: sfxr .

È un'applicazione autonoma che è possibile utilizzare per generare esempi, ma il codice sorgente è disponibile anche se si desidera integrarlo nel proprio codice.


3

Posso consigliare personalmente le librerie audio di Blargg . Qualcosa che potrebbe interessarti in modo particolare è il suo Blip_Buffer .

Il sito di Blargg ha diversi sintetizzatori audio "retrò" e sto attivamente usando il suo Game_Music_Emu per riprodurre file NSF in un clone di Mega Man che sto scrivendo.

Molte delle librerie sono scritte in C ++ ma alcune forniscono anche un'interfaccia C.


Sicuramente proveremo alcuni di questi ... Potrebbero essere proprio quello che sto cercando, dato che sto lavorando su un motore di gioco che ha lo scopo di emulare l'aspetto di un gioco NES.
rzrscm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.