Beatangleichung in Audacity - Wo ist mein Denkfehler?

  • Ich weiß, das Thema hatten wir schon das eine oder andere mal. Allerdings wollte ich das mit Berechnung in Audacity umsetzen.


    Meine Vorgehensweise:


    Markieren von Spur 1 bei 4 Takten und bei "Tempo ändern" länge ermitteln (z.b. 2'07 sek). Notieren. Das gleiche mit der 2. Spur (z.b. 3'48 sek.).


    Nun will ich Spur 1 an Spur 2 angleichen. Somit markiere ich nochmal einen Bereich von 2'07 sek und ermittel wieder bei "Tempo ändern" mit dem eintrag der 2. Zeit (3'48) die Änderung in %. In diesem Fall ergibt das -42,556. Nun markieren der komplett zu ändernden Spur und eben -42,556 eingeben.


    Tja, soweit zu meiner Logik. Aber leider ergibt das leider nicht den Effekt, wie ich dachte. Die Takte sitzen immer noch nicht übereinander. Wo liegt mein Denkfehler?

  • Da ist irgendwo ein Tippfehler drin: wenn ich in Audacity_1.3.7 mit "Erzeugen > Tongenerator" eine Tonspur von 2,07 Sekunden Länge erzeuge, die komplette Tonspur markiere, und dann unter "Effekt > Tempo ändern" unter "Length (seconds) from: 2,07 to: 3,48" eintrage, dann erscheint bei mir unter "Änderung in %" die Zahl -40,517 und nicht -42,556.


    Taschenrechner: (2,07*100) / (100-40,517) = 3,4799858...


    Wenn ich dann auf "OK" klicke, erhalte ich eine Tonspur mit einer Länge von 3,479 Sekunden (typischer Computer Fliesskomma Rundungsfehler). Wenn ich mir das allerdings das Ende der verlängerten Tonspur genauer anschaue, dann stelle ich fest, dass dort in den letzten 0,018 Sekunden kein Ton sondern nur Stille existiert (definitiv ein Fehler in Audacity).


    Ich weiss aber ausserdem, dass die SoundTouch Bibliothek (auf der die Audacity "Geschwindigkeit ändern", "Tempo ändern" und "Tonhöhe ändern" Effekte beruhen) sowieso Probleme mit der genauen Geschwindigkeitsänderung hat. Je länger die Stücke, desto schlechter das Ergebnis. Bei Videoton hatte ich bei einer Stunde Laufzeit Abweichungen von bis zu mehreren Sekunden (genauer Wert der Abweichung hängt vom Verhältnis der Tempo-Änderung zur Samplefrequenz der Tonspur ab und ist mehr oder weniger Glückssache).


    Einzigste mir bekannte Freeware-Lösung, mit der so etwas einigermassen genau funktioniert ist: http://sox.sourceforge.net/


    Ich muss nachher mal nachlesen, welchen Code Sox dafür verwendet.

  • Zitat von edgar-rft

    ....Da ist irgendwo ein Tippfehler drin....


    Das kann durchaus sein. Im Nachvollziehen der Beschreibung kann es auch statt 2'05 auch 2'07 oder umgekehrt sein.


    Zitat von edgar-rft

    ......Je länger die Stücke, desto schlechter das Ergebnis....


    Das es aber schon bei den kurzem Stück von wenigen Sekunden so krass ist, hatte mich schon gewundert. Das würde bedeuten, das jegliche Einstellung eher sowas wie "Pie mal Daumen" sein kann oder vom mühsammen ausprobieren abhängt. Bin zwar der letzte der nach einer Nachbesserung "schreit", aber wenn die Angaben von der Realität so stark abweichen, dann ist dieser Effekt unbrauchbar.


    Zitat von edgar-rft

    Einzigste mir bekannte Freeware-Lösung, mit der so etwas einigermassen genau funktioniert ist: http://sox.sourceforge.net/....


    Ich bin immer offen für Vorschläge und, wenn es nicht anders geht, für andere Software. Allerdings wie das Programm im genauen funktioniere soll (zumal alles in englisch ist) bin ich überfragt. Installiert irgendwas im DOS Bereich und ende der Aktion (zumindest bei Win09SE).

  • Sox ist ein reines Kommandozeilen-Werkzeug ohne grafische Benutzeroberfläche. Das ist eigentlich dafür gedacht, dass eine Grafik-Oberfläche in einer beliebigen Programmiersprache obendrauf geschrieben wird. Das Angleichen der Dateien auf reiner Kommandozeilen-Ebene (ohne Grafik) ist natürlich noch viel ätzender als in Audacity herumzuraten oder so lange herumzuprobieren bis es endlich funktioniert.


    Eine grob fahrlässige Beschreibung der Sox "tempo" Effekt Einstell-Möglichkeiten gab es mal unter http://www.audacity-forum.de/post/16302


    Es gibt jetzt im Prinzip zwei Möglichkeiten:


    * Sowohl Audacity als auch Sox laufen beide unter GPL (GNU General Public License). Es wäre also rein theoretisch ohne grösseren Lizenz-HeckMeck möglich den Code aus Sox einfach in Audacity einzubauen. "einfach" bedeutet aber leider, dass keiner von uns beiden gut genug C oder C++ kann, um das selber zu tun, so dass wir erst jemand finden müssen der das für uns macht.


    * Deshalb eine andere dumme Idee: wäre es vielleicht möglich ein PHP-Interface zu schreiben, mit dem ein Kommandozeilen Programm wie Sox von einem Internet-Browser (Internet-Explorer oder Firefox oder ähnlich) fernsteuerbar wäre? Um den Beat anzugleichen brauche ich ja (als vorläufige Minimal-Ausführung gesehen) eigentlich keine Wellenform-Anzeige, sondern nur eine Funktion, die die Prozentzahl ausrechnet und dann über eine Pipeline oder ähnlich von PHP aus das Kommandozeilen Programm fernsteuert. Die Zeit-Angaben, die gebraucht werden, könnten ja in Audacity ausgemessen werden. Ich würde mich dann hinsetzen und alles was man dazu braucht aus den englischen Sox-Anleitungen ins deutsche übersetzen. Da du dich in PHP besser auskennst als ich muss ich jetzt aber erstmal dumm fragen, ob die Fernsteuerung eines Kommandozeilen Programms mit PHP überhaupt möglich ist. Für den Anfang würde eine Windows Version erstmal ausreichen.


    Ist das überhaupt machbar?

  • P.S.: Sox verwendet einen auf 1.0 bezogenen "Faktor" um eine Datei schneller oder langsamer zu machen, zum Beispiel:
    [m]
    2.07 / 3.48 = 0,59482...
    [/m]
    Um mit Sox eine Datei langsamer zu machen musst du (im einfachsten Fall) folgendes schreiben:
    [m]
    sox originaldatei.wav neuedatei.wav tempo 0,59482
    [/m]
    * originaldatei.wav = die Datei, deren Tempo geändert werden soll
    * neuedatei.wav = Dateiname für eine neue .wav-Datei, in die die geänderten Daten geschrieben werden sollen


    Sox kann auch noch ca. hundert andere Formate als nur wav (allerdings kein mp3, dafür brauchst du dann noch lame).

  • Das allgemeine Problem ist ja, das man ja erstmal die länge eines bestimmten Bereiches braucht. 1/4 oder sogar 4/4 ist da schon mal ein Maß, das man bei Spur 1 und Spur 2 über Audacity ermitteln muß. Nur anhand dieser beiden Längen entsheidet man ja, ob man Spur 1 an Spur 2 oder umgekehrt anpassen will. Hat man sich entschieden, wäre die andere Spur erstmal nebensächlich, da man mit diesem Faktor die gesammte Spur errechnen lassen kann. Automatisieren kann man das leider nicht (außer jemand schafft es, bei einer Audiodateien die genaue BPM automatisch zu ermitteln).


    In PHP (und somit in C oder C++) dürfte das eher Peanuts sein.


    In PHP würde ich das so in etwas schreiben.


    Code
    $spur1=127; // Vorsicht 2'07 sind nicht 2,07
    $spur2=228; // beides jeweils in Sekunden, passender wäre hier, wenn man das in Minuten, wie es Audacity aneigt, angeben könnte
    $richtung=rauf; // hier einstellbar ob, in diesem fall Spur 1 rauf oder Spur 2 runtergepitcht werden soll. In dem Fall Spur 1 rauf
    
    
    $faktor_rauf=$spur1*100/$spur2;
    $faktor_runter=$spur2*100/$spur1;


    Ab hier muß nur noch abgefragt werden, welche Faktorberechnung man braucht und die zu auszulesende Datei auswählen. Wie man das dann in einer Formel ausdrückt, die aus der länge der gesammten Spur und der zu erreichenden Spur ergibt, und die dann noch auf die Spur berechnen läßt, übersteiugt mein Wissen :)


    Wenn das Endergebnis "nur" eine WAV Datei ist, ist sogar eher besser, da der Reduzierungsverlust der Qualität wegfällt.

  • Zitat


    Das allgemeine Problem ist ja, das man ja erstmal die länge eines bestimmten Bereiches braucht .... Automatisieren kann man das leider nicht (außer jemand schafft es, bei einer Audiodateien die genaue BPM automatisch zu ermitteln).


    Das ist richtig, ich kenne auch kein einziges Programm oder Gerät, dass so etwas (bpm) wirklich zuverlässig ausrechnen oder anzeigen kann. Das lässt sich wahrscheinlich nur über eine grafische Wellenformanzeige ermitteln, wo der jeweilige Bereich (loop) mit der Maus markiert werden muss um an einigermassen brauchbare Werte zu kommen. Die in dieser Hinsicht beste Lösung wäre dann natürlich, den "Tempo" Effekt in Audacity zu reparieren bzw. durch eine brauchbare Version zu ersetzen, weil dann alles in einem einzigen Programm wäre.


    Zitat


    Wie man das dann in einer Formel ausdrückt, die aus der länge der gesammten Spur und der zu erreichenden Spur ergibt, und die dann noch auf die Spur berechnen läßt, übersteigt mein Wissen


    Falls es dich beruhigt: ich schüttele so etwas auch nicht gerade aus dem Ärmel, aber ich denke, dass ich das herausfinden kann. Im Fall von Sox ist es sogar wirklich stinkeinfach, im Fall von Audacity ist die Prozentzahl der Wert, der an "SoundTouch" weitergegeben wird und der ist leider nur relativ umständlich auszurechnen.


    Die eigentliche Frage, die mich interessiert, hast du aber leider noch gar nicht beantwortet: ist es mit PHP möglich aus einem Internet-Browser heraus Kommandozeilen Programme fernzusteuern? Eine Sox-Grafikoberfläche könnte ich nämlich selber gebrauchen und die einzige Alternative, die auf einer relativ einfachen Skriptsprache beruht und die (wie PHP) auf mehreren Betriebssystemen läuft wäre Tcl/Tk.

  • Zitat von edgar-rft

    .....Die in dieser Hinsicht beste Lösung wäre dann natürlich, den "Tempo" Effekt in Audacity zu reparieren bzw. durch eine brauchbare Version zu ersetzen, weil dann alles in einem einzigen Programm wäre.....


    Wobei man dort auch sowas wie eine automatische BPM-Anzeige einbinden kann. Entweder das sich aus dem markierten bereich ergibt oder die Spur nach Regelmäßigkeit (Drops) analysiert. Dieses könnte dann noch mit einer Toleranz versehen werden (falls der Turntable etwas an Geschwindigkeit schwankt). Mathematisch sicherlich möglich. Aber auch von Interesse?


    Zitat von edgar-rft

    .....ich schüttele so etwas auch nicht gerade aus dem Ärmel,...


    Ich weiß. Aber du hast in den meisten Themen hier mächtig mehr auf dem Kasten, als ich. Ich bin eher der Anwender und wie man mit dem gegebenen was erreichen kann. Manchmal bedauere ich es, das ich nicht schon 10 Jahre früher mit PCs angefangen habe :)


    Zitat von edgar-rft

    ....und der ist leider nur relativ umständlich auszurechnen....


    Entweder habe ich was nicht richtig mitbekommen oder es ist einfacher, als es aussieht.


    Anhand der PHP-Codes von mir oben, ist das zumindest so erreichbar. Da aber entweder willkührlich jemand eine Rundung in den Code eingebaut hat (was blödsinn wäre), kommen wir da doch etwas zweifel, ob das von mir wirklich aussreich.


    Zitat von edgar-rft

    ..... ist es mit PHP möglich aus einem Internet-Browser heraus Kommandozeilen Programme fernzusteuern? ....


    Mir ist der Begriff im Zusammenhang mit PHP völlig unbekannt. PHP wird beim Server geparced und dann ausgegeben. C und C++ werden zwar auch als Script geschrieben, aber nur die gepacte Version wird dann wirklich verwendet (die Scriptversion wird nur für Fehlersuche, Verbesserungen usw. verwendet). PHP ist also für die Implementierung innerhalb eines Programs nicht brauchbar, weil man sonst den Parcer mit einbauen müßte.


    Außerhalb des Browsers gibt es, meines Wissens, keine Schnittstelle zum PC (wenn man jetzt mal die Analyse eines teils des Systems und dem Browser selbst mal nicht berücksichtigt). Läuft also, mehr oder weniger Autonom. Ich verwende nur die Syntax von PHP zur Bescgreibung weil diese auf C++ beruht (nur in vereinfachter Form was z.b. Variablen betrifft). Jeder der als C++ (und vermutlich auch C) beherscht, kann so sicherlich mein Gedanken besser nachvollziehen, als wenn ich das Kryptisch versuche zu erklären, was ich meine.


    Z.z. beschäftige ich mich etzwas mit JavaScript und Ajax. Beides auch Syntax, die auf C++ beruhen. Dennoch reicht es halt nicht aus, soviel von C bzw. C++ zu verstehen, das ich wirklich eine hilfe sein kann.