"Zufall" im Hörspielmodus verbessern

Hallo allen.

Zu 99,4% nutzen wir den Hörspielmodus.
Obwohl er über Zufall läuft, merkt man doch ab und an dass der Zufall doch recht beschränkt ist. Ein paar Lieder werden deutlich häufiger gewählt, andere teils nie.
Natürlich kann das zufällig genau so passieren, ich möchte aber für den Zufall noch eine andere Lösung in den Ring werfen.
Nur in der Umsetzung brauch ich eure Hilfe mit den richtigen Variablen und der richtigen Stelle im Code.

Zufall = millis() % AnzahlTracksImOrdner +1
Play(Zufall)

Diesem Zufall traue ich auf jeden Fall mehr zu.
Funktioniert leider nicht,wenn man den Hörspielmodus beim Start nutzt.

Was haltet ihr davon?

Hallo Stefan,

Soweit ich weis greift die Random Funktion letztlich auch mit Modulorechnungen auf Millies zu. So wirklich anders ist dein Ansatz also auch nicht. Letztlich ist er auch systematisch, weil der Zeitzuwachs von der Tracklänge abhängt.
Wenn du also in den gleichen Zeitabständen auf die Funktion zugreifst, wirst du ggf ähnliche Ergebnisse erhalten. Da die Zeitabstände durch die Titeldauer definiert sind, ergibt sich eine Systematik. Außerdem schließt der Mechanismus nicht aus, das auch mehrmals das gleiche Ergebnis raus kommt. Also Titel wiederholt werden. Vermutlich, dass was du beobachtest.
In einem Fork von Thomas (weiß leider nicht mehr welcher) habe ich aber eine viel versprechenden Ansatz gefunden. Wenn der eine Zufallswiedergabe startet, so legt er die Titelnummern zunächst der Reihenfolge nach in einem Array ab. Dieses Array mischt er dann zufällig durch, und spielt es von forne nach hinten durch. Wie gut er mischt kann ich nicht bewerten. Aber er kann damit definitiv ausschließen, dass in einem Durchlauf ein Track doppelt kommt.

Das macht der Fork von @Thomas-Lehnert so. Meiner übrigens auch.

Allerdings muss man hier sagen, es wird explizit nach dem Hörspielmodus gefragt. Da kann man ja keine Playliste für anlegen und shuffeln, weil dieser Modus ja immer EINEN track spielt und dann stoppt. Nächste mal Karte auflegen wieder EIN track etc. Da kann man schwer sicherstellen, daß sich da nichts wiederholt da die Möglichkeiten auf einem Arduino doch begrenz sind was Zufall angeht. Davon ab, mein 4 Jähriger Neffe hat sich noch nie beschwert…

Und das „Original“ von @Thorsten auch. Aber halt ausschließlich im Party-Modus und nicht in allen Modi

Eben. Deswegen heißt es bei Thomas auch “all queue”. Weil es in allen Modi (wo es Sinn macht so funktioniert). Bei mir ist es auch so.

Ok, wo kommt dann da überhaupt eine Zufallswiedergabe zum Tragen?
Ist das z.B. für Benjamin Blümchen?
Bei jedem auflegen der Karte kommt eine andere Benjamin Blümchen Folge?

Ich denke der Ansatz lässt sich trotzdem übertragen. Man kann doch eine normierte Liste mischen. Man muss sich ja keine Konkreten Titel merken. Es geht ja nur um eine wechselnde Zahlenfolge. Bei jeder Karte nimmt man den nächste Eintrag im Array. Neu Gemischt wird immer, wenn man am Ende des Arrays ankommt.

Korrekt. Spiele eine zufällige Folge und dann stop.

Aber nicht jede Karte ist mit gleich vielen Tracks verknüft, sodass dann auf jeden Fall noch geprüft werden muss, ob die Zahl im Trackbereich liegt.

1 Like

Dann finde ich den Ansatz sogar hier sinnvoll. Wenn die Benjamin Blümchen Karte das erste Mal aufgelegt wird, dann wird der BB Ordner im Array durch gesmischt und abgespielt.

Da kannst du auch den Party Modus benutzen. Der macht genau das. Und du kannst sogar weiter skippen (was im Hörspiel Modus Prinzip bedingt nicht geht).

Warum nicht? Der Unterschied zwischen Hörspiel und Party ist doch theoretisch nur der automatische Stop. Ansonsten kann man das Hörspiel genauso handhaben wie den Party-Modus. Wenn ein Lied dann zu Ende ist, stoppt man die Wiedergabe, fertig.
Der nächste Titel in der Zufallsliste kommt dann bei
A) Start/Stop-Drücken (wenn der aktuelle Titel zu Ende gespielt wurde)
B) Nächstes-Lied-Taste drücken
C) Erneutem Auflegen der Karte
D) oder anderen Ereignissen
E) Ende des aktuellen Titels → nur für den Party-Modus.
Wenn die Liste am Ende ist, wird sie vor dem nächsten Lied neu gemischt.

In meinem Fork habe ich das so zumindest umgesetzt.

Nur so am Rande. Der Hörspielmodus speichert nichts im EEPROM. Also müsste der Tonuino die ganze Zeit an sein um eine „Playlist“ abzuarbeiten. Tonuino aus → niemand weiß, was bisher abgespielt wurde.

Ich denke das war auch nicht gefordert. Es geht ja nur darum daß sich in einer „Session“ die Tracks nicht wiederholen sollen. Da ist das was @Bastelmatz schreibt schon ein Ansatz.

OK. Ich habe „Session“ hier anders interpretiert. Dachte, es soll zuerst einmal der komplette Ordner „abgearbeitet“ werden, bevor wieder ein Titel wiederholt wird und das unabhängig davon, wie lange der Tonuino läuft.

Huch, was ist denn hier los.
Ich wurde schon korrigiert, dass ich den HörSPIELmodus meine.
Also ich meine den, der ein einzelnes Lied nach zufall spielt und danach wieder ruhig ist.
Jetzt ist das ganze aber ziemlich weit weggedriftet

Ja, das glaube ich auch. Aber er rechnet immer neu bei „randomseed“ und wenn das im setup kommt, ist millis immer identisch.
Deshalb möchte ich den „Zufall“ der Zeit nutzen.

Also selbst mich nervt langsam, dass mir ständig „Wo ist Winnie Wschbär?“ angeboten wird.

Also hier steht nix von millis :thinking::
https://www.arduino.cc/reference/de/language/functions/random-numbers/randomseed/
https://www.arduino.cc/reference/de/language/functions/random-numbers/random/

Hat das Verwenden des analogen, offenen Pins A7 in der DEV Version nicht genau die Funktion, die Zufallsreihenfolge möglichst zufällig zu machen?
Im Vergleich zu einer millis() Abfrage zu irgendeinem Zeitpunkt in einem deterministischen Program ist das Rauschsignal-Lesen doch sicherlich „zufälliger“, oder?

Wenn man aber bestimmte Lieder (erst einmal) nicht mehr hören will, muss man den Zufall „korrigieren“ und eine selbst definierte Liste pflegen. Dabei kann man die Auswahl (ehemals Zufälligkeit :wink:) dann gewichten, bspw. „jedes Lied einmal spielen, bevor wiederholt wird“ oder „das häufigste Lied darf maximal 3x mehr gespielt sein, als das wenigste“. Dazu kommt dann evt. das o.g. Speichern im EEPROM, um diese Abspielhistorie nach einem Neustart fortzuführen.

Dem würde ich auch zustimmen. Aber ich verstehe natürlich, was @raznz_snasna meint. Wenn einem ständig aufgrund des Rauschsignals das gleiche Lied angeboten wird, dann ist das nicht so toll als Papa (das kann ganz schön nervig werden für die Eltern :joy:)

Ähm, ich glaube, das schießt dann doch über das Ziel hinaus :wink: (abgesehen davon, dass Spotify und Co. das ja auch nicht wirklich hinbekommen…)
Man sollte bedenken, für wen der Tonuino Hauptzielgruppe ist.

1 Like

Man könnte versuchen, Hardwaremäßig noch was rauszukitzeln. Der Analogpin 7, der ja als floatingpin zufällig aus dem Störspektrum der Umgebung resultierende Werte auffängt hat ja dadurch daß er mit keiner Leitung verbunden ist ein sehr begrenztes Signal. Man könnte die Stärke der aufgefangen Signale stark erhöhen, indem man einen kurzen Draht ( 2 bis 3 cm) an diesen Pin anschließt. Dieser wirkt wie eine Antenne und sollte den Wertebereich der ausgelesen Signale wesentlich erhöhen. Damit wäre dann auch die Erzeugung des Zufallswertes umfangreicher. Den Versuch wäre es wert, ist ja praktisch kein Aufwand.

Ich ergänze hier mal den commit zum Zufallsgenerator.

Wenn ich das immer mache wenn ich eine Karte auflege, bin ich im maximalen Zufall.

Das denke ich auch.

Und wie geschrieben, es geht mir nicht darum, dass ich jedes einmal gehört haben möchte, bevor das nächste kommt.
Es geht mir darum dass mein Kind abends die Karte 10 mal hintereinander drauf legt, bis ihm etwas zusagt und von den 10 versuchen ist immer mal ein Track (von 98) der dreimal angeboten wird.
Nicht täglich, auch nicht immer der selbe.
Irgendwie zufällig, irgendwie aber auch nicht.

Das werde ich versuchen wenn ich ihn mal wieder liegen habe. Dann nutze ich aber die Chance mir die Werte ausgeben zu lassen um zu vergleichen.

1 Like