Pitching (adjusting tempo and pitch simultaneously) audiodata in realtime

Drunkee

Grünschnabel
Hallo,

ich möchte wie der Titel es sagt Tempo und damit Pitch einer wav-Datei in Echtzeit verändern und zwar hoffentlich mit so wenig Verzögerung, dass ein umlegen des Playbackspeeds von 1 auf x mit kaum hörbarer Latenz von statten geht.

Aktuell habe ich einen Klasse AudioPlayer, welche auf eine DataLine bytes schreibt. Diese bytes kommen aus einer wav-Datei, welche komplett in den Speicher in ein byte-Array geladen wurde.
Ein weiterer Thread ruft in regelmäßigen Abständen eine setSpeed()-Methode auf dem AudioPlayer auf und aktualisiert dort einen Wert, der den Playback-Speed angeben soll.

VARIANTE1
Um z.B. alles in doppelter Geschwindigkeit auszugeben kann man nun jedes 2 Byte auf den Outputstream schreiben. Allerdings funktioniert das nicht wirklich, da ich mindestens 512 Bytes schreiben muss, um nicht Gefahr zu laufen, dass der OutputStream-Buffer leer wird, bevor ich wieder was reinschreiben konnte.

VARIANTE2
Eine andere Möglichkeit ist das Verändern der SAMPLE_RATE des OutputStreams. Dadurch entstehen
ja Veränderungen im Pitch. Jedoch kann ich zwar ein FloatControl für den MasterGain bekommen, keines aber für die SAMPLE_RATE und sie somit nicht beeinflussen.

Kann mir jemand helfen mein Ziel zu erreichen?

Schöne Grüße
 
Zurück