Ja, sofern du den Prozess nur ab und zu machst.Bedeutet aber doch eigentlich nur, dass ich temporäre spektrale Abweichungen haben werde.
Ja, sofern du den Prozess nur ab und zu machst.Bedeutet aber doch eigentlich nur, dass ich temporäre spektrale Abweichungen haben werde.
Ich arbeite komplett Block-basiert. Da dürfte das etwas schwierig werden.
Gestern hatte ich mal zwei Stunden Zeit und habe zwei Ansätze für die Verkürzung getestet:Berichte mal nachher, ob du damit zufrieden bist.
size_t fadeLen = 10 * DSP::SAMPLERATE_MS; // 10 ms cross fade zeit fix
signal target = buffer[0]; // erstes sample im puffer
signal start = buffer[newSize - 1]; //letztes sample nach verkürzung
signal phaseInc = 1.0f / static_cast<signal>(fadeLen);
signal fade = 0.0f;
for (size_t i = 0; i < fadeLen; ++i)
{
buffer[i] = start * (1.0f - fade) + target * fade;
fade += phaseInc;
}
Nachtrag: Allerdings frage ich mich, ob die Phase wirklich ein Problem sein kann, das zu Knacksern führen kann.
Nicht nur ein Sprung im Zeitsignal wird zu einem Knack, sondern auch eine Diskontinuität in der 1. Ableitung (z.B. wenn ein Sinus stufenartig seine Frequenz ändert).
Nee, haste nicht. In meinem Beispiel wechsle ich den Grain-Pitch von Quinte auf Oktave (glaube ich). Da hätte man es hören können, allerdings war da der Puffer durchs Herumspielen wahrscheinlich schon angepasst.Habe ich ein Audio-Beispiel des Knacksens übersehen?
Gestern hatte ich mal zwei Stunden Zeit und habe zwei Ansätze für die Verkürzung getestet:
Das letzte Sample nach der Verkürzung linear auf das erste Sample im Puffer interpolieren. Ziemlich trivial mit
Code:size_t fadeLen = 10 * DSP::SAMPLERATE_MS; // 10 ms cross fade zeit fix signal target = buffer[0]; // erstes sample im puffer signal start = buffer[newSize - 1]; //letztes sample nach verkürzung signal phaseInc = 1.0f / static_cast<signal>(fadeLen); signal fade = 0.0f; for (size_t i = 0; i < fadeLen; ++i) { buffer[i] = start * (1.0f - fade) + target * fade; fade += phaseInc; }
Das Log zeigt eine perfekte Interpolation, nur leider bleiben die Crackels. Ich vermute, dass ich das so nicht machen kann, da das zwar eine tolle Transition ist, leider aber wohl eine Diskontinuität in der Phase erzeugt. Stattdessen habe ich versucht die Phasen zu interpolieren (buffer[newSize - 1], buffer[newSize - 2], buffer[1], buffer[0]). Brachte auch nix. Das lässt sich mit 4 Samples wahrscheinlich auch nicht umsetzen.
Nachtrag: Allerdings frage ich mich, ob die Phase wirklich ein Problem sein kann, das zu Knacksern führen kann.
Der nächste Versuch ist dann, Pufferende und Pufferanfang über die gesamte fadeLen zu überblenden. Mals ehen, ob's dann besser wird.
Noch ein Nachtrag: Schreib- und Lesekopf habe ich nicht neu positioniert. Das könnte natürlich DAS Problem sein...
Ich weiß nicht genau, was du mit der Frage meinst, aber ja, es funktioniert gut :)Arbeitet hier jemand mit Max Msp? Vor allem in Verbindung mit RNBO? Mich würde mal interessieren wie gut das funktioniert? Hat jemand Erfahrung damit?
Doch, ist es auf jeden Fall noch. Danke für deinen Tipp! Ich habe mich sehr viel (wenn die Zeit es zuließ) mit exakt dem befasst was du beschrieben hast. Als Freund allumfassender Lösungen habe ich sehr viel herumexperimentiert um dann am Ende festzustellen, dass manchmal nur ein Griff in die Kiste mit Tricksereien hilft.Weiß gar nicht, ob das Thema noch aktuell ist.
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.