Sounds ohne Latenz abspielen (oder mehrere gleichzeitig) [Pico, DFPlayer, Micropython]

  • Hi,

    wer schon andere meiner Threads gesehen hat wird bemerkt haben, dass ich (nach wie vor) ein totaler Anfänger in diesem Bereich bin. Das nur mal vorweg.

    Für ein aktuelles Bastelprojekt ("funktionierender" Lichtschwertgriff mit Sound & Licht) habe ich mir den DFPlayer MP3-Player geholt und die folgende Class gefunden: https://github.com/mannbro/PicoDFPlayer

    Damit habe ich es bereits hinbekommen, per Knopfdruck zwischen den Sounds fürs Ein- und Ausschalten zu switchen. Leider gibt es zwischen dem Wechseln der Sounds eine kurze (ca 200ms würde ich schätzen) Pause, was natürlich ziemlich blöd klingt.

    Jetzt wäre meine Frage: ist dies Hardware-bedingt und lässt sich nicht wirklich ändern, oder könnte man den Code von mannbro anpassen, sodass die Sounds ohne Latenz dazwischen abgespielt werden? Oder noch besser: dass der Player die erste Datei (PowerOn) ein paar Millisekunden weiterspielen lässt, während die nächste (PowerOff) schon gestartet wird? Damit wäre die Illusion vermutlich komplett. Hat jemand eine Idee, wie man das hinbekommen könnte? Vielen Dank auf jeden Fall im Voraus!!

  • Sounds ohne Latenz abspielen (oder mehrere gleichzeitig) [Pico, DFPlayer, Micropython]? Schau mal ob du hier fündig wirst!

  • Zeige doch einmal den Quelltext Deines Programms.

    Unten der Code (ich weiß, einen Knopf steuert man normalerweise mit "not"-Befehlen. Aber wie gesagt: Anfänger, und so hat's erstmal leicht funktioniert.)

  • Moinsen,

    Das ist vollkommen normal mit diesem Code / Bibliothek !
    Dieser Code nutzt das "Acknowledge" Bit, welches nach der Befehlssendung mit einer internen Verzögerung den Status zurückliest.

    Dieses steht in Zeile 35/36 des Codes in dieser Bibliothek.
    Wenn du das nicht haben willst musst du in Zeile 17 den Wert auf 0x00 setzen und kannst nach Zeile 34 die Methode auslaufen lassen. Was bedeutet, du kannst mit einer "#" die beiden oben genannten Zeilen ausblenden.

    Franky

  • Wenn du das nicht haben willst musst du in Zeile 17 den Wert auf 0x00 setzen und kannst nach Zeile 34 die Methode auslaufen lassen.

    Danke für den Tipp, aber leider scheint das nicht die Pause zu beeinflussen.

    (und ja, ich habe zur Sicherheit überprüft, ob die MP3 wirklich direkt mit dem Geräusch anfängt und nicht selber noch eine kurze Pause hat)

  • Moinsen,

    Der muss auch vorlesen ! Wenn diese 0,2 Sek wie du sagst dir zu lang sind, weil MP3 ist digital, dazu muss erst einmal ein Stückchen gelesen und verarbeitet werden, damit er was zu spielen hat, musst du entweder ein Playliste machen. Und dann aber play Play-List. Was aber auch nicht so viel bringt, wenn dir diese so gesagten 0,2 mSek zu viel sind, oder du nutzt die Fade-Out bzw. Fade-IN Funkion nacheinander. Damit wird der fertig werdende Titel in der Wiedergabelautstärke bis auf Volume 0 abgeregelt und der neue Titel startet dann bei Volume 0 und erhöht sich dann für die Zeit XX ( bis 5 Sek ) auf das voreingestellte Lautstärke Niveau !?
    Ob daß dann deinen Wünschen noch entspricht :gk1:

    Franky

  • Gibt es evtl eine (mehr oder weniger einfache) Möglichkeit (beispielsweise durch das Vor-Lesen) dem Programm zu sagen, dass es ERST die neue Datei abspielen und dann (einige ms später) die alte beenden soll? Dafür müsste sich der Pico natürlich "merken" können, wie die nächsten paar ms der MP3 weitergehen, weil ich mal stark davon ausgehe dass der DFPlayer selbst immer nur einzelne Dateien lesen kann.

  • Moinsen,

    Das kannst du auch im Tatserdirektbetrieb austesten !



    Das du nur die Taster nur für den betreffenden "Musiktitel" benutzt ! An dieser Vorlesezeit kannst du nicht wirklich viel machen ! Laut erweitertem Herstellerdatenblatt hat oder benötigt dieser Chip ein Vorlesezeit von 120 mSek. Darunter geht nichts. Allerdings wenn du das ganze noch Seriell ansteuerst, dann kommen noch ein paar mSek dazu um diesen Befehlscode zu üübertragen, bzw das dieser Onboard Controller auf diesen Code Reagiert, weil er muss erst diesen Array of Byte(10) Datenblock decodieren um zu wissen was er machen soll.
    Wenn diese Tasterlösung auch in der Kombination erster "Titel" spielt dieses "Einschalten" via Taste "Segment1" das kann dann mit bekannt sein der Zeit ( Spieldauer ) von Segment 1 dann via Verzögerung in den "Segment 2" übergeht um dann diese brummige Wabergeräusch macht, dieses als Loop Spielt bis der letzte Tastendruck dann zum "Segement 3" für der dann ausspielt und den Schlusston abspielen lässt. Wenn das jetzt so via dieser 3 / 4 Tasten ohne den PICO funktioniert, dann müssen wir diese Taster durch elektronische Schaltelemente ersetzen.

    Das heist im manuellen Tasterbetrieb sind die Einlesepausen nicht mehr "So" gravierend, dann muss das ganze via GPIO Direktsteuerung gemacht werden, anstatt über den UART.

    Franky

  • Ok, danke schonmal für den Hinweis. Ich werde es bei Gelegenheit mal damit versuchen.

    Ich frage mich aber auch grad ob ich das lösen könnte, indem ich die PowerDown-Sounds direkt vom Pico abspielen lasse (bspw. hiermit: https://www.coderdojotc.org/mi…ading-the-audio-libraries). Sollte ich dadurch nicht die Möglichkeit haben, erst dem Pico zu sagen, er soll den Sound abspielen und dann erst den vorherigen Sound am MP3-Player beenden? Der PowerDown-Sound ist nur wenige Sek lang, das würde vom Speicher also passen.

    Ist natürlich eine sehr unorthodoxe Art und durch das mischen von MP3 und Wav auch nicht gerade schön, aber ginge das? (bevor ich es versuche...)

  • Moinsen

    Wenn du PCM WAVE auf die Karte schmeisst, was der MP3 Player auch lesen und spielen kann dann sollte weil keine Decodierung stattfinden soll, etwas schneller mit der Wiedergabe beginnen.
    Versuche es doch einfach aus, in dem du die MP3 Files runter nimmst, einen "Wav" Ordner anlegst und dort mal die PCM Wave-Dateien reinschmeist ....

    Franky

  • Versuche es doch einfach aus, in dem du die MP3 Files runter nimmst, einen "Wav" Ordner anlegst und dort mal die PCM Wave-Dateien reinschmeist ....

    Danke für den Hinweis. Habs versucht, war tatsächlich (min. gefühlt) schneller. Nicht perfekt, aber besser!


    Aber kannst Du nicht am PC zwei neue Sound-Dateien erzeugen

    Das Problem ist (falls ich dich richtig verstehe), dass dadurch das Problem nur verschoben werden würde.

    Aktuell habe ich zwei Sounds: einen fürs einschalten, was den klassischen "Rückwärts-Staubsauger-Zeitraffer"-Sound am Anfang hat und danach ins Brummen übergeht. Der zweite Sound ist der fürs ausschalten. Durch diese Kombi kann ich das Lichtschwert lange anlassen und egal wann ich es ausschalte, es kommt der korrekte Aus-Sound. Wenn ich jetzt statt letzterem Sound einen fertigen Übergang zusammenschneiden würde, wäre das Problem nicht behoben, da dann immernoch ein "cut" beim Betätigen des Knopfes käme.

    Ich frage mich aber auch grad ob ich das lösen könnte, indem ich die PowerDown-Sounds direkt vom Pico abspielen lasse

    Das scheint bisher der beste Weg zu sein. Dadurch kann ich den ein-sound und den aus-sound gleichzeitig abspielen. Schade ist nur, dass der Pico erst wartet, bis der aus-sound abgespielt ist bevor er den ein-sound (vom MP3-Player) stoppt. Dadurch gibt es jetzt das gegenteilige Problem, dass der ein-sound wenige ms länger bleibt als der aus-sound, aber es klingt immernoch besser als der cut vorher. Vielleicht kennt sich ja jemand mit dem wavePlayer aus und weiß, ob man da irgendwo ausschalten kann, dass der pico auf das Ende vom Sound wartet?

    Und ein weiteres Problem mit dem Ansatz: Ich nutze für den direkt-sound den Adafruit Mono 2.5W Class D Audio Amplifier - PAM8302 . Leider hat der aber ein recht nerviges rauschen wenn der Pico aktiv ist, selbst wenn ich ihn über eine externe Stromquelle "füttere". Hat da vlt jemand ne Idee?

  • Moinsen,

    Vielleicht kennt sich ja jemand mit dem wavePlayer aus und weiß, ob man da irgendwo ausschalten kann, dass der pico auf das Ende vom Sound wartet?

    Der Software PICO Waveplayer ist relativ statisch. Du kannst das Play nur über einen Timer knallhart abbrechen. Aber damit musst du in weiten Core die Synchronisation umsetzen, wie oder wer nun wegen was als erster Spielt.

    Hat da vlt jemand ne Idee?

    Naja das ist nicht das Problem. Wie viel Watt brauchst du ? Muss es Stereo sein, oder reicht auch MONO - Ton ?
    Prinzipiell erst einmal den Checken , bzw den Plan veröffentlichen, wie der TON aus dem Pico herausfällt !? Dann der Klassiker der LM386 Audioverstärker.
    Bzw wenn du den Ton über mehrere PWM OUT-GPIOs erzeugst - zeige mal bitte dein Verdrahtung - aktueller Stand.

    Franky

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!