Frage

Ich bin auf der Suche in eine Software zu machen, die die Tastatur-Funktion wie ein Klavier macht (zum Beispiel drückt der Benutzer die ‚W‘ Taste und die Lautsprecher spielen eine D Anmerkung). Ich werde wahrscheinlich OpenAL werden. Ich verstehe die Grundlagen des digitalen Audio, sondern als Reaktion auf Tastendruck Echtzeit-Audio-Wiedergabe wirft einige Probleme, die ich Probleme zu lösen habe.

Hier ist das Problem: Lassen Sie uns sagen, dass ich 10 Audio-Puffer haben, und jeder Puffer hält eine Sekunde Audiodaten. Wenn ich Puffer zu füllen, bevor sie über die Lautsprecher wiedergegeben werden, dann würde ich würde füllen Puffer ein oder zwei Sekunden, bevor sie gespielt werden. Das bedeutet, dass immer dann, wenn der Benutzer versucht, eine Note zu spielen, gibt es einen eine oder zwei Sekunden Verzögerung sein gespielt zwischen dem Drücken der Taste und der Notiz wird.

Wie bekommt man dieses Problem um? Sie machen Sie nur die Puffer so klein wie möglich, und füllen Sie sie so spät wie möglich? Gibt es einen Trick, dass ich fehle?

War es hilfreich?

Lösung

Die meisten Software-Synthesizer verwenden Sie nicht mehrere Puffer überhaupt.

Sie nutzen nur einen einzigen, kleinen Ringspeicher, der ständig gespielt wird.

Ein Thread mit hoher Priorität wird so oft wie möglich überprüfen Sie die aktuelle Wiedergabeposition und den freien Teil füllen (zB der Teil, der seit dem letzten Mal gespielt wurde, der Thread ausgeführt wurde) des Ringpuffers mit Tondaten.

Dies gibt Ihnen eine konstante Latenz, die nur durch die Größe der gebundene Ring-Puffer und die Ausgangslatenz Ihrer Soundkarte (in der Regel nicht so viel).

Sie können Ihre Latenz noch weiter senken:

Im Falle einer neuen Note gespielt werden (zB der Benutzer nur eine Taste gedrückt wird) überprüfen Sie die aktuelle Abspielposition innerhalb des Ringpuffers, fügen Sie einige Beispiele für die Sicherheit, und dann wieder machen die Tondaten mit der neue Sound-Einstellungen angewendet.

Das wird heikel, wenn Sie zeitbasierten Effekte laufen (Verzögerungsleitungen, Reverb usw.), aber es ist machbar. Halten Sie einfach den Überblick über die letzten 10 Staaten Ihrer Zeit basierte Effekte jede Millisekunde oder so. Das wird es möglich machen, zurück 10 Millisekunden in der Zeit zu erhalten.

Andere Tipps

Mit der WinAPI, können Sie nur so weit in Bezug auf die Latenzzeit bekommen. Normalerweise kann man nicht unter 40-50ms was recht böse ist. Die Lösung ist ASIO-Unterstützung in Ihrer Anwendung zu implementieren und den Benutzer läuft so etwas wie ASIO4ALL im Hintergrund machen. Damit erhöht sich die Latenz bis zu 5 ms, aber zu einem Preis. Andere Anwendungen keinen Ton zur gleichen Zeit spielen

Ich weiß das, weil ich ein FL Studio-Benutzer bin.

Die Lösung ist kleiner Puffer, gefüllt häufig durch einen Echtzeit-Thread. Wie klein Sie machen die Puffer (oder wie voll Sie den Puffer lassen mit einem Ringspeicher werden) durch Scheduling-Latenz Ihres Betriebssystems eingeschränkt ist. Sie werden wahrscheinlich 10ms als akzeptabel finden.

Es gibt einige bösen Fallstricke hier für den Uneingeweihten - vor allem in Bezug auf Software-Architektur und Thread-Sicherheit.

Sie könnten versuchen, einen Blick auf Juce - das ist ein plattformübergreifende Rahmen für das Schreiben von Audio-Software und insbesondere - Audio-Plugins wie SoftSynths und Effekte. Es enthält Software für beide Beispiel-Plug-In und Hosts. Es ist in dem Host, dass mit Threadingprobleme meist behandelt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top