Domanda

Sto cercando di creare un software che faccia funzionare la tastiera come un pianoforte (ad esempio, l'utente preme il tasto "W" e gli altoparlanti suonano una nota RE).Probabilmente userò OpenAL.Conosco le nozioni di base dell'audio digitale, ma la riproduzione di audio in tempo reale in risposta alla pressione dei tasti pone alcuni problemi che non riesco a risolvere.

Ecco il problema: Diciamo che ho 10 buffer audio e ogni buffer contiene un secondo di dati audio.Se dovessi riempire i buffer prima che vengano riprodotti attraverso gli altoparlanti, riempirei i buffer uno o due secondi prima che vengano riprodotti.Ciò significa che ogni volta che l'utente tenta di suonare una nota, ci sarà un ritardo di uno o due secondi tra la pressione del tasto e la riproduzione della nota.

Come aggirare questo problema?Riduci semplicemente i buffer il più piccolo possibile e li riempi il più tardi possibile?C'è qualche trucco che mi sfugge?

È stato utile?

Soluzione

sintetizzatori maggior parte dei software non usano più buffer a tutti.

Si basta usare una singola, piccola ringbuffer che viene continuamente riprodotto.

Un filo ad alta priorità sarà il più spesso possibile controllare il gioco-posizione corrente e riempire la parte libera (ad esempio, la parte che è stato giocato dall'ultima volta che il thread è in esecuzione) del ringbuffer con i dati audio.

Questo vi darà una latenza costante che è legato solo dalle dimensioni del vostro anello-buffer e la latenza di uscita della scheda audio (di solito non più di tanto).

Si può abbassare la latenza ancora di più:

In caso di una nuova nota da riprodurre (ad esempio, l'utente ha appena premuto un tasto) si controlla la posizione di riproduzione corrente entro l'anello di buffer, aggiungere alcuni campioni per la sicurezza, e poi ri-renderizzare i dati audio con il New sound-impostazioni applicate.

Questo diventa difficile se si dispone di effetti basati sul tempo in esecuzione (linee di ritardo, riverbero e così via), ma è fattibile. Basta tenere traccia degli ultimi 10 stati dei vostri effetti basati tempo ogni millisecondo o giù di lì. Che ti permettono di ottenere indietro di 10 millesimi di secondo nel tempo.

Altri suggerimenti

Con il WinAPI, si può ottenere solo finora in termini di latenza. Di solito non è possibile ottenere sotto 40-50ms che è abbastanza brutto. La soluzione è quella di implementare il supporto ASIO nella vostra app, e rendere l'utente eseguire qualcosa di simile ASIO4ALL in background. Questo porta la latenza fino a 5ms ma ad un costo:. Altre applicazioni non possono giocare il suono allo stesso tempo

Lo so perché io sono un utente di FL Studio.

La soluzione sono piccoli buffer, riempiti frequentemente da un thread in tempo reale.Quanto piccoli si riducono i buffer (o quanto si riempie il buffer con un buffer ad anello) è limitato dalla pianificazione della latenza del sistema operativo.Probabilmente troverai 10 ms accettabili.

Ci sono alcuni brutti trucchi qui per chi non lo sapesse, in particolare per quanto riguarda l'architettura del software e la sicurezza dei thread.

Potresti provare a dare un'occhiata Succo - che è un framework multipiattaforma per la scrittura di software audio e, in particolare, plug-in audio come SoftSynths ed effetti.Include software sia per plug-in che per host di esempio.È nell'host che vengono affrontati principalmente i problemi relativi al threading.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top