{"id":130,"date":"2026-03-16T18:39:43","date_gmt":"2026-03-16T17:39:43","guid":{"rendered":"https:\/\/callerscaddy.de\/?page_id=130"},"modified":"2026-10-15T22:00:24","modified_gmt":"2026-10-15T20:00:24","slug":"release-notes","status":"publish","type":"page","link":"https:\/\/callerscaddy.de\/en\/release-notes\/","title":{"rendered":"Release Notes \u2013 Callers Caddy"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Versionierung: <code>0.XX<\/code> = Prototyp-Phase (XX = Prototyp-Nummer).<br>Ab offiziellem Launch wird auf <code>2.0<\/code> umgestellt.<br>Die Versionen 1.xx bleiben f\u00fcr die alte Version offen<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"667\" src=\"https:\/\/callerscaddy.de\/wp-content\/uploads\/2026\/03\/callers-caddy-release-notes.jpg\" alt=\"\" class=\"wp-image-235\" srcset=\"https:\/\/callerscaddy.de\/wp-content\/uploads\/2026\/03\/callers-caddy-release-notes.jpg 1000w, https:\/\/callerscaddy.de\/wp-content\/uploads\/2026\/03\/callers-caddy-release-notes-300x200.jpg 300w, https:\/\/callerscaddy.de\/wp-content\/uploads\/2026\/03\/callers-caddy-release-notes-768x512.jpg 768w, https:\/\/callerscaddy.de\/wp-content\/uploads\/2026\/03\/callers-caddy-release-notes-18x12.jpg 18w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.162 \u2014 Loop Finder mit Zeitfenstern, Doppelklick in der Playlist &amp; ausgeblendete Sequenzen beim Start (2026-10-15)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Loop Finder: Suchfenster wahlweise als Zeit statt in Prozent.<\/strong> Neben den Presets sitzt ein neuer Umschalter \u201e% \/ Zeit\u201c. Im Zeitmodus gibt man das Loop-In-Fenster ab Songbeginn an (z. B. +0:20 bis +0:59) und das Loop-Out-Fenster vor Songende (z. B. \u22120:50 bis \u22120:20). Das hilft bei Songs, deren Intro und Outro immer etwa gleich lang sind, egal wie lang der Song ist. Beim Umschalten werden die Werte anhand des geladenen Songs umgerechnet. Ist noch kein Song geladen, gelten Standardwerte (Zeit: +0:20 bis +0:59 und \u22120:50 bis \u22120:20). Presets merken sich jetzt, ob sie in Prozent oder als Zeit angelegt wurden. Bestehende Presets gelten weiter als Prozent und laufen unver\u00e4ndert. Der zuletzt gew\u00e4hlte Modus bleibt erhalten und l\u00e4sst sich auch in den Einstellungen unter Loop festlegen. Passen die Fenster nicht zur Songl\u00e4nge, etwa bei einem sehr kurzen Song, wird nicht gesucht und es erscheint ein Hinweis. Das gilt auch f\u00fcr die Regel \u201eAuto-Set Best Loop\u201c. In Potential fragen \u201eAlle Loops setzen\u201c und der Schritt \u201eLoops fehlen\u201c in \u201eMach alles sch\u00f6n\u201c jetzt nach dem Preset. Bisher galten dort feste Fenster (0\u201325 % und 75\u2013100 %). Vorausgew\u00e4hlt ist jetzt \u201eSinging\u201c (7\u201321 % und 64\u201379 %), Patter-Songs bekommen beim einfachen Best\u00e4tigen also k\u00fcrzere Loops als bisher. Wer das alte Verhalten m\u00f6chte, legt sich daf\u00fcr ein eigenes Preset an. Songs, zu deren L\u00e4nge die Fenster nicht passen, werden dort \u00fcbersprungen.<\/li>\n\n\n\n<li><strong>Ausgeblendete Sequenzen auf Wunsch schon beim Start anzeigen.<\/strong> Neu in den Einstellungen unter Sequenzen: \u201eAusgeblendete Sequenzen beim Start anzeigen\u201c. Ist der Haken gesetzt, startet die Sequenzliste so, als h\u00e4tte man per Rechtsklick \u201eAuch ausgeblendete Sequenzen anzeigen\u201c gew\u00e4hlt. Das ist f\u00fcr alle gedacht, die eigene Sequenzen bewusst ohne Call-Mapping pflegen. Standard ist aus. Das gilt auch, wenn man beim Start die vorgeschlagene Lokation best\u00e4tigt und diese ein anderes Tanzprogramm mitbringt. Ein Umschalten per Rechtsklick gilt wie bisher nur bis zum n\u00e4chsten Start. <strong>Hinweis:<\/strong> Sequenzen ohne Zuordnung sind nicht eingestuft. Es k\u00f6nnen also Calls aus anderen Programmen dabei sein, und bei einer sp\u00e4teren \u00c4nderung der Tanzprogramme werden sie nicht automatisch neu eingeordnet. Mit vollst\u00e4ndigem Call-Mapping passiert das von selbst.<\/li>\n\n\n\n<li><strong>Doppelklick in der Playlist startet den Song.<\/strong> Wie in der Songliste spielt ein Doppelklick auf einen Song in der Playlist ihn sofort ab. L\u00e4uft gerade ein anderer Song, wird er dabei beendet, wie schon beim einfachen Klick. Ein Doppelklick auf die Spalte \u201eLoops\u201c \u00f6ffnet weiterhin die Loop-Anzahl. Im Planner bleibt alles beim Alten: Dort entfernt ein Doppelklick den Song aus der Playlist.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Song l\u00f6schen \u00f6ffnet kein Feedback-Fenster mehr.<\/strong> Wurde der gerade geladene Song gel\u00f6scht, erschien das Feedback-Fenster wie nach einem Songende, und Regeln f\u00fcr \u201eSong gestoppt\u201c (z. B. Auto-Advance) liefen an. Jetzt stoppt der Player nach der Best\u00e4tigung still, ohne Feedback und ohne Regeln f\u00fcr den gel\u00f6schten Song. Au\u00dferdem bleibt nichts mehr von ihm stehen: Die Song-Daten sind leer, der Player zeigt \u201ekeine Datei geladen\u201c, die Lyrics sind leer, und alle Eintr\u00e4ge des Songs verschwinden aus der Playlist. Bisher lie\u00df er sich dort per Doppelklick noch starten, obwohl es ihn nicht mehr gab.<\/li>\n\n\n\n<li><strong>ZIP-Import legt keine zweiten Songs mehr auf dieselbe Datei an.<\/strong> Wurde ein Paket mit mehreren Songs fr\u00fcher zusammengefasst importiert, h\u00e4ngen die weiteren Songs als Varianten am ersten, z. B. \u201eRed Feather\u201c an \u201eLet&#8217;s Dance\u201c. Importierte man dasselbe Paket sp\u00e4ter getrennt, entstand \u201eRed Feather\u201c ein zweites Mal als eigener Song, verkn\u00fcpft mit derselben Datei. Jetzt zeigt die Vorschau \u201eIst schon als Variante bei \u201eLet&#8217;s Dance\u201c verkn\u00fcpft und wird \u00fcbersprungen\u201c, und der Import \u00fcberspringt die Datei. Dasselbe gilt f\u00fcr weitere Spuren eines Pakets, die schon bei einem anderen Song verkn\u00fcpft sind. Die Ergebnismeldung nennt die \u00fcbersprungenen Dateien.<\/li>\n\n\n\n<li><strong>Kein Crash-Report mehr, wenn man das Programm kurz nach dem Start schlie\u00dft.<\/strong> Etwa drei Sekunden nach dem Start baut das Programm den Evening Planner im Hintergrund vor. Wurde es vorher geschlossen, griff dieser Vorbau auf die schon geschlossene Datenbank zu und erzeugte einen Crash-Report. Jetzt entf\u00e4llt der Vorbau in diesem Fall einfach.<\/li>\n\n\n\n<li><strong>Ger\u00e4te-Auswahl in der Statusleiste w\u00e4hrend des Vorh\u00f6rens.<\/strong> Wer w\u00e4hrend des Vorh\u00f6rens unten rechts ein anderes Ausgabeger\u00e4t w\u00e4hlte, holte das Vorh\u00f6ren auf dieses Ger\u00e4t, also auf den Hauptausgang. Nach dem Vorh\u00f6ren lief die Musik dann wieder \u00fcber das alte Ger\u00e4t, obwohl Liste und Knopf das neue zeigten. Jetzt bleibt das Vorh\u00f6ren auf dem Vorh\u00f6r-Kanal, und danach l\u00e4uft die Musik \u00fcber das gew\u00e4hlte Ger\u00e4t, genauso wie bei einer \u00c4nderung in den Einstellungen.<\/li>\n\n\n\n<li><strong>Der Tooltip zur Timer-Warnung beschreibt jetzt, was tats\u00e4chlich passiert.<\/strong> Unter Einstellungen \u2192 Player stand bei \u201eTimer-Warnung 1\u201c und \u201eTimer-Warnung 2\u201c, die Warnung komme X Sekunden vor Ablauf der Songzeit. Tats\u00e4chlich z\u00e4hlt die Warnung ab dem Abspielbeginn: Bei 240 f\u00e4rbt sich die Spieldauer-Anzeige nach 4 Minuten Spieldauer in die erste Warnfarbe. Der Tooltip sagt das jetzt so, auf Deutsch, Englisch und Japanisch.<\/li>\n\n\n\n<li><strong>Lokationen behalten ihre Tanzprogramme bei einem Update.<\/strong> Wenn ein Update die mitgelieferten Figuren- und Programmdaten erneuerte, bekamen die Tanzprogramme intern neue Nummern. Die Programm-Zuordnung der Lokationen und die gew\u00e4hlten Tanzprogramme in den Einstellungen zeigten danach ins Leere. Jetzt bleiben die Programme erhalten und werden nur aktualisiert, auch eine selbst eingestellte Ziel-Tanzdauer bleibt stehen. Selbst angelegte Tanzprogramme hielt das Update bisher f\u00fcr mitgelieferte und l\u00f6schte sie. Sie bleiben jetzt ebenfalls erhalten, samt ihrer Zuordnung zu Lokationen.<\/li>\n\n\n\n<li><strong>Sequenzen mit F\u00fcllw\u00f6rtern erscheinen wieder bei gew\u00e4hltem Tanzprogramm.<\/strong> Enthielt eine Sequenz einen Call-Text, der den \u201eFiller Words\u201c zugeordnet ist (z. B. \u201eHeads Back Away\u201c oder \u201eFace Left\u201c), fehlte sie bei jeder Tanzprogramm-Wahl, auch wenn alle ihre Figuren ins Programm passten. In einer gro\u00dfen Sammlung betraf das fast 2.000 Sequenzen. Jetzt z\u00e4hlen F\u00fcllw\u00f6rter nicht mehr gegen das Programm. Neu ist au\u00dferdem die Figur \u201eFace (In\/Out\/Left\/Right\/Partner\/Corner)\u201c, die ebenso vor allen Programmen steht. Beides kommt mit dem Update von selbst, ein Import ist nicht n\u00f6tig.<\/li>\n\n\n\n<li><strong>Zoom, automatische Schriftgr\u00f6\u00dfe und automatische Breite der Lyrics wirken jetzt aus den Einstellungen.<\/strong> Bisher wurden die drei Werte unter Lyrics zwar gespeichert, das Lyrics-Fenster blieb aber unver\u00e4ndert, und beim Beenden stand wieder der alte Zustand in den Einstellungen. Jetzt wirkt ein neuer Zoom sofort und schaltet die automatische Schriftgr\u00f6\u00dfe und Breite ab, genau wie die Zoom-Kn\u00f6pfe im Fenster. Wer im selben Schritt einen Auto-Haken setzt, beh\u00e4lt die Automatik. Sind beide Auto-Haken gesetzt, gilt wie beim Start die automatische Breite.<\/li>\n\n\n\n<li><strong>Zoom f\u00fcr Sequenzen und Notizen geht in den Einstellungen nur noch bis 200 %.<\/strong> Der Einstellungsdialog erlaubte bis zu 300 %, die Fenster selbst zeigen aber h\u00f6chstens 200 %. Wer zum Beispiel 250 % eintrug, sah trotzdem 200 %. Jetzt endet die Auswahl dort, wo auch die Zoom-Kn\u00f6pfe im Fenster enden.<\/li>\n\n\n\n<li><strong>Ein ge\u00e4nderter Erste-Notiz-Faktor wirkt jetzt.<\/strong> Wer in den Einstellungen unter Notizen den \u201eErste-Notiz-Faktor\u201c \u00e4nderte, sah bisher keine Wirkung, und nach dem n\u00e4chsten Start stand wieder der alte Wert da. Jetzt wird die oberste offene Notiz sofort in der neuen Gr\u00f6\u00dfe angezeigt, und der Wert bleibt erhalten.<\/li>\n\n\n\n<li><strong>Einstellungen zeigen bei fehlender Einstellungsdatei die richtige Fade-Out-Dauer und den richtigen Skin.<\/strong> Fehlte die mitgelieferte Einstellungsdatei, etwa nach dem L\u00f6schen, zeigte der Einstellungsdialog als Fade-Out-Dauer 0 s und den ersten Skin der Liste. Das Programm verwendete aber 3 s und den Skin \u201edefault\u201c. Jetzt zeigt der Dialog die Werte, die tats\u00e4chlich gelten.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.161 \u2014 Audio-Ausgang per Klick umschalten, Song-Typ \u201eSonstiges\u201c &amp; In-Lesebalken Countdown (2026-10-10)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Audio-Ausgang mit einem Klick umschalten.<\/strong> Unten rechts in der Statusleiste, links neben der Ger\u00e4te-Auswahl, sitzt ein neuer Knopf mit der Ziffer 1 oder 2. Er schaltet die Musik zwischen den beiden Ger\u00e4ten um, die unter Einstellungen \u2192 Audio schon gew\u00e4hlt sind: 1 ist der Hauptausgang, 2 der Vorh\u00f6r-Kanal. Das geht auch bei laufender Musik. In der Ger\u00e4te-Auswahl tragen die beiden Favoriten die Ziffer vor dem Namen und sind farbig hervorgehoben, damit man sie in der langen Liste sofort findet. Wer in der Liste ein anderes Ger\u00e4t w\u00e4hlt, macht es wie bisher zum Hauptausgang und damit zum neuen Favoriten 1. Beim Programmstart gilt immer Favorit 1.<\/li>\n\n\n\n<li><strong>Neuer Song-Typ \u201eSonstiges\u201c (englisch \u201eOther\u201c).<\/strong> F\u00fcr Musik, die weder Patter noch Singing Call ist, etwa den Friendship-Ring-Song oder Happy Birthday. In den Song-Daten gibt es daf\u00fcr ein drittes H\u00e4kchen neben Patter und Singing Call; es schaltet die beiden anderen ab und geht aus, sobald eines davon angekreuzt wird. In Songliste und Planner tragen solche Songs das K\u00fcrzel \u201eO\u201c, der Filter hat den neuen Eintrag \u201eSonstiges\u201c, ebenso die Statistik (dort hei\u00dft \u201eBeide\u201c jetzt \u201eAlle\u201c). Beim Import und im ZIP-Import l\u00e4sst sich \u201eSonstiges\u201c als Typ w\u00e4hlen. F\u00fcr Regeln gibt es die Bedingung \u201eSong Type = Other\u201c und bei \u201eLoad Song\u201c die Auswahl \u201eOther\u201c. Songs vom Typ \u201eSonstiges\u201c werden nicht in Tips eingeplant, und die Potential-Pr\u00fcfungen f\u00fcr Patter und Singing Calls lassen sie aus. Songs, bei denen bisher keins der beiden H\u00e4kchen gesetzt war, gelten automatisch als \u201eSonstiges\u201c; an den gespeicherten Daten \u00e4ndert sich nichts.<\/li>\n\n\n\n<li><strong>Falsche Zuordnung direkt aus dem Sequenz-Detail beheben.<\/strong> Ein Rechtsklick auf einen Call im Sequenz-Detail bietet jetzt \u201eCall-Mapping f\u00fcr diesen Call \u00e4ndern\u201c an. Das Call-Mapping \u00f6ffnet sich gefiltert auf genau diesen Call; nach dem Speichern zeigt das Sequenz-Detail weiter dieselbe Sequenz, sofort mit der neuen Zuordnung und dem passenden Tanzprogramm. Das gilt auch, wenn das Call-Mapping \u00fcber das Men\u00fc ge\u00f6ffnet wurde. Die Best\u00e4tigungsmeldung nach dem Speichern im Call-Mapping entf\u00e4llt, das spart einen Klick. Praktisch, wenn hinter einem Call ein unerwartetes Tanzprogramm steht.<\/li>\n\n\n\n<li><strong>Der Lesebalken l\u00e4uft nicht mehr dem Gesang voraus und erreicht das Ende der Figure.<\/strong> Vor dem ersten Sync-Punkt wartet er jetzt auf der ersten Textzeile des Abschnitts und l\u00e4uft erst so sp\u00e4t los, dass er im Tempo des folgenden Texts am Sync-Punkt ankommt; bisher wanderte er schon ab Sekunde 0 durch den Opener. Springt der Text f\u00fcr eine Wiederholung zur\u00fcck, l\u00e4uft der Balken vorher im bisherigen Tempo bis zur letzten Zeile des Abschnitts weiter, statt auf der Zeile des letzten Sync-Punkts stehen zu bleiben. Der Auto-Scroll folgt derselben Linie. Tipp: Je mehr Sync-Punkte gesetzt sind, desto genauer l\u00e4uft der Balken.<\/li>\n\n\n\n<li><strong>Neuer \u201eIn-Lesebalken Countdown\u201c.<\/strong> Am rechten Rand des Lesebalkens z\u00e4hlt eine Zahl die Beats bis zum n\u00e4chsten Abschnittswechsel herunter (Opener, Figure, Middle Break, Closer), auch w\u00e4hrend der Balken am Ende einer Figure wartet. Standard sind 8 Beats Vorlauf. Abschalten und Vorlauf \u00e4ndern unter Einstellungen \u2192 Lyrics (\u201eIn-Lesebalken Countdown\u201c und \u201eIn-Lesebalken Countdown: Vorlauf\u201c). Der Countdown braucht Sync-Punkte und einen BPM-Wert des Songs.<\/li>\n\n\n\n<li><strong>Playlist zeigt den Song-Typ, die Abspielart stellt man im Loop-Dialog ein.<\/strong> Die Spalte \u201eP\/S\u201c in der Playlist und im Planner hei\u00dft jetzt \u201eTyp\u201c und zeigt, was der Song ist: P, S, PS oder O. Ein Klick auf die Spalte schaltet nicht mehr zwischen Patter und Singing Call um. Ob ein Eintrag loopt oder einmal durchl\u00e4uft, steht wie bisher in der Spalte \u201eLoops\u201c; ein Doppelklick dort \u00f6ffnet den Loop-Dialog, der daf\u00fcr die neue Wahl \u201eEinmal durchspielen\u201c hat. Die Wiedergabe richtet sich jetzt nach dieser Wahl: Ein Patter auf \u201eEinmal durchspielen\u201c loopt nicht mehr, und ein Song, der Patter und Singing Call zugleich ist, spielt auf dem Singing-Platz aus dem Abendplaner einmal durch statt zu loopen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Einstellungen schalten beim Speichern nichts mehr ungefragt ab.<\/strong> Nach einer Neuinstallation zeigte der Einstellungsdialog bei \u201eStatusleisten-Player anzeigen\u201c, \u201eStart-Countdown anzeigen\u201c und \u201eGleichstand zuf\u00e4llig sortieren\u201c keinen Haken, obwohl die Funktionen an waren. Wer irgendeine andere Einstellung speicherte, schaltete diese drei damit ab dem n\u00e4chsten Start ab. Jetzt zeigt der Dialog den richtigen Haken und speichert nur, was man tats\u00e4chlich ge\u00e4ndert hat. Au\u00dferdem erscheint und verschwindet der Statusleisten-Player sofort, wenn man ihn in den Einstellungen ein- oder ausschaltet, ohne Neustart. Tipp: Wer die Einstellungen schon einmal gespeichert hat, sollte die drei Haken pr\u00fcfen und bei Bedarf wieder setzen.<\/li>\n\n\n\n<li><strong>Die Einstellungen zeigen bei Zoom und \u201eErste-Notiz-Faktor\u201c den Wert, der wirklich gilt.<\/strong> Nach einer Neuinstallation stand der Zoom f\u00fcr Sequenzen, Notizen und Lyrics im Einstellungsdialog auf 50 % und der Erste-Notiz-Faktor auf 1,0, obwohl das Programm mit 100 % und 4,0 arbeitete. Jetzt zeigt der Dialog 100 % und 4,0.<\/li>\n\n\n\n<li><strong>Eine ge\u00e4nderte Lyrics-Datei kommt jetzt an.<\/strong> Wer eine Lyrics-Datei au\u00dferhalb von Callers Caddy \u00fcberarbeitet und sie in den Song-Daten neu ausw\u00e4hlt oder den Song neu importiert, sah bisher weiter den alten Text, weil im Lyrics-Ordner noch die alte gleichnamige Kopie lag. Jetzt wird eine in den Song-Daten gew\u00e4hlte Datei in den Lyrics-Ordner \u00fcbernommen. Liegt dort schon eine gleichnamige Datei mit anderem Inhalt, fragt Callers Caddy nach und zeigt \u00c4nderungsdatum und Gr\u00f6\u00dfe beider Dateien samt Vermutung, welche die neuere Fassung ist. Zur Wahl stehen: ersetzen (die bisherige Fassung bleibt als .bak-Datei erhalten; ist die Datei gerade im Lyric-Fenster zu sehen, erscheint sofort der neue Text; vorhandene SyncPoints bitte danach pr\u00fcfen), beide behalten (die neue bekommt eine Nummer am Namen) oder die vorhandene weiterverwenden. Beim Import mehrerer Songs kommt die R\u00fcckfrage einmal am Ende als Liste. Wollen dabei mehrere neue Dateien dieselbe Datei im Lyrics-Ordner ersetzen, kann das nur die erste; die weiteren stehen auf \u201eBeide behalten\u201c, damit keine Fassung verloren geht.<\/li>\n\n\n\n<li><strong>Jeder Sync-Punkt l\u00e4sst sich per Rechtsklick bearbeiten, egal wo in der Zeile er steht.<\/strong> Nach einer \u00c4nderung an der Lyrics-Datei au\u00dferhalb von Callers Caddy oder nach einer anderen Fensterbreite konnte ein Sync-Punkt mitten in oder am Ende einer Zeile stehen. Der Rechtsklick bot dann nur \u201eAlle Sync-Punkte verschieben\u201c und \u201eAlle Sync-Punkte l\u00f6schen\u201c an. Jetzt zeigt er alle Sync-Punkte der angeklickten Textzeile, mit Zeit setzen, Zeile verschieben und L\u00f6schen. Ein Linksklick setzt einen neuen Sync-Punkt immer an den Anfang der Textzeile, auch wenn die Zeile im Fenster umbrochen ist und man auf ihre zweite Bildschirmzeile klickt.<\/li>\n\n\n\n<li><strong>Die Regel-Aktion \u201eLoad Song\u201c l\u00e4sst die Filter der Songliste in Ruhe.<\/strong> Bisher stellte sie den Typ-Filter der Songliste auf den Typ aus der Regel, etwa auf \u201ePatter\u201c, und lie\u00df ihn so stehen. Wer danach ein Genre mit Singing Calls w\u00e4hlte, sah eine leere Liste. Jetzt l\u00e4dt die Aktion den Song nur in den Player. In der Songliste ist er markiert, wenn die aktuellen Filter ihn zeigen.<\/li>\n\n\n\n<li><strong>Songs ohne Loop-Punkte spielen in der Playlist einmal durch.<\/strong> Ein Song ohne Loop-Punkte, etwa ein Song, der Patter und Singing Call zugleich ist, kam auf manchen Wegen mit der Abspielart \u201eloopen\u201c in die Playlist: Die Spalte \u201eLoops\u201c zeigte \u221e, der Planner rechnete mit der Patter-Ziell\u00e4nge statt mit der Songl\u00e4nge, und umstellen lie\u00df sich das nicht, weil der Loop-Dialog ohne Loop-Punkte nicht aufgeht. Jetzt spielt ein solcher Song beim Einf\u00fcgen immer einmal durch. Ein reiner Patter ohne Loop-Punkte loopt weiter als ganzer Song. Eintr\u00e4ge in schon gespeicherten Playlists behalten ihre Abspielart; dort hilft es, den Song neu einzuf\u00fcgen.<\/li>\n\n\n\n<li><strong>Loop-Dialog bei doppeltem Song \u00e4ndert nur den gew\u00e4hlten Eintrag.<\/strong> Stand derselbe Song zweimal in der Playlist und lief einer davon, \u00fcbernahm der laufende Song alle \u00c4nderungen am anderen Eintrag sofort: Loop-Anzahl, K\u00fcrzung und Abspielart. Stellte man den anderen Eintrag auf \u201eEinmal durchspielen\u201c, h\u00f6rte der laufende Patter auf zu loopen. Jetzt wirkt eine \u00c4nderung nur auf den laufenden Song, wenn man genau seinen Eintrag bearbeitet.<\/li>\n\n\n\n<li><strong>Sonstiges-Songs in der Playlist spielen einmal durch.<\/strong> Ein von Hand in die Playlist gelegter Song vom Typ \u201eSonstiges\u201c wurde wie ein Patter behandelt und mit der Einstellung \u201ePatter-F\u00fcllung im Planner\u201c = \u201eAuf Ziell\u00e4nge optimieren\u201c auf Patter-L\u00e4nge gestreckt. Jetzt l\u00e4uft er einmal durch, wie ein Singing Call.<\/li>\n\n\n\n<li><strong>Patter-F\u00fcllung auch \u00fcber die Songliste und den Abendplaner.<\/strong> Mit der Einstellung \u201ePatter-F\u00fcllung im Planner\u201c = \u201eAuf Ziell\u00e4nge optimieren\u201c wurden Patter, die \u00fcber den Songlisten-Button oder \u201e\u00dcbernehmen zur Playlist\u201c im Abendplaner kamen, nicht auf die Ziell\u00e4nge gebracht. Jetzt gilt die Einstellung f\u00fcr alle Wege in die Playlist.<\/li>\n\n\n\n<li><strong>Echte Umlaute und \u00df in der deutschen Oberfl\u00e4che.<\/strong> Texte wie \u201eLoeschen\u201c, \u201efuer\u201c oder \u201eMenue\u201c hei\u00dfen jetzt \u201eL\u00f6schen\u201c, \u201ef\u00fcr\u201c und \u201eMen\u00fc\u201c, aus \u201eGr\u00f6sse\u201c und \u201eSchliessen\u201c wird \u201eGr\u00f6\u00dfe\u201c und \u201eSchlie\u00dfen\u201c.<\/li>\n\n\n\n<li><strong>Deaktivierte Player-Buttons ganz in den Farben des Skins.<\/strong> Solange nichts l\u00e4uft, hatten die Symbole von Pause, Stop und Fade out ein blasses Grau, das zu keiner Farbe des Skins passte; besonders auff\u00e4llig bei farbiger Button-Schrift. Jetzt haben Symbol und Beschriftung eines deaktivierten Buttons dieselbe Farbe aus dem Skin. Das gilt auch f\u00fcr Play vor dem ersten Laden eines Songs.<\/li>\n\n\n\n<li><strong>New Songs: Buttons sauber ausgerichtet.<\/strong> Die Kanten der beiden Button-Reihen (Set In, Clear Loop, Set Out, Test und darunter Find Loop, Snap, Set Marker) lagen um ein paar Pixel versetzt. Jetzt stehen sie in einem gemeinsamen Raster und fluchten, bei jeder Breite des Fensters und in allen Sprachen.<\/li>\n\n\n\n<li><strong>Klarere Hinweise beim Start, wenn das Datenbank-Update unvollst\u00e4ndig bleibt.<\/strong> Konnte das Update der Datenbank nicht alles nachr\u00fcsten, lagen ab dem zweiten Start zwei Dialoge \u00fcbereinander: der Hinweis auf das Update und ein Hinweis auf ein neues Fehlerprotokoll. Au\u00dferdem kam bei jedem Start ein weiteres Fehlerprotokoll mit immer demselben Inhalt dazu. Jetzt erscheinen die Hinweise nacheinander statt \u00fcbereinander, und ein neues Fehlerprotokoll entsteht nur, wenn sich das Problem ge\u00e4ndert hat.<\/li>\n\n\n\n<li><strong>Update von sehr alten Versionen startet wieder.<\/strong> Wer von einem fr\u00fchen Stand aus der Zeit vor den Tanzprogrammen (etwa M\u00e4rz 2026) direkt auf eine aktuelle Version wechselte, bekam beim Start einen Fehler, und Callers Caddy \u00f6ffnete sich nicht. Jetzt wird auch eine solche Datenbank beim ersten Start vollst\u00e4ndig auf den neuen Stand gebracht. Klappt dabei einmal etwas nicht, startet das Programm trotzdem, zeigt sofort einen deutlichen Hinweis und legt ein Fehlerprotokoll an, das man dem Entwickler schicken kann.<\/li>\n\n\n\n<li><strong>Tanzprogramm hinter jedem Call-Text im Sequenz-Detail.<\/strong> Bisher stand das kleine graue Tanzprogramm nur hinter einem Teil der Call-Texte, etwa bei \u201eGirls Fold\u201c, aber nicht bei \u201eDosado\u201c oder \u201eSwing Thru\u201c. Jetzt steht es hinter jedem zugeordneten Call-Text, passend zur Tanzprogramm-Wahl: das niedrigste angehakte Tanzprogramm, in dem die Figur vorkommt. Sind \u201eMainstream (2026)\u201c und \u201ePlus (2026)\u201c angehakt, steht hinter \u201eDosado\u201c also \u201eMainstream (2026)\u201c. Kommt die Figur in keinem angehakten Tanzprogramm vor oder ist keins angehakt, steht das niedrigste Tanzprogramm \u00fcberhaupt da. Enth\u00e4lt ein Call-Text mehrere Figuren, z\u00e4hlt die h\u00f6chste. Ein Wechsel der Tanzprogramm-Wahl wirkt sofort.<\/li>\n\n\n\n<li><strong>Statistik bei geteilter Historie.<\/strong> Teilt eine Lokation ihre Spielhistorie mit einer anderen, zeigte die Statistik f\u00fcr sie keine oder zu wenige gespielte Songs. Jetzt erscheinen dort alle Plays der gemeinsamen Historie, genau wie bei \u201eZuletzt gespielt\u201c.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.160 \u2014 Lesebalken in den Lyrics, Zuordnungs-Import mit Konfliktkl\u00e4rung &amp; Song-Katalog (2026-10-01)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Lesebalken im Lyric-Fenster: Der Text, der gerade zu singen ist, ist farbig hinterlegt.<\/strong> Wer kurz vom Bildschirm wegschaut, findet die Stelle sofort wieder. Der Balken folgt dem gesungenen Text, auch wenn \u201eTextsprung timen\u201c fr\u00fcher scrollt, und wandert dann eben etwas nach oben. Ein Abschnitt z\u00e4hlt dabei von der ersten Zeile nach der \u00dcberschrift (OPENER, FIGURE \u2026) bis zum Ende seiner letzten Zeile, auch wenn die SyncPoints auf der \u00dcberschrift sitzen. Er funktioniert mit und ohne SyncPoints; im SyncPoint- und im Bearbeiten-Modus ist er aus. Neu in den Einstellungen (Lyrics): \u201eLeseposition\u201c legt fest, in welcher H\u00f6he des Fensters der gesungene Text steht (0 % = oben, 100 % = unten, vorbelegt 30 %: man sieht noch etwas vom gerade Gesungenen und mehr vom Text, der kommt). Dazu \u201eLesebalken anzeigen\u201c (vorbelegt an), \u201eLesebalken-H\u00f6he\u201c (vorbelegt 20 %) und \u201eLesebalken-Deckkraft\u201c (30 %); die Farbe kommt aus dem Theme. Bisher stand der aktuelle Text mit SyncPoints in der Fenstermitte und ohne SyncPoints anteilig zur Songl\u00e4nge.<\/li>\n\n\n\n<li><strong>Textsprung und Texttausch der Lyrics lassen sich zeitlich verschieben.<\/strong> Zwei neue Einstellungen in der Gruppe Lyrics, jeweils in ganzen Sekunden von \u221210 bis +10: \u201eTextsprung timen\u201c verschiebt, wann der Auto-Scroll die Zeile eines SyncPoints erreicht, und \u201eTexttausch timen\u201c verschiebt bei Dynamic Lyrics den Sequenzwechsel und den Heads\/Sides-Tausch. Vorbelegt sind jeweils \u22124: Der n\u00e4chste Text steht vier Sekunden fr\u00fcher da, so bleibt Zeit zum Vorbereiten, statt mitten im Callen vom Tausch \u00fcberrascht zu werden. Die SyncPoints selbst bleiben unver\u00e4ndert, und im SyncPoint-Modus scrollt der Text weiter genau zur gespeicherten Zeit. Wer das bisherige Verhalten will, stellt beide Werte auf 0.<\/li>\n\n\n\n<li><strong>Beim Import von Zuordnungen (Men\u00fc \u201eZuordnungen importieren\u201c) werden abweichende Zuordnungen nicht mehr stillschweigend \u00fcbersprungen.<\/strong> Bisher \u00fcbernahm der Import nur Call-Texte, die lokal noch gar nicht zugeordnet waren; alles andere fiel ohne Hinweis weg. Jetzt zeigt ein Dialog jeden Call-Text, der lokal anders zugeordnet ist als in der Datei, und man w\u00e4hlt je Zeile: A lokal behalten, B aus der Datei \u00fcbernehmen oder C die Figuren selbst w\u00e4hlen. Vorausgew\u00e4hlt ist eine Empfehlung (mehr Figuren zuerst, dann die verl\u00e4sslichere Quelle: manuell vor abgeleitet vor automatisch). Vier Kn\u00f6pfe setzen alle Zeilen auf einmal: linke Seite, rechte Seite, n\u00e4her am Mengen-Vorschlag, n\u00e4her an manuell; selbst gew\u00e4hlte Zeilen (C) bleiben dabei stehen. Figuren, die es hier nicht gibt, werden \u00fcbersprungen und am Ende genannt. Der Export schreibt jetzt ein neues Format mit Mehrfach-Figuren und Figurennamen; \u00e4ltere Export-Dateien lassen sich weiterhin importieren. <strong>Achtung:<\/strong> Callers Caddy 0.159 und \u00e4lter kann Dateien im neuen Format nicht importieren \u2013 wer Zuordnungen mit anderen Callern tauscht, sollte vorher aktualisieren.<\/li>\n\n\n\n<li><strong>Dynamic Lyrics kann Heads und Sides in ausgew\u00e4hlten Figures tauschen.<\/strong> Ein neuer Spiegel-Button direkt hinter \u201eDynamic Lyrics\u201c tauscht in den eingeblendeten Sequenzen Heads und Sides, damit ein Singing Call wahlweise HHSS (Figure 3 und 4), HSSH (Figure 2 und 3) oder HSHS (Figure 2 und 4) getanzt wird. Getauscht werden alle \u00fcblichen Schreibweisen (Heads\/Sides, Head\/Side, HDS\/SDS, \u201e(H)\u201c\/\u201e(S)\u201c) samt Couple-Nummern (1\u21922\u21923\u21924\u21921); \u201eeach side\u201c, \u201efirst couple\u201c oder Formationen wie \u201e3 &amp; 1 Lines\u201c bleiben stehen, und Sequenzen mit benachbarten Paaren oder \u201eYour Couple Number\u201c werden gar nicht angefasst. Beim ersten Klick f\u00fchrt der Button in die Einstellungen (Lyrics), wo die Art gew\u00e4hlt wird; mit dem Speichern der ersten Art ist der Tausch gleich eingeschaltet, danach schaltet der Button an und aus, synchron mit dem Schalter in den Einstellungen. Die Lyric-Datei bleibt unver\u00e4ndert. Au\u00dferdem beh\u00e4lt Dynamic Lyrics jetzt beim Wechsel der Sequenz, beim Tauschen und beim Ausschalten die aktuelle Schriftgr\u00f6\u00dfe; bisher sprang der Text auf die Gr\u00f6\u00dfe vom Einschalt-Zeitpunkt zur\u00fcck und wurde dabei oft deutlich kleiner.<\/li>\n\n\n\n<li><strong>Frisch importierte Sequenzen lassen sich jetzt leicht wiederfinden.<\/strong> Haben ihre Call-Texte noch keine Zuordnung, blendet die Tanzprogramm-Wahl oder das Limit sie aus \u2013 bisher ohne Hinweis. Neu im Rechtsklick-Men\u00fc der Sequenzliste (auch wenn die Liste leer ist): \u201eAuch ausgeblendete Sequenzen anzeigen\u201c. Es hebt Enth\u00e4lt, Limit und Nur-Filter auf, setzt die Tanzprogramm-Wahl nur f\u00fcr diese Liste aus (die Statuszeile sagt es an; der n\u00e4chste Filter- oder Programmwechsel hebt das wieder auf) und springt ans Ende, wo die neuesten Sequenzen stehen. Typ, Schwierigkeit und Tags bleiben stehen. Sequenzen mit Call-Texten ohne Zuordnung sind rot markiert; per Rechtsklick \u201eCall-Mapping f\u00fcr diese Sequenz \u00f6ffnen\u201c geht das Call-Mapping gleich gefiltert auf genau diese Call-Texte auf. Zur\u00fcck geht es per Rechtsklick \u201eNicht zugeordnete Sequenzen ausblenden\u201c: Die roten Sequenzen verschwinden wieder, und die Tanzprogramm-Wahl gilt wie beim Start. Eine im Sequenz-Editor neu angelegte Sequenz mit Call-Texten ohne Zuordnung zeigt die Liste nach dem Speichern auf demselben Weg an.<\/li>\n\n\n\n<li><strong>Neuer Knopf \u201eOptimieren\u201c im Call-Mapping \u00fcbernimmt die Mengen-Vorschl\u00e4ge auf einen Schlag.<\/strong> Er nimmt genau die Zeilen, die der Filter \u201eVorschlag weicht ab\u201c zeigt, und fragt vorher nach \u2013 getrennt nach drei Gruppen mit eigener Anzahl und eigenem Haken: Call-Texte ohne Zuordnung neu zuordnen, unvollst\u00e4ndige Zuordnungen um fehlende Figuren erg\u00e4nzen, und Zuordnungen \u00e4ndern, deren Vorschlag anders abweicht. Nur die angehakten Gruppen werden geschrieben, Abbrechen \u00e4ndert nichts. Die so \u00fcbernommenen Zuordnungen stehen in der Spalte \u201eQuelle\u201c als \u201eabgeleitet\u201c und lassen sich damit von Hand gesetzten unterscheiden; die B\u00e4nder der Sequenzen werden gleich nachgerechnet.<\/li>\n\n\n\n<li><strong>Die Mustererkennung f\u00fcr zusammengesetzte Call-Texte wirkt jetzt auch im Sequenz-Editor.<\/strong> Bisher schlug sie nur im Call-Mapping vor; beim Eintippen einer Sequenz hakte der Doppelklick weiter genau eine Figur an \u2013 und nur, wenn der Text noch gar keine Zuordnung hatte. Jetzt hakt der Auswahldialog bei Texten wie \u201eHeads Touch 1\/4 &amp; Roll&#8220; alle erkannten Figuren vor, auch wenn schon eine unvollst\u00e4ndige Zuordnung existiert (die bestehenden Haken bleiben erhalten). Zeilen, bei denen die Erkennung noch fehlende Figuren vorschl\u00e4gt, sind gelb statt gr\u00fcn markiert \u2013 ein Doppelklick lohnt sich dort. \u00dcbernommen wird wie bisher erst mit \u201eOK&#8220;; Abbrechen \u00e4ndert nichts.<\/li>\n\n\n\n<li><strong>Beim Speichern im Sequenz-Editor fragt Callers Caddy nach, ob offene Vorschl\u00e4ge \u00fcbernommen werden sollen.<\/strong> Sind beim Speichern noch gelbe Zeilen \u00fcbrig, kommt einmal die Frage \u201eN Call-Texte haben Vorschl\u00e4ge mit noch fehlenden Figuren \u2013 jetzt \u00fcbernehmen?\u201c. Darunter steht je Call-Text, welche Figuren dazukommen (etwa \u201eHeads Touch 1\/4 &amp; Roll \u2192 + (Anything) &amp; Roll\u201c) \u2013 wichtig, weil eine Zuordnung f\u00fcr alle Sequenzen mit diesem Text gilt. Bei mehr als zehn Call-Texten zeigt die Frage die ersten zehn, die komplette Liste steht unter \u201eDetails\u201c. Bei \u201eJa\u201c bekommen diese Call-Texte ihre bisherigen Figuren plus die vorgeschlagenen, als \u201eabgeleitet\u201c gekennzeichnet \u2013 die Sequenz wird damit gleich richtig eingestuft. Bei \u201eNein\u201c wird ohne sie gespeichert. Gespeichert wird die Sequenz in beiden F\u00e4llen. Ohne gelbe Zeile gibt es keine Frage; beim Start, beim Import und \u00fcber das Zahnrad wird weiterhin nichts ungefragt zugeordnet.<\/li>\n\n\n\n<li><strong>Die Spalte \u201eQuelle\u201c im Call-Mapping ist jetzt \u00fcbersetzt:<\/strong> \u201eauto\u201c, \u201emanuell\u201c und \u201eabgeleitet\u201c statt der englischen Werte.<\/li>\n\n\n\n<li><strong>Doppelklick auf einen Jump-Marker startet die Wiedergabe direkt an dieser Stelle.<\/strong> Ein einfacher Klick springt wie bisher nur hin; l\u00e4uft die Musik schon, springt auch der Doppelklick nur. Aus dem Stopp oder der Pause heraus startet er wie der Play-Button \u2013 und zwar so, dass genau die Marker-Stelle als Erstes zu h\u00f6ren ist (die kurze Einschwingzeit beim Start wird vorher abgezogen). Der Tooltip weist darauf hin.<\/li>\n\n\n\n<li><strong>\u201eF\u00fcllen\u201c im To-Call-Fenster schl\u00e4gt jetzt das h\u00f6chste gew\u00e4hlte Tanzprogramm vor.<\/strong> Sind etwa Mainstream (2026) und Plus (2026) gew\u00e4hlt, steht der Dialog direkt auf Plus (2026) \u2013 dasselbe Programm, das auch der Programm-Button im Player zeigt. Bisher war es das erste der Auswahl, was meist das niedrigste war.<\/li>\n\n\n\n<li><strong>Der mitgelieferte Song-Katalog (rund 9.100 Square-Dance-Songs) hilft jetzt \u00fcberall beim Erkennen von Titel, Label und Nummer.<\/strong> Beim Import einer Musikdatei schl\u00e4gt Callers Caddy Label und Nummer aus dem Dateinamen im Katalog nach. Passt der Eintrag sicher, bekommt der Song die saubere Schreibweise (aus \u201eAintSheSweet-ESP717\u201c wird \u201eAint She Sweet\u201c, Label \u201eESP 717\u201c) und leere Angaben wie Caller, Original-Interpret, Erscheinungsjahr und Genre werden gleich mit bef\u00fcllt. Zus\u00e4tze wie \u201e(Vocal)\u201c bleiben im Titel erhalten. \u201eMetadaten aus CSV\u201c im Potential-Fenster nutzt den Katalog direkt, eine eigene CSV-Datei l\u00e4sst sich weiterhin w\u00e4hlen. Bei der Cue-Sheet-Suche auf ceder.net und in der Krabbelkiste sucht die App f\u00fcr Songs ohne Label zus\u00e4tzlich mit dem Label aus dem Katalog, wenn der Titel dort eindeutig ist. Au\u00dferdem erkennt der Abgleich jetzt zusammengeschriebene Titel (\u201eRhythmOfTheRain\u201c), Klammer-Zus\u00e4tze (\u201e(Vocal)\u201c) und Apostroph-Varianten (\u201eCant\u201c\/\u201eCan\u2019t\u201c) als denselben Titel. Der Katalog wird regelm\u00e4\u00dfig aktualisiert und kommt mit jedem Release mit.<\/li>\n\n\n\n<li><strong>Rules k\u00f6nnen jetzt auf die Pausen-Uhr reagieren.<\/strong> Die neuen Trigger \u201eBreak Started\u201c und \u201eBreak Finished\u201c feuern, wenn die Pausen-Uhr frisch startet (per Button, Rule-Aktion oder mit Wartemusik) bzw. wenn der Countdown bei 0 ankommt. Fortsetzen nach dem Anhalten und Zur\u00fccksetzen z\u00e4hlen nicht. Die neue Bedingung \u201eBreak Type\u201c unterscheidet, ob die Pause mit oder ohne Wartemusik gestartet wurde. Damit l\u00e4sst sich zum Beispiel bauen: Pause vorbei \u2192 vorbereiteten n\u00e4chsten Song abspielen (\u201eBreak Finished\u201c \u2192 \u201ePlay\u201c). L\u00e4uft beim Ablauf noch Wartemusik, wird sie vorher beendet.<\/li>\n\n\n\n<li><strong>Pilot Square: Namen und Farben lassen sich getrennt l\u00f6schen.<\/strong> Links unten stehen jetzt drei gleich breite Buttons: \u201eNamen l\u00f6schen\u201c, \u201eFarben l\u00f6schen\u201c und \u201eAlles l\u00f6schen\u201c (bisher \u201eLeeren\u201c, Verhalten unver\u00e4ndert). So bleiben etwa die Namen stehen, wenn nur die Farben f\u00fcr den n\u00e4chsten Tip neu verteilt werden sollen. Eine Sicherheitsabfrage kommt nur, wenn es auch etwas zu l\u00f6schen gibt.<\/li>\n\n\n\n<li><strong>Jedes Fenster l\u00e4sst sich jetzt andocken.<\/strong> Der Magnet im Ansicht-Men\u00fc und \u201eFrei bewegen\u201c im Rechtsklick-Men\u00fc der Titelzeile funktionieren f\u00fcr alle Fenster. Bisher waren einige (z. B. Abendplaner, Regeln, Pausen-Uhr) fest auf \u201efrei\u201c gestellt; das ist jetzt nur noch die Voreinstellung, solange man selbst nichts gew\u00e4hlt hat. Au\u00dferdem sind die Fenster im Ansicht-Men\u00fc jetzt alphabetisch sortiert.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sequenzen mit unbekannten Calls erscheinen nicht mehr in der normalen Sequenzliste.<\/strong> Bisher pr\u00fcfte die Tanzprogramm-Wahl nur die Calls einer Sequenz, die schon einer Figur zugeordnet sind; Call-Texte ohne Zuordnung wurden \u00fcbergangen. So konnte bei einer Mainstream-Wahl eine Sequenz auftauchen, die einen unbekannten Plus-Call enth\u00e4lt, und einen am Clubabend \u00fcberraschen. Jetzt sind Sequenzen mit mindestens einem Call-Text ohne Zuordnung immer ausgeblendet, auch ohne gew\u00e4hlte Tanzprogramme. Das gilt auch f\u00fcr Regeln und Shortcodes, die Sequenzen aus der aktuellen Liste nehmen. Sichtbar werden sie \u00fcber \u201eAuch ausgeblendete Sequenzen anzeigen\u201c (rot markiert); dort lassen sie sich per Rechtsklick gleich im Call-Mapping zuordnen. <strong>Hinweis:<\/strong> In Sammlungen mit vielen importierten Sequenzen wird die Liste dadurch deutlich k\u00fcrzer, bis die fehlenden Call-Texte zugeordnet sind.<\/li>\n\n\n\n<li><strong>\u201eTextsprung timen\u201c und \u201eTexttausch timen\u201c sind nach einem Update wirklich auf \u22124 Sekunden vorbelegt.<\/strong> Der Einstellungsdialog zeigte \u22124 an, solange der Wert nicht gespeichert war, verwendet wurde aber 0.<\/li>\n\n\n\n<li><strong>\u00dcberschriften in Lyrics werden beim ersten \u00d6ffnen nicht mehr \u00fcbergro\u00df angezeigt.<\/strong> Mit Auto-Breite oder Auto-Gr\u00f6\u00dfe und eingeschalteten Dynamic Lyrics schrumpfte beim ersten \u00d6ffnen einer Lyric-Datei der Text, w\u00e4hrend \u00dcberschriften ohne eigene Schriftgr\u00f6\u00dfe (etwa \u201eOPENER\u201c) riesig wirkten. Beim zweiten \u00d6ffnen stimmte es wieder. Jetzt hat der Text gleich beim ersten \u00d6ffnen die richtige Gr\u00f6\u00dfe.<\/li>\n\n\n\n<li><strong>Lyrics aus Word sehen aus wie in Word.<\/strong> Anzeige und Bearbeiten-Modus zeigen Lyrics aus Word jetzt so wie Word und jeder Browser: \u00dcberschriften wie \u201eOPENER\u201c haben Schrift und Farbe aus der Datei und sind so gro\u00df wie der Text statt riesig und schwarz, und es erscheinen keine Absatzabst\u00e4nde mehr, die gar nicht in der Datei stehen. Der Bearbeiten-Modus zeigt die Datei immer in Originalgr\u00f6\u00dfe (100 %), damit Text, \u00dcberschriften und Abst\u00e4nde zusammenpassen; Zoom und Auto-Breite sind dort gesperrt. Beim Verlassen gilt wieder der eingestellte Zoom.<\/li>\n\n\n\n<li><strong>Zwei Einstellungen landen jetzt in der <code>callers_caddy.ini<\/code>.<\/strong> Der zuletzt gew\u00e4hlte Ordner beim Sequenz-Import und die Lese-Zone f\u00fcr SyncPoints (<code>lyric_sync\/viewport_frac<\/code>) lagen bisher an anderer Stelle (unter Windows in der Registry). Ein Wert f\u00fcr die Lese-Zone in der INI wirkte deshalb nicht, und der Import-Ordner ging mit der INI nicht mit. Der Import-Dialog startet einmalig wieder im Benutzerordner.<\/li>\n\n\n\n<li><strong>Kein Absturzprotokoll mehr, wenn die App kurz nach dem Start wieder geschlossen wird.<\/strong> Wer Callers Caddy in den ersten Sekunden nach dem Start (bei langsamem Netz auch etwas sp\u00e4ter) wieder schloss, konnte beim Beenden einen harten Abbruch ausl\u00f6sen: Die Update-Pr\u00fcfung lief noch im Hintergrund. Beim n\u00e4chsten Start erschien dann der Hinweis \u201eFehlerprotokoll vorhanden\u201c. Daten gingen dabei nicht verloren. Jetzt endet die Pr\u00fcfung einfach mit dem Programm.<\/li>\n\n\n\n<li><strong>Wer w\u00e4hrend der Pause von Hand einen Song startet, beendet damit die Pause.<\/strong> Bisher lief die Pausen-Uhr einfach weiter; lief Wartemusik, stoppte ihr Ende sogar den neuen Song und lud den Song von vor der Pause neu, die Auswahl des Callers war dann weg. Jetzt ist ein manuelles Play das eindeutige Signal, dass es weitergeht: Die Pausen-Uhr wird zur\u00fcckgesetzt, die Wartemusik gilt als beendet, der Song l\u00e4uft weiter, landet normal in der Historie, und die Rules greifen wieder. Der Trigger \u201eBreak Finished\u201c feuert dabei bewusst nicht, weil die Pause abgebrochen und nicht abgelaufen ist. Vorh\u00f6ren (Audition, Loop-Finder) beendet die Pause nicht. Ohne Eingriff bleibt alles beim Alten.<\/li>\n\n\n\n<li><strong>Typ- und Schwierigkeitsfilter der Sequenzliste bleiben nach dem Call-Mapping stehen.<\/strong> Nach \u201eOK\u201c im Call-Mapping, nach einem Import oder nach dem L\u00f6schen einer Sequenz sprang der Typ bisher auf \u201eSinger\u201c und die Schwierigkeit auf \u201eAlle\u201c zur\u00fcck. Wer eine rote Sequenz etwa unter \u201eTwo Couples\u201c per Rechtsklick ins Call-Mapping geschickt hatte, fand sie danach nicht wieder markiert. Jetzt bleibt die Auswahl erhalten, wie schon bei den Tags.<\/li>\n\n\n\n<li><strong>ZIP-Import erkennt mehrere Songs in einem Paket und fragt nach, ob getrennt importiert werden soll.<\/strong> Packte ein Hersteller zwei Patter-Titel samt Extended-Versionen in ein ZIP, landete alles als ein einziger Song; war eine der Dateien schon vorhanden, wurde das ganze Paket \u00fcbersprungen und der zweite Titel kam nie an. Jetzt erkennt der Import beliebig viele verschiedene Songs pro ZIP (auch Sammel-Bundles eines Labels), fragt vor der Vorschau \u201eGetrennt importieren\u201c oder \u201eJe ZIP als einen Song\u201c und l\u00e4sst die Wahl in der Vorschau je ZIP noch umschalten. Songs ohne passende Lyrics sind als Patter vorbelegt statt als Singing Call, \u201eextended\u201c im Dateinamen wird als Spur \u201eExtended\u201c erkannt. Existiert die Hauptspur schon, zeigt die Vorschau das an und bietet an, die neuen Spuren an den vorhandenen Song zu h\u00e4ngen; die Abschlussmeldung nennt \u00fcbersprungene Dateien jetzt mit Namen.<\/li>\n\n\n\n<li><strong>Das Ende der Wartemusik schaltet die Playlist nicht mehr weiter.<\/strong> Endete die Wartemusik der Pausen-Uhr (\u201eLetzten Song spielen\u201c), wertete die App das als Songende: Der n\u00e4chste Playlist-Song wurde als gespielt markiert und der \u00fcbern\u00e4chste geladen. Jetzt bleibt die Playlist stehen, wo sie war.<\/li>\n\n\n\n<li><strong>\u201eLetzten Song spielen\u201c in der Pausen-Uhr spielt wirklich den zuletzt gespielten Song.<\/strong> Ohne gew\u00e4hlte Lokation lief bisher der bereits vorgeladene n\u00e4chste Playlist-Song als Wartemusik. Jetzt merkt sich die App, welcher Song zuletzt tats\u00e4chlich lief. Nach der Pause ist wieder der Song geladen, der vorher ausgew\u00e4hlt war.<\/li>\n\n\n\n<li><strong>Rule-T\u00f6ne (\u201ePlay Sound\u201c) sind jetzt auch ohne laufende Musik zu h\u00f6ren.<\/strong> Bisher wurde der Ton nur in einen laufenden Song eingemischt. In der Pause oder nach dem Stopp blieb er stumm und erklang dann unvermittelt beim Start des n\u00e4chsten Songs. Jetzt kommt er sofort, auch direkt nach dem App-Start, bevor \u00fcberhaupt ein Song gespielt wurde.<\/li>\n\n\n\n<li><strong>Metadaten-Import pr\u00fcft jetzt, ob die Werte beim richtigen Song landen.<\/strong> Beim Bef\u00fcllen per KI (Potential \u2192 Metadaten f\u00fcllen) konnten Werte wie Originalinterpret und Erscheinungsjahr unbemerkt beim falschen Song landen, weil die R\u00fcckgabedatei nur die Song-Nummer enthielt. Der mitgelieferte KI-Auftrag verlangt jetzt zus\u00e4tzlich den Titel; stimmt er nicht zum Song, ist die Zeile in der Vorschau rot markiert und nicht angehakt. Bei \u00e4lteren Dateien ohne Titel weist die Vorschau darauf hin.<\/li>\n\n\n\n<li><strong>CSV-Abgleich ordnet \u00fcber Label und Nummer nur noch zu, wenn beides passt.<\/strong> Bisher reichte schon die gleiche Nummer bei einem anderen Label oder das gleiche Label bei einer anderen Nummer \u2013 dann kamen Angaben einer fremden Aufnahme an den Song.<\/li>\n\n\n\n<li><strong>Der Sequenz-Filter reagiert beim Wechsel von Programm, Limit oder \u201eNur\u201c wieder ohne Stocken.<\/strong> Seit 0.159 dauerte die Trefferz\u00e4hlung nach einem Filterwechsel oft rund 140 ms, und beim Programmwechsel w\u00e4hrend laufender Musik stockte die Oberfl\u00e4che kurz (die Musik selbst lief weiter). Jetzt kostet ein Wechsel nur noch wenige Millisekunden; einmalig nach dem Start oder nach einer \u00c4nderung an den Zuordnungen dauert der erste neue Filter etwas l\u00e4nger. Die gefundenen Sequenzen sind dieselben wie vorher.<\/li>\n\n\n\n<li><strong>Die Zeitanzeige im Player l\u00e4uft nicht mehr rund eine Sekunde vor der Musik.<\/strong> Die angezeigte Position (Zeit, Schieberegler, Lyrics-Scroll, Start-Countdown) war dem H\u00f6rbaren etwa 1 s voraus. Nach einem Sprung auf einen Jump-Marker sah es deshalb so aus, als lande die Wiedergabe zu sp\u00e4t \u2013 tats\u00e4chlich lag sie genau richtig. Wichtiger noch: \u201eLoop-In setzen\u201c und \u201eLoop-Out setzen\u201c w\u00e4hrend der Wiedergabe landen jetzt genau dort, wo man sie h\u00f6rt, statt etwa eine Sekunde sp\u00e4ter. Bereits gespeicherte Loop-Punkte bleiben unver\u00e4ndert. Au\u00dferdem zeigt der Tooltip eines Jump-Markers die Zeit jetzt eindeutig (\u201eRefrain \u00b7 00:29.54\u201c bzw. nur \u201e00:29.54\u201c) statt \u201e00:29 \u2014 00:29.54\u201c, das wie eine Zeitspanne aussah. <strong>Hinweis zu Lyrics-Sync-Punkten:<\/strong> Von Hand gesetzte Sync-Punkte und von Hand gesetzter Liedstart\/-ende wurden mit der alten, vorlaufenden Zeit gespeichert. Die Lyrics scrollen dort jetzt etwa eine Sekunde sp\u00e4ter als gewohnt \u2013 bei Bedarf die Sync-Punkte einmal neu setzen. Automatisch erkannte Sync-Punkte liegen dagegen jetzt genauer als vorher.<\/li>\n\n\n\n<li><strong>Im To-Call-Fenster \u00fcberlappen sich die Kacheln bei vielen Calls nicht mehr.<\/strong> War das Fenster zu klein f\u00fcr alle Calls, schoben sich die offenen Kacheln \u00fcber die erledigten oder wurden unten abgeschnitten. Jetzt stehen die erledigten Calls standardm\u00e4\u00dfig eingeklappt als Leiste \u201e36 erledigt \u25b8\u201c unter den offenen, damit die noch offenen Calls hervorstechen. Ein Klick auf die Leiste klappt sie auf und wieder zu, beim Aufklappen springt die Ansicht zu den erledigten Calls; nach \u201eF\u00fcllen\u201c ist sie wieder eingeklappt. Reicht der Platz nicht f\u00fcr alle offenen Calls, bekommt das Fenster eine Scrollleiste. Bei sehr wenig H\u00f6he konnte das Fenster au\u00dferdem ganz aufh\u00f6ren, sich neu anzuordnen \u2013 auch das ist behoben.<\/li>\n\n\n\n<li><strong>Schwebende Fenster gehen nach dem Schlie\u00dfen wieder genau dort auf, wo sie zuletzt standen.<\/strong> Wer etwa das To-Call-Fenster frei schwebend und fast bildschirmf\u00fcllend nutzt, fand es beim erneuten \u00d6ffnen (\u00fcber das Ansicht-Men\u00fc, \u201eF\u00fcllen\u201c oder den <code>[to_call]<\/code>-Shortcode) bisher leicht versetzt wieder. Jetzt merkt sich jedes schwebende Werkzeugfenster seine Position w\u00e4hrend der Sitzung, und auch nach einem Neustart gehen Loop Finder, Lyrics, To Call &amp; Co. ohne Versatz an der letzten Stelle auf \u2013 auch wenn die Titelleiste ganz oben am Bildschirmrand steht. Fenster, die bewusst zentriert oder per Regel auf Vollbild\/Wunschgr\u00f6\u00dfe ge\u00f6ffnet werden, landen weiterhin dort. Die bisher gespeicherten Positionen \u00fcbernimmt der erste Start nach dem Update, auch f\u00fcr Werkzeugfenster, die gerade angedockt sind; beim Beenden werden sie ins neue Format umgestellt, danach ist die Umstellung erledigt.<\/li>\n\n\n\n<li><strong>Im Einstellungen-Dialog erscheinen \u201eNeue Notizen einf\u00fcgen\u201c und \u201eAutomatische Breite\u201c jetzt in der gew\u00e4hlten Sprache.<\/strong> Auf Englisch und Japanisch standen bei den Notizen Beschriftung, Auswahl (Oben\/Mitte\/Unten) und Tooltip bisher auf Deutsch, und bei den Lyrics erschien statt einer Beschriftung der interne Name \u201eauto_width\u201c mit einem Textfeld. Die automatische Breite ist jetzt ein normales H\u00e4kchen.<\/li>\n\n\n\n<li><strong>Playlist-Ordner, Sequenz-Import-Ordner und \u201eGleichstand zuf\u00e4llig sortieren\u201c haben im Einstellungen-Dialog jetzt eine \u00fcbersetzte Beschriftung, einen Tooltip und das passende Bedienelement<\/strong> (Ordnerwahl bzw. H\u00e4kchen) statt des internen Namens mit Textfeld.<\/li>\n\n\n\n<li><strong>Der Hinweis auf protokollierte Fehler beim Start klingt nicht mehr nach Absturz und erscheint nur noch bei neuen Protokollen.<\/strong> Bisher meldete die App etwa \u201ebeim letzten Start 9\u00d7 abgest\u00fcrzt\u201c, obwohl nichts zu merken war: Gez\u00e4hlt wurden auch Fehler, nach denen die App normal weiterlief, und zwar alle jemals gespeicherten Protokolle \u2013 der Hinweis kam deshalb bei jedem Start mit immer gr\u00f6\u00dferer Zahl. Jetzt lautet er \u201eFehlerprotokoll vorhanden\u201c und z\u00e4hlt nur Protokolle, die seit dem letzten Hinweis dazugekommen sind (beim ersten Start nach dem Update einmalig noch alle vorhandenen). Die Protokolle bleiben gespeichert und k\u00f6nnen weiterhin angezeigt oder im Ordner ge\u00f6ffnet werden.<\/li>\n\n\n\n<li><strong>Nach dem Songende springt der Player wieder an den Anfang.<\/strong> Lief ein Song bis zum Ende durch oder wurde er ausgeblendet (Fade), blieb die Position bisher am Ende stehen \u2013 ein Klick auf Play spielte dann nur einen Sekundenbruchteil und h\u00f6rte sofort wieder auf. Jetzt verh\u00e4lt sich das Songende wie Stop: Die Position springt auf den Anfang, der Song startet aber nicht von selbst, sondern erst mit Play. Ist das automatische Weiterschalten zum n\u00e4chsten Song der Playlist aktiv, wird wie bisher der n\u00e4chste Song geladen.<\/li>\n\n\n\n<li><strong>Gespeicherte Tonh\u00f6he und Tempo gelten auch, wenn derselbe Song neu geladen wird.<\/strong> Wurde ein Song erneut geladen (oder hatte der vorherige Song dieselbe Tonh\u00f6he bzw. dasselbe Tempo), zeigten die Regler zwar die gespeicherten Werte, gespielt wurde aber mit 0 Halbt\u00f6nen und 100 %. Jetzt bekommt der Player die Werte bei jedem Laden.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technische Notiz<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der Sequenz-Import ist intern aufger\u00e4umt (unsichtbar f\u00fcr den Betrieb).<\/strong> Das Einlesen der Formate MDB, JSON, CSDS und Freitext liegt jetzt gesammelt an einer Stelle und ist durch automatische Tests abgesichert. Die alten Einzel-Importwege, die seit dem universellen Sequenz-Import nicht mehr im Men\u00fc erreichbar waren, wurden entfernt. Am Import selbst \u00e4ndert sich nichts.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.159 \u2014 Playlist-Mehrfachauswahl, Call-Texte mit mehreren Figuren &amp; frei bewegliche Fenster (2026-09-24)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ein Call-Text kann jetzt mehreren Figuren zugeordnet werden.<\/strong> Viele Zeilen in Sequenzen enthalten zwei oder mehr Figuren, z. B. \u201eSwing Thru &amp; Roll&#8220;. Bisher zeigte so ein Text auf genau eine Figur \u2013 der Limit-Filter pr\u00fcfte also nur diese eine, und die Sequenz erschien schon in einem Programm, in dem \u201e(Anything) &amp; Roll&#8220; noch gar nicht gelehrt wird. Jetzt lassen sich im Call-Mapping beliebig viele Figuren je Call-Text anhaken, und der Limit-Filter richtet sich nach der h\u00f6chsten davon. Die Figur-Spalte zeigt alle zugeordneten Figuren (h\u00f6chste zuerst, mit \u201e+n&#8220; bei mehreren). Doppelklick oder F2 \u00f6ffnet daf\u00fcr einen neuen Auswahldialog mit Suchfeld und Haken; \u201eAn Komma aufteilen&#8220; ist dort als Knopf erreichbar. Bestehende Zuordnungen bleiben unver\u00e4ndert.<\/li>\n\n\n\n<li><strong>Das Call-Mapping schl\u00e4gt f\u00fcr zusammengesetzte Call-Texte automatisch alle enthaltenen Figuren vor.<\/strong> Texte wie \u201eHeads Touch 1\/4 &amp; Spread&#8220; oder \u201eAll 8 Swing Thru&#8220; werden erkannt und in ihre Figuren zerlegt; noch nicht zugeordnete Zeilen mit einem solchen Vorschlag sind gelb markiert, und der Auswahldialog hakt die vorgeschlagenen Figuren gleich vor. \u00dcbernommen wird ein Vorschlag erst mit \u201eBest\u00e4tigen&#8220; oder \u201eSpeichern&#8220;. Ein neuer Filter \u201eVorschlag weicht ab&#8220; zeigt au\u00dferdem bereits zugeordnete Call-Texte, deren gespeicherte Figuren vom Vorschlag abweichen \u2013 so lassen sich unvollst\u00e4ndige oder falsche Alt-Zuordnungen gezielt nacharbeiten. Ist ein Teil eines Textes nicht eindeutig, gibt es bewusst gar keinen Vorschlag statt eines geratenen.<\/li>\n\n\n\n<li><strong>Im Figuren-Auswahldialog wandern angehakte Figuren nach oben.<\/strong> Sobald man eine Figur anhakt, r\u00fcckt sie in einen eigenen Block ganz oben; Abhaken schiebt sie an ihre urspr\u00fcngliche Stelle zur\u00fcck. So sieht man die aktuelle Auswahl immer auf einen Blick, auch in langen Listen.<\/li>\n\n\n\n<li><strong>Alle mitgelieferten Designs zeigen aktive Reiter und Umschalter jetzt deutlich lesbarer.<\/strong> Im Design \u201edefault&#8220; ist der aktive Reiter in der Akzentfarbe gef\u00fcllt, bei \u201eelegant&#8220; heben sich aktiver und inaktive Reiter klar voneinander ab, und bei \u201ewinter-is-coming&#8220; sind inaktive Reiter und Umschalter heller und damit gut lesbar. Die Schrift auf aktiven Umschaltern richtet sich in allen Designs nach dem Design statt immer wei\u00df zu sein.<\/li>\n\n\n\n<li><strong>In der Playlist lassen sich jetzt mehrere Lieder auf einmal markieren und gemeinsam verschieben oder l\u00f6schen.<\/strong> Mit Strg- bzw. Umschalt-Klick (oder durch Ziehen) w\u00e4hlt man einen Block aus; die Pfeil-Tasten \u25b2\/\u25bc schieben die ganze Auswahl nach oben oder unten (auch nicht zusammenh\u00e4ngende Zeilen, die relative Reihenfolge bleibt erhalten), \u2715 bzw. die Entf-Taste entfernen alle markierten Lieder in einem Rutsch, und per Ziehen l\u00e4sst sich der Block an eine neue Stelle setzen. Ein Auswahl-Klick l\u00e4dt dabei nicht mehr versehentlich jedes angetippte Lied als Audio. Das gilt gleicherma\u00dfen f\u00fcr die Playlist im Planner.<\/li>\n\n\n\n<li><strong>Der Button \u201e+Notiz&#8220; \u00fcbertr\u00e4gt jetzt alle markierten Lieder in der richtigen Reihenfolge.<\/strong> Ohne Markierung wird wie bisher nachgefragt, ob die ganze Playlist \u00fcbernommen werden soll; ist die Playlist leer, gibt es jetzt einen kurzen Hinweis statt eines stillen Abbruchs.<\/li>\n\n\n\n<li><strong>Das Umschalten zwischen Pattern (P) und Singing (S) in der Playlist beh\u00e4lt die aktuelle Auswahl bei.<\/strong> Bisher wurde beim Klick auf die P\/S-Spalte die Markierung zur\u00fcckgesetzt.<\/li>\n\n\n\n<li><strong>Ein neuer Umschalter \u201eOben&#8220;\/\u201eMitte&#8220;\/\u201eUnten&#8220; direkt neben dem Eingabefeld der Notizen bestimmt, wo neue Eintr\u00e4ge landen.<\/strong> \u201eMitte&#8220; f\u00fcgt \u00fcber der obersten Trennlinie ein, also ans Ende des obersten Abschnitts (z. B. des aktuellen Tipps oder Tages); gibt es keine Trennlinie, landet die Notiz ganz unten. Nach dem Umschalten steht der Cursor direkt im Eingabefeld, man kann also sofort weitertippen. Das gilt sowohl f\u00fcr manuell getippte Notizen als auch f\u00fcr Songs, die aus Playlist oder Abendplaner \u00fcbernommen werden. Die Umschaltung wirkt nur f\u00fcr die laufende Sitzung; der Startwert beim Programmstart l\u00e4sst sich \u00fcber die Einstellungen dauerhaft festlegen.<\/li>\n\n\n\n<li><strong>Nach dem \u00dcbertragen von Liedern in die Notizen erscheint keine Best\u00e4tigungsmeldung mehr.<\/strong> Die neuen Eintr\u00e4ge sind sofort sichtbar \u2013 ein zus\u00e4tzlicher Dialog, den man erst wegklicken muss, war \u00fcberfl\u00fcssig.<\/li>\n\n\n\n<li><strong>Jedes Fenster (Widget) l\u00e4sst sich jetzt wahlweise andocken oder frei wie ein normales Fenster bewegen.<\/strong> Bisher richteten sich die Fenster immer am Dock-Raster aus. Jetzt schaltet ein Rechtsklick auf die Titelzeile eines angedockten Fensters \u00fcber \u201eFrei bewegen&#8220; das Andocken ab \u2013 das Fenster schwebt dann frei und rastet nicht mehr ein. Zus\u00e4tzlich hat im Ansicht-Men\u00fc jede Fensterzeile rechts ein Magnet-Symbol, das zwischen \u201eangedockt&#8220; und \u201efrei&#8220; umschaltet; dar\u00fcber holt man ein frei schwebendes Fenster auch wieder zur\u00fcck ins Raster. Die Farbe des Magneten zeigt den Zustand an: angedockt in der Akzentfarbe des Designs, frei dezent ausgegraut. Fenster, die bewusst immer frei sind (z. B. Abendplaner, Regeln, Pausen-Uhr), bleiben unver\u00e4ndert. Der gew\u00e4hlte Zustand wird je Fenster gemerkt und \u00fcbersteht einen Neustart.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Leertaste stoppt und startet die Musik jetzt zuverl\u00e4ssig, egal wo der Cursor gerade steht.<\/strong> L\u00e4uft oder pausiert ein Song, greift die Leertaste auch dann, wenn ein Such- oder Notizfeld den Fokus hat oder ein Dialog offen ist \u2013 wer im Notfall als Erster am Rechner steht, kann die Musik also immer anhalten. Nur wer gerade tippt (letzter Tastendruck ins Feld vor weniger als 3 Sekunden), bekommt sein Leerzeichen wie gewohnt ins Feld. Ist kein Song gestartet, bleibt alles wie bisher. Au\u00dferdem sperrt das Lyrics-Fenster keine Tastenk\u00fcrzel mehr, und eine gedr\u00fcckt gehaltene Leertaste, Buchstaben- oder F-Taste l\u00f6st ihre Aktion nur noch einmal aus statt im Takt der Tastenwiederholung (Lautst\u00e4rketasten wiederholen weiterhin).<\/li>\n\n\n\n<li><strong>Songs aus Unterordnern bekommen keinen doppelten Eintrag mehr, und vorhandene Doppelg\u00e4nger werden automatisch zusammengef\u00fchrt.<\/strong> Lag ein Song beim Import \u201eam Ort belassen\u201c in einem Unterordner des Musikordners, legte das Laden aus der Songliste bisher einen zweiten Eintrag an (mit Patter + Singing). \u00c4nderungen an Typ, Loop, BPM, Lyrics oder Genres landeten dann an diesem Doppelg\u00e4nger, und der Song erschien zweimal in der Liste. Jetzt wird der Song beim Laden immer richtig erkannt. Beim ersten Start nach dem Update f\u00fchrt die App bestehende Doppelg\u00e4nger in ihr Original zur\u00fcck: Die am Doppelg\u00e4nger gemachten \u00c4nderungen, die Spielhistorie und die Genres bleiben erhalten, und gespeicherte Playlists werden auf den richtigen Titel umgestellt. Vorher legt die App eine Sicherung der Datenbank an (Dateiname endet auf <code>.bak_pre_intern106_\u2026<\/code>), ge\u00e4nderte Playlists werden als <code>.bak_intern106<\/code> daneben gesichert.<\/li>\n\n\n\n<li><strong>Beim \u00dcbertragen mehrerer Lieder in die Notizen stimmt die Reihenfolge jetzt \u2013 auch aus dem Abendplaner.<\/strong> Aus dem Abendplaner kamen die Notizen bisher immer in umgekehrter Reihenfolge heraus; beide Wege (Playlist und Abendplaner) legen die Eintr\u00e4ge nun von oben nach unten in der erwarteten Reihenfolge an. Das \u00dcbernehmen einer ganzen Liste ist zudem sp\u00fcrbar schneller, weil die Reihenfolge nur noch einmal am Ende gespeichert wird statt nach jedem einzelnen Lied.<\/li>\n\n\n\n<li><strong>Der Limit-Filter in den Sequenzen stuft Sequenzen wieder richtig ein.<\/strong> Geh\u00f6rt ein Call zu mehreren Tanzprogrammen (z. B. \u201eDosado&#8220; in Basic und Mainstream 2026), z\u00e4hlte bisher ein zuf\u00e4llig herausgegriffenes \u2013 in der Praxis fast immer das h\u00f6chste \u2013 Programm. Dadurch galt selbst eine reine Basic-Sequenz aus Dosado und Promenade als Mainstream-2026-Sequenz und verschwand aus dem Filter \u201ebis Basic&#8220;. Jetzt z\u00e4hlt immer das niedrigste Programm, in dem der Call gelehrt wird \u2013 dieselbe Regel, nach der auch die Programm-Auswahl und der Figuren-Dialog gehen. Beim ersten Start nach dem Update rechnet die App die Einstufung aller Sequenzen einmalig nach (bei 11.000 Sequenzen etwa eine F\u00fcnftelsekunde).<\/li>\n\n\n\n<li><strong>Im Call-Mapping stimmt die Spalte \u201eAnzahl&#8220; wieder.<\/strong> Ein Call-Text, dessen Figur zu mehreren Tanzprogrammen geh\u00f6rt, wurde je Programm einmal gez\u00e4hlt \u2013 die H\u00e4ufigkeit war also verdoppelt (oder verdreifacht) und die Sortierung nach H\u00e4ufigkeit entsprechend verschoben.<\/li>\n\n\n\n<li><strong>Im Call-Mapping \u00f6ffnet die Taste F2 den Figuren-Auswahldialog jetzt unabh\u00e4ngig von der zuvor angeklickten Spalte.<\/strong> Hatte man zuerst in die Call-Text-Spalte geklickt und danach F2 gedr\u00fcckt, blieb der Tastendruck wirkungslos (nur der Doppelklick auf die Figur-Zelle funktionierte). F2 wirkt jetzt in jeder Spalte der Zeile.<\/li>\n\n\n\n<li><strong>Im Figuren-Auswahldialog erscheint jede Figur jetzt nur noch einmal.<\/strong> Seit der Programm-Umstrukturierung stand ein Call, der zu mehreren Tanzprogrammen geh\u00f6rt (z. B. \u201eRecycle&#8220; in Mainstream und Mainstream 2026), mehrfach in der Auswahlliste \u2013 je einmal pro Programm und mit angeh\u00e4ngtem Programm-Namen. F\u00fcr die Zuordnung ist das Programm unerheblich; die Liste zeigt jede Figur nun genau einmal, ohne Programm-Zusatz. Das galt sowohl im Call-Mapping als auch beim Doppelklick im Sequenz-Editor. Au\u00dferdem zeigt die Sequenz-Anzeige das Programm-K\u00fcrzel einer Figur jetzt stabil (immer das niedrigste Programm) statt wechselnd.<\/li>\n\n\n\n<li><strong>Die Vorschau beim Metadaten-Import nennt jetzt die Anzahl der betroffenen Songs.<\/strong> Statt der Zahl stand dort bisher w\u00f6rtlich \u201e{count} Songs mit \u00c4nderungen gefunden&#8220;.<\/li>\n\n\n\n<li><strong>Eigene oder \u00e4ltere Designs sehen nach einem Update nicht mehr zerschossen aus.<\/strong> Kam mit einer neuen Version eine zus\u00e4tzliche Farbeinstellung dazu (zuletzt z. B. der Fokus-Rahmen), fehlte sie in selbst angepassten oder \u00e4lteren Designs \u2013 dadurch konnte die Darstellung teilweise ausfallen. Fehlende Einstellungen \u00fcbernimmt die App jetzt automatisch aus dem Standard-Design; alles, was im eigenen Design festgelegt ist, hat weiterhin Vorrang.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.158 \u2014 Fokus-Rahmen, Medley-Auto-Sync &amp; Fenster-Positionen (2026-09-14)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>H\u00f6here Tanzprogramme haken die darunterliegenden jetzt automatisch mit an.<\/strong> W\u00e4hlte man bisher nur ein h\u00f6heres Programm (z. B. \u201ePlus 2026&#8243;), ohne das darunterliegende (\u201eMainstream 2026&#8243;), blieb die Sequenzliste leer \u2013 es gibt schlicht keine Sequenz ohne die tieferen Calls. Jetzt gen\u00fcgt ein Klick auf das gew\u00fcnschte Programm: Die tieferen Programme derselben Reihe werden automatisch mitgew\u00e4hlt (z. B. \u201ePlus 2026&#8243; \u2192 auch \u201eMainstream 2026&#8243;; \u201eA2&#8243; und h\u00f6her greifen auf die 2026er-Programme zu). Die alten Programme (Basic, Mainstream, Plus, A1 ohne \u201e2026&#8243;) nutzen weiterhin ihre eigene Reihe inklusive der Basics. Nicht Ben\u00f6tigtes l\u00e4sst sich jederzeit wieder abw\u00e4hlen.<\/li>\n\n\n\n<li><strong>Tastenbefehle mit Buchstaben funktionieren jetzt zuverl\u00e4ssig \u2013 auch wenn eine Liste, Tabelle oder das Lyrics-Fenster den Fokus hat.<\/strong> Bisher wurde ein Buchstabe (z. B. \u201eS&#8220;) in solchen Fenstern f\u00fcr deren eigene Schnellsuche verbraucht, statt die zugewiesene Regel auszul\u00f6sen. Jetzt l\u00f6st ein belegter Buchstabe die Regel aus; nur echte Texteingabefelder (z. B. Notizen oder Suchfelder) haben weiterhin Vorrang. Die Erkennung ist zudem unabh\u00e4ngig von der Gro\u00df-\/Kleinschreibung \u2013 \u201eS&#8220; wirkt wie \u201es&#8220;. Nicht belegte Tasten funktionieren in Listen\/Tabellen weiterhin f\u00fcr die Schnellsuche.<\/li>\n\n\n\n<li><strong>In Textfeldern ist jetzt klar sichtbar, wo der Cursor steht \u2013 und Escape springt sofort zur\u00fcck in den Tasten-Modus.<\/strong> Bisher merkte man oft nicht, dass der Fokus noch in einem Eingabefeld hing, und tippte einen Tastenbefehl versehentlich ins Feld. Jetzt umrahmt ein farbiger, zum jeweiligen Design passender Rahmen das aktive Feld. Ein Druck auf Escape gibt den Fokus wieder frei, sodass belegte Buchstabentasten sofort wieder als Befehl wirken.<\/li>\n\n\n\n<li><strong>Bei Medley-Liedern mit vier getrennten \u201eFIGURE&#8220;-Abschnitten erkennt die automatische Abschnitts-Erkennung jetzt jede Figur einzeln.<\/strong> Bisher \u00fcbernahm der erste Figuren-Block alle vier Figuren-Durchg\u00e4nge \u2013 bei einem Medley mit unterschiedlichen Figuren wurde der zweite (und weitere) Text daher nie eingeblendet. Jetzt bekommt bei genau vier Figuren-Abschnitten jeder seinen eigenen Durchgang zugewiesen (1., 2., 3., 4. Figur der Reihe nach). Bei einem oder zwei Bl\u00f6cken bleibt es bewusst beim bisherigen Verhalten (der erste deckt alle); abweichende F\u00e4lle lassen sich weiterhin von Hand anpassen.<\/li>\n\n\n\n<li><strong>Fenster (Widgets) lassen sich jetzt wahlweise zentriert oder an ihrer zuletzt genutzten Position \u00f6ffnen.<\/strong> Bisher \u00f6ffneten die Fenster-Buttons (z. B. \u201eLyrics&#8220;) ein loses Fenster immer mittig \u00fcber dem Hauptfenster \u2013 eine vorher gew\u00e4hlte Position ging dabei verloren. Die Regelaktion \u201eWidget \u00f6ffnen&#8220; hat jetzt den Schalter \u201eOpen position&#8220; mit den Werten \u201ecentered&#8220; (Standard, wie bisher) und \u201elast&#8220; (die zuletzt genutzte Position wird gemerkt und wiederhergestellt). Der On-Screen-Button eines Fensters \u00fcbernimmt automatisch die Einstellung einer passenden \u201eWidget \u00f6ffnen&#8220;-Regel; ohne solche Regel \u00f6ffnet der Button weiterhin zentriert.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sync-Marken auf den letzten Zeilen langer Songs werden wieder angezeigt.<\/strong> Bei Liedern mit vielen Sync-Punkten (z. B. mehrfach getanzten Figuren) fehlten die Zeit-Marken auf den hintersten Textzeilen, obwohl sie gesetzt waren (der Rechtsklick zeigte sie weiterhin). Sie werden jetzt korrekt an allen Zeilen eingeblendet.<\/li>\n\n\n\n<li><strong>Neu angelegte Tasten-Regeln reagieren sofort \u2013 ohne Neustart.<\/strong> Wies man einer Regel eine bisher unbenutzte Taste zu (z. B. \u201eS&#8220;), l\u00f6ste sie erst nach einem Neustart der App aus. Der Ausl\u00f6ser wird jetzt direkt beim Speichern aktiv.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.157 \u2014 Neues Fenster \u201ePilot Square&#8220; &amp; automatische Fensterlisten in Regeln (2026-09-12)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neu<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neues Fenster \u201ePilot Square&#8220; \u2014 Notizen zu den acht T\u00e4nzern im Square.<\/strong> \u00dcber \u201eAnsicht \u2192 Pilot Square&#8220; \u00f6ffnet sich ein andockbares Feld, das die acht T\u00e4nzer r\u00e4umlich als Square anordnet (Paar 1 unten, Paar 2 rechts, Paar 3 oben, Paar 4 links \u2013 jeweils Mann und Frau an ihrer realen Position). In jedes Feld l\u00e4sst sich frei etwas eintragen: Name, Level oder Hinweise wie \u201ebraucht Blickkontakt&#8220;. Die Schrift passt sich automatisch an die Textl\u00e4nge an und f\u00fcllt das Feld optimal aus; der Text steht immer mittig und gut lesbar. \u00dcber die Farbpalette in der Mitte kann man jedem Feld eine Farbe geben \u2013 erst das Feld anklicken, dann eine Farbe w\u00e4hlen (das erste Feld entfernt die Farbe wieder); die Textfarbe stellt sich automatisch kontrastreich ein. \u201eLeeren&#8220; setzt alle Felder zur\u00fcck, \u201eSchlie\u00dfen&#8220; blendet das Fenster aus. Die Notizen gelten f\u00fcr die laufende Sitzung.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Regel-Aktionen \u201eDock \u00f6ffnen\/schlie\u00dfen&#8220; und die Stream-Deck-Belegung listen jetzt automatisch alle Fenster.<\/strong> Bisher war die Auswahl eine feste Liste, in der neuere Fenster fehlten. Jetzt erscheinen alle andockbaren Fenster automatisch \u2013 darunter \u201ePilot Square&#8220; sowie Notizen, Abendplaner, Sprungmarken und \u201eTo Call&#8220;. Bestehende Regeln bleiben unver\u00e4ndert g\u00fcltig.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Einzelne Buchstaben werden beim Tippen in mehrzeiligen Textfeldern nicht mehr als Tastenbefehl abgefangen.<\/strong> Wer einen Buchstaben (z. B. \u201eL&#8220;) als Regel-Ausl\u00f6ser eingerichtet hatte, konnte diesen in manchen Textfeldern nicht eintippen \u2013 er l\u00f6ste stattdessen die Regel aus. Jetzt haben Texteingaben in solchen Feldern Vorrang.<\/li>\n\n\n\n<li><strong>Die H\u00e4kchen im Ansicht-Men\u00fc stimmen nach dem Start wieder mit den sichtbaren Fenstern \u00fcberein.<\/strong> Ein im Layout gespeichertes, sichtbares Fenster (z. B. der Loop Finder) wurde beim Start korrekt angezeigt, im Ansicht-Men\u00fc aber ohne H\u00e4kchen \u2013 das wirkte widerspr\u00fcchlich. Die H\u00e4kchen werden jetzt nach dem Wiederherstellen des Layouts an die tats\u00e4chliche Sichtbarkeit angeglichen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.156 \u2014 Absturzbehebungen (2026-09-11)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Absturz beim Bedienen von Auswahllisten behoben.<\/strong> In bestimmten Situationen (u. a. beim Aufklappen\/Anklicken von Auswahlfeldern) konnte die App mit einem internen Typfehler komplett abst\u00fcrzen. Der app-weite Tasten-\/Maus-Filter f\u00e4ngt solche unerwarteten F\u00e4lle jetzt ab, statt sich zu beenden.<\/li>\n\n\n\n<li><strong>Absturz bei der Audio-Diagnose behoben.<\/strong> Eine seltene Kollision zwischen dem Audio-Thread und der Diagnose-Anzeige konnte die App beenden. Die Diagnose arbeitet jetzt auf einer Kopie und l\u00e4sst den Audio-Thread ungest\u00f6rt.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.155 \u2014 Songdaten als JSON exportieren &amp; behutsam importieren (2026-09-11)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Songdaten als JSON exportieren und wieder einspielen.<\/strong> In der Songliste gibt es jetzt \u201eExportieren\u2026&#8220;: schreibt die Datenbank-Daten aller Songs der aktuell gefilterten Liste in eine JSON-Datei. Vorher w\u00e4hlt man die Felder \u2014 die Liste umfasst alles aus Song-Info und den erweiterten Daten und w\u00e4chst automatisch mit k\u00fcnftigen Feldern mit. Der Titel ist als Zuordnungsschl\u00fcssel immer dabei; kritische Felder (Dateiname, Pfade, Aufnahmedatum) und erweiterte Datenfelder sind vorsichtshalber abgew\u00e4hlt \u2014 wer sie will, hakt sie an. Derselbe Export steht zus\u00e4tzlich im Tab \u201ePotential \u2192 Daten-Export\/-Import&#8220; bereit, dort \u00fcber alle Songs.<\/li>\n\n\n\n<li><strong>Behutsamer Import unter \u201ePotential \u2192 Daten-Import&#8220;.<\/strong> Spielt eine solche JSON wieder ein: aktualisiert nur bestehende Songs (legt nie neue an), Zuordnung \u00fcber den Songnamen. Eine Vorschau zeigt jede \u00c4nderung \u201ealt \u2192 neu&#8220; einzeln zum Anhaken \u2014 nichts wird still \u00fcberschrieben. Nicht gefundene oder gleichnamige (mehrdeutige) Songs werden mit Namen ausgewiesen und \u00fcbersprungen.<\/li>\n\n\n\n<li><strong>Umbenennen beim Re-Import auf derselben Installation.<\/strong> Bearbeitet man eine hier exportierte JSON und spielt sie auf demselben Ger\u00e4t wieder ein, l\u00e4sst sich auch der Songname \u00e4ndern \u2014 die Abspiel-Historie bleibt erhalten. Bei fremden Dateien (Caller-Austausch) bleibt der Name der Zuordnungsschl\u00fcssel.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.154 \u2014 Neue Regel-Bedingung \u201eSongl\u00e4nge&#8220;, breitere Auswahllisten &amp; frei skalierbares Rules-Fenster (2026-09-10)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neue Regel-Bedingung \u201eSong Length&#8220; \u2014 reagiert auf die Gesamtl\u00e4nge des geladenen Songs.<\/strong> In den Regeln l\u00e4sst sich jetzt pr\u00fcfen, ob ein Song <strong>l\u00e4nger<\/strong> oder <strong>k\u00fcrzer<\/strong> als eine eingestellte Zeit ist (Eingabe als <code>mm:ss<\/code>, z. B. <code>3:00<\/code>). Damit kann man z. B. nur bei kurzen Pattern-Titeln automatisch einen Loop setzen lassen, bevor der Song gestartet wird, l\u00e4ngere aber unangetastet lassen. Die Bedingung w\u00e4hlt man \u00fcber ein Auswahlfeld \u201eabove\/below&#8220;; ist gerade kein Song geladen, gilt sie als nicht erf\u00fcllt.<\/li>\n\n\n\n<li><strong>Auswahllisten (Comboboxen) klappen jetzt so breit auf wie ihr l\u00e4ngster Eintrag.<\/strong> Auf schmalen Laptop-Aufl\u00f6sungen quetschte das Layout die Auswahlfelder zusammen, sodass beim Aufklappen l\u00e4ngere Eintr\u00e4ge abgeschnitten und unlesbar waren. Die Aufklappliste \u00f6ffnet sich nun immer so breit wie n\u00f6tig (maximal bis zum Bildschirmrand) \u2014 das eigentliche Feld bleibt platzsparend. Gilt automatisch f\u00fcr alle Auswahlfelder im Programm.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Das freischwebende Regeln-Fenster l\u00e4sst sich nicht mehr schmaler ziehen als sein Inhalt.<\/strong> Zuletzt konnte man das Rules-Fenster so klein ziehen, dass Felder abgeschnitten wurden und ein horizontaler Scrollbalken erschien. Die sinnvolle Mindestgr\u00f6\u00dfe (700 \u00d7 400) ist jetzt wiederhergestellt, sodass der Inhalt immer vollst\u00e4ndig sichtbar bleibt.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.153 \u2014 Auto-Scroll startet zuverl\u00e4ssig &amp; Schriftgr\u00f6\u00dfe bleibt beim Speichern erhalten (2026-09-09)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der Auto-Scroll l\u00e4uft jetzt schon beim Start eines Songs von selbst.<\/strong> Bisher blieb der Lyric-Text nach dem Abspielen zun\u00e4chst stehen, obwohl Auto-Scroll aktiv war \u2014 er lief erst los, wenn man am Zoom drehte oder Auto-Scroll kurz aus- und wieder einschaltete. Jetzt scrollt der Text ab dem ersten Moment korrekt mit. (Sehr kurze Texte, die komplett ins Fenster passen, scrollen wie bisher nicht.)<\/li>\n\n\n\n<li><strong>Beim Bearbeiten und Speichern von Lyrics wird die Schriftgr\u00f6\u00dfe nicht mehr versehentlich ver\u00e4ndert.<\/strong> Wer das Lyric-Fenster im Bearbeiten-Modus verkleinerte (wodurch die Anzeige die Schrift automatisch anpasst) und dann speicherte, hatte danach dauerhaft kleinere Buchstaben in der Datei. Die reine Anzeige-Anpassung landet jetzt nicht mehr in der gespeicherten Datei; die bewusst pro Wort gesetzten Gr\u00f6\u00dfen bleiben erhalten.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.152 \u2014 Live-Lautst\u00e4rke bleibt erhalten, einheitlich gr\u00fcne Aktiv-Schalter &amp; fl\u00fcssigerer Abendplaner (2026-09-09)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Live-Lautst\u00e4rke bleibt beim Songwechsel jetzt stehen.<\/strong> Bisher sprang der Live-Regler bei jedem neuen Song zur\u00fcck auf 100 %, sodass man ihn beim Aufbau der Playlist immer wieder nachregeln musste. Jetzt beh\u00e4lt er den eingestellten Wert f\u00fcr die ganze Sitzung. Wer pro Song bewusst einen festen Pegel m\u00f6chte, kann das \u00fcber die neue Regel-Aktion \u201eSet Live-Volume&#8220; einstellen (z. B. mit dem Ausl\u00f6ser \u201eSong Changed&#8220;) \u2014 Standard bleibt 100 %.<\/li>\n\n\n\n<li><strong>Aktive Umschalt-Schaltfl\u00e4chen sind jetzt einheitlich gr\u00fcn.<\/strong> Schalter, die eine laufende Funktion anzeigen \u2014 Auto-Scroll, Auto-Gr\u00f6\u00dfe, Auto-Breite und Dynamic Lyrics im Lyric-Fenster, Zufall (\ud83c\udfb2) in der Sequenz-Ansicht und Shuffle im Abendplaner \u2014 leuchten im aktiven Zustand gr\u00fcn, genau wie der Sync-Schalter. Gleiche Bedeutung, gleiche Farbe, auf einen Blick erkennbar. Die Farbe kommt aus dem jeweiligen Design-Theme.<\/li>\n\n\n\n<li><strong>Der Abendplaner \u00f6ffnet sich ohne kurzes leeres Fenster.<\/strong> Er wird jetzt kurz nach dem Programmstart im Hintergrund vorbereitet, sodass beim ersten \u00d6ffnen sofort der fertige Inhalt erscheint statt f\u00fcr einen Moment ein leeres Fenster.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die \u201eShuffle&#8220;-Auswahl in der Songliste l\u00e4sst sich jetzt immer umschalten.<\/strong> Bisher war sie bei bestimmten Sortierungen (z. B. alphabetisch oder rein zuf\u00e4llig) ausgegraut, was verwirrte. Jetzt ist sie immer bedienbar; sie wirkt weiterhin nur dort, wo ein Zufalls-Ausgleich bei Gleichstand sinnvoll ist (Empfehlung, Qualit\u00e4t, Einf\u00fcgedatum), und bleibt in den anderen Sortierungen bewusst ohne Wirkung.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.151 \u2014 Dynamic Lyrics sch\u00fctzt den Gesangstext am Figuren-Ende (mit verschiebbarer Schnittmarke) &amp; Suchfeld im Lokationsdialog (2026-09-08)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Beim automatischen Ersetzen des Figurentextes durch die aktuelle Sequenz (Dynamic Lyrics) bleibt der angeh\u00e4ngte Gesangstext am Figuren-Ende jetzt erhalten.<\/strong> In vielen Cuesheets endet ein Figuren-Block nicht mit dem letzten Tanz-Call, sondern mit ein bis zwei Zeilen reinem Gesangstext, die laufen, w\u00e4hrend die T\u00e4nzer nach Hause promenieren. Bisher wurden auch diese Zeilen durch die Sequenz-Calls \u00fcberschrieben; jetzt endet die Ersetzung an der letzten Heim-Promenade-Zeile, und der Schluss-Gesang bleibt sichtbar stehen. Das Timing bleibt unver\u00e4ndert \u2014 die Anzeige ruht w\u00e4hrend des Schluss-Gesangs weiter an ihrer Stelle. Die Erkennung wurde an allen echten Lyrics gepr\u00fcft und trifft in rund 96 % der Figuren-Bl\u00f6cke die richtige Stelle.<\/li>\n\n\n\n<li><strong>Neue verschiebbare Schnittmarke im Abschnitts-Streifen (Sync-Modus).<\/strong> Ein breiter Trenner im Figuren-Balken zeigt jetzt, wo die Tanz-Calls enden und der Gesangstext beginnt. Die Marke wird automatisch gesetzt; liegt sie einmal nicht richtig, l\u00e4sst sie sich einfach per Ziehen nach oben oder unten verschieben. Die Position wird pro Song gespeichert und steuert direkt, bis wohin Dynamic Lyrics ersetzt.<\/li>\n\n\n\n<li><strong>Der Lokationsdialog hat jetzt ein Suchfeld mit L\u00f6schen-Schaltfl\u00e4che.<\/strong> Damit lassen sich Eintr\u00e4ge schnell filtern; ein Klick auf das X leert die Suche wieder.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.150 \u2014 Text l\u00e4sst sich w\u00e4hrend der Wiedergabe von Hand scrollen (2026-09-08)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der Lyric-Text l\u00e4sst sich jetzt auch w\u00e4hrend der Wiedergabe von Hand scrollen.<\/strong> Bisher zog der Auto-Scroll die Anzeige bei jedem Takt sofort wieder an die aktuelle Song-Position zur\u00fcck \u2014 man kam damit nicht an eine andere Textzeile, um dort etwa einen Sync-Punkt zu setzen. Sobald man jetzt von Hand scrollt (Mausrad oder Scrollbalken), pausiert der Auto-Scroll f\u00fcr einige Sekunden und l\u00e4uft danach von selbst wieder an. Wer l\u00e4nger frei bl\u00e4ttern m\u00f6chte, kann den Auto-Scroll weiterhin \u00fcber die Schaltfl\u00e4che in der Werkzeugleiste ganz abschalten.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.149 \u2014 Deutlich schnellerer Programmstart, zuverl\u00e4ssiges Abspielen w\u00e4hrend Hintergrund-Analysen &amp; aufger\u00e4umte Beat-Snap-Liste (2026-09-07)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Performance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Deutlich schnellerer Programmstart.<\/strong> Die BPM-Analyse-Bibliothek (mit ihrer umfangreichen Rechen-Grundlage) wurde bisher schon beim Programmstart komplett geladen \u2014 obwohl sie direkt nach dem Start praktisch nie gebraucht wird. Sie wird jetzt erst dann geladen, wenn tats\u00e4chlich eine BPM-Messung startet (Button in den Song-Infos oder per Regel-Aktion). Die reine Modul-Ladephase beim Start sinkt dadurch von ~1,8 s auf ~0,6 s (rund \u22121,2 s); der erste BPM-Vorgang danach dauert einmalig einen Sekundenbruchteil l\u00e4nger, was im Live-Betrieb nicht auff\u00e4llt.<\/li>\n\n\n\n<li><strong>Fenster erscheint sp\u00fcrbar fr\u00fcher.<\/strong> Beim Start musste das Programm bisher erst berechnen, welche Sequenzen zum aktuellen Tanzprogramm passen (ein Durchlauf \u00fcber zehntausende Figuren-Eintr\u00e4ge) \u2014 das blockierte das Erscheinen des Fensters um ~0,3 s. Dieses Ergebnis wird jetzt dauerhaft zwischengespeichert und nur noch neu berechnet, wenn sich tats\u00e4chlich etwas an den Calls, B\u00e4ndern, Mappings oder Sequenzen \u00e4ndert; au\u00dferdem l\u00e4dt die Sequenzliste erst, nachdem das Fenster sichtbar ist. Die Zeit bis zum sichtbaren Fenster sinkt dadurch nochmals um ~0,4 s.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Musik l\u00e4sst sich jetzt auch dann sofort abspielen, wenn im Hintergrund gerade eine Sammel-Analyse l\u00e4uft<\/strong> (z. B. BPM ermitteln, Beat-Snap, \u201eVersch\u00f6nern&#8220;). Bisher konnte eine solche Hintergrund-Aufgabe die Datenbank kurz sperren; ein Klick auf Play brach dann mit einer Fehlermeldung ab, statt den Song zu starten. Jetzt hat das Abspielen Vorrang: Der Song startet in jedem Fall, das Mitschreiben der Abspiel-Historie wird bei einer belegten Datenbank stillschweigend \u00fcbersprungen. Zus\u00e4tzlich warten die Analysen bei kurzzeitiger Sperre aufeinander, statt einzelne Songs zu \u00fcberspringen.<\/li>\n\n\n\n<li><strong>Songs, deren Loop sich nicht sinnvoll auf den Beat legen l\u00e4sst, tauchen im Beat-Snap-Bereich nicht mehr endlos wieder auf.<\/strong> Konnte die automatische Beat-Snap-Optimierung keinen Versatz bestimmen \u2014 etwa weil die Datei kein normales Audioformat ist, das Signal zu unklar ist oder der Loop bereits exakt auf dem Beat liegt \u2014, blieb der Song in der Liste und wurde bei jedem Durchlauf erneut vorgeschlagen. Solche Songs erhalten jetzt das Genre-Kennzeichen \u201eCHECK: BEATSNAP&#8220; und fallen aus der Vorschlagsliste; \u00fcber dieses Genre lassen sie sich in der Songliste gezielt heraussuchen und bei Bedarf von Hand pr\u00fcfen. Snappt man einen davon manuell, wird das Kennzeichen automatisch wieder entfernt.<\/li>\n\n\n\n<li><strong>Nicht abspielbare Dateien (z. B. MIDI) erzeugen keine irritierende Fehlermeldung mehr.<\/strong> Lag eine solche Datei in einer Liste (etwa beim automatischen Weiterschalten), tauchte im Protokoll ein langer technischer Fehlerblock auf. Jetzt wird das Format ruhig als \u201enicht abspielbar&#8220; vermerkt und \u00fcbersprungen; f\u00fcr echte, unerwartete Ladefehler (z. B. eine besch\u00e4digte MP3) bleibt die deutliche Warnung erhalten.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technische Notiz<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gro\u00dfer interner Umbau der Code-Struktur (unsichtbar f\u00fcr den Betrieb, Grundlage f\u00fcr die Zukunft).<\/strong> Die \u00fcber die Jahre auf ~29.000 Zeilen gewachsene zentrale Programmdatei wurde in zehn thematische Module aufgeteilt (Player, Songdaten\/Liste, Playlist, Sequenzen, Song-Pool, Loop-Finder, Pause\/Foto, Reports, Dialoge, Lyrics) \u2014 die zentrale Datei schrumpft dadurch auf ~7.300 Zeilen. Das macht k\u00fcnftige \u00c4nderungen sicherer und Fehlersuche schneller, \u00e4ndert aber nichts am Verhalten des Programms. Begleitend wurden nicht mehr genutzter Code und \u00fcberfl\u00fcssige Verweise entfernt. S\u00e4mtliche Bereiche wurden nach dem Umbau gepr\u00fcft.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.148 \u2014 Schnellerer Abbruch beim versehentlichen Zweitstart, \u201eLoad Song&#8220; gleicht den Songlisten-Filter an &amp; inaktive Regeln verschwinden aus dem Stream Deck (2026-09-05)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Performance &amp; Start<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Startet man Callers Caddy versehentlich ein zweites Mal (typischer Doppelklick, weil der Start etwas dauert), bricht die zweite Instanz jetzt deutlich schneller ab.<\/strong> Bisher lud der zweite Start fast das komplette Programm \u2014 inklusive der schweren Audio-\/Analyse-Bausteine \u2014 bevor er \u201el\u00e4uft bereits&#8220; meldete; in dieser Zeit bremste er ausgerechnet den ersten, sichtbaren Start aus. Die Mehrfachstart-Sperre greift nun ganz am Anfang: Die zweite Instanz erkennt in Sekundenbruchteilen, dass das Programm schon l\u00e4uft, zeigt den Hinweis und beendet sich, ohne die erste zu behindern. Die bew\u00e4hrte Erkennung verwaister Sperren nach einem Absturz bleibt vollst\u00e4ndig erhalten.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Regel-Aktion \u201eLoad Song&#8220; schaltet den Songlisten-Filter jetzt automatisch auf den gew\u00e4hlten Songtyp um.<\/strong> Stellt man in der Aktion z. B. \u201ePatter&#8220; ein, w\u00e4hrend die Songliste noch auf \u201eSinging&#8220; gefiltert war, wurde der vorgeschlagene Song zwar korrekt in den Player geladen, in der Liste aber nicht markiert \u2014 der Filter blendete ihn aus, was verwirrend wirkte. Jetzt setzt die Aktion den Listenfilter passend (Singing \u2192 Singing, Patter \u2192 Patter), sodass der geladene Song sichtbar und selektiert ist. Steht der Filter bereits richtig, passiert nichts (kein \u00fcberfl\u00fcssiger Neuaufbau der Liste).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der \u201eAktiv&#8220;-Schalter einer Regel wirkt jetzt wieder auf das Stream Deck.<\/strong> Zuletzt blieb der Stream-Deck-Button einer Regel auch dann bestehen und ausl\u00f6sbar, wenn die Regel deaktiviert war \u2014 nur der automatische Ausl\u00f6ser hielt sich an den Schalter. Jetzt gilt der Schalter durchg\u00e4ngig: Wird eine Regel deaktiviert, verschwindet ihr Button sofort aus dem Stream Deck, und ein (versehentlicher) Aufruf einer inaktiven Regel f\u00fchrt keine Aktionen mehr aus. Beim Wieder-Aktivieren taucht der Button unmittelbar wieder auf \u2014 ohne Neustart.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technische Notiz<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Erweiterte Start-Zeitmessung<\/strong> (nur bei aktivem Performance-Log, <code>debug\/performance_logging=true<\/code>): Das Perf-Log erfasst jetzt auch die bisher unsichtbaren Phasen <em>vor<\/em> dem Programmfenster \u2014 Bootloader\/Python-Start und die Import-Phase \u2014 sowie die Gesamtzeit vom Prozessstart bis zum sichtbaren Fenster. Grundlage f\u00fcr die weitere Start-Optimierung; ohne Auswirkung f\u00fcr Endnutzer.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.147 \u2014 Robusterer Sequenz-Import, klareres Evening-Planner-Design &amp; Floating-Fenster merken sich Gr\u00f6\u00dfe und Position (2026-09-03)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Sequenz-Import<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sequenz-Dateien mit doppelten Zeilenumbr\u00fcchen (z. B. SqView-Exporte) werden jetzt korrekt eingelesen.<\/strong> Solche Dateien schreiben pro Zeile ein zus\u00e4tzliches Wagenr\u00fccklauf-Zeichen; der Freitext-Import erkannte dadurch jede einzelne Call-Zeile als eigene Sequenz. Jetzt werden die Zeilenenden vor dem Einlesen sauber normalisiert \u2014 mehrere Leerzeilen trennen die Sequenzen, einzelne Umbr\u00fcche geh\u00f6ren zur laufenden Sequenz. Normale Dateien bleiben unver\u00e4ndert.<\/li>\n\n\n\n<li><strong>Head-\/Side-Kurzschreibweisen werden beim Zuordnen der Calls erkannt.<\/strong> \u201eHDS&#8220;, \u201eHD&#8220;, \u201eSDS&#8220; und \u201eSD&#8220; gelten jetzt wie \u201eHeads&#8220;\/\u201eSides&#8220; als Rollen-Pr\u00e4fix und werden beim Abgleich mit der Call-Datenbank korrekt abgetrennt.<\/li>\n\n\n\n<li><strong>Neue Auswahl \u201eSchreibweise&#8220; im Import-Dialog.<\/strong> W\u00e4hlbar: <em>Wie im Text<\/em> (unver\u00e4ndert), <em>ALLES GROSSBUCHSTABEN<\/em> oder <em>Erster Buchstabe je Wort gro\u00df<\/em>. Damit lassen sich in Gro\u00dfbuchstaben vorliegende Quelldateien direkt in eine sch\u00f6n lesbare Schreibweise \u00fcberf\u00fchren. Die Gro\u00df-Kleinschreibung greift auch nach Trennzeichen wie \u201e-&#8222;, \u201e(&#8222;, \u201e)&#8220; \u2014 nur nach Ziffern bleibt der Buchstabe klein (aus \u201e1ST&#8220; wird \u201e1st&#8220;, nicht \u201e1St&#8220;).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Tabelle im Evening Planner ist deutlich lesbarer.<\/strong> Bisher waren alle Zellen fl\u00e4chig in den ERR-Stufenfarben hinterlegt \u2014 in dunklen wie hellen Themes lie\u00dfen sich die Titel dadurch kaum lesen. Jetzt folgt die Tabelle dem normalen Theme (abwechselnde Zeilenfarben, Standard-Textfarbe); die ERR-Farbe steckt nur noch dort, wo sie Bedeutung tr\u00e4gt: in den beiden ERR-Spalten, als satter Badge mit wei\u00dfer Zahl. Noch nicht best\u00e4tigte Songvorschl\u00e4ge werden nur noch kursiv gekennzeichnet statt grau \u2014 dadurch bleiben sie in beiden Themes gut lesbar.<\/li>\n\n\n\n<li><strong>Auch das Kandidaten-Fenster (Klick auf einen Slot) zeigt den ERR-Wert jetzt als satten Badge<\/strong> statt als farbigen Text \u2014 einheitlich mit der Haupttabelle.<\/li>\n\n\n\n<li><strong>Die Balken im Spannungsbogen-Diagramm sind jetzt durchg\u00e4ngig in Vollfarbe<\/strong> und passen damit zu den ERR-Badges der Tabelle.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Frei schwebende Fenster merken sich jetzt ihre Gr\u00f6\u00dfe und Position \u00fcber einen Neustart hinweg.<\/strong> Betroffen waren u. a. Evening Planner, Photo, Reports, Statistik und der Zauberstab-Planner: Nach dem Beenden und Neustart \u00f6ffneten sie wieder in Standardgr\u00f6\u00dfe an Standardposition. Ursache war, dass ein geschlossenes schwebendes Fenster seine Geometrie beim Speichern verlor. Die Fenstergr\u00f6\u00dfe\/-position wird nun zuverl\u00e4ssig gesichert und beim \u00d6ffnen wiederhergestellt.<\/li>\n\n\n\n<li><strong>\u201eZu Notizen hinzuf\u00fcgen&#8220; im Evening Planner ohne gew\u00e4hlte Lokation zeigte den Hinweis \u201eBitte zuerst eine Lokation w\u00e4hlen&#8220; einmal pro Lied<\/strong> (bei vielen Tipps wie eine Endlosschleife). Der Hinweis erscheint jetzt genau einmal, danach bricht die Aktion sauber ab.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.146 \u2014 Songs per Drag &amp; Drop auf den NEU-Button importieren (2026-09-03)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MP3-Dateien, ZIP-Pakete und ganze Ordner lassen sich jetzt direkt auf den NEU-Button ziehen \u2014 der Drop startet denselben Import wie ein Klick.<\/strong> Beim Ziehen zeigt der Button einen gestrichelten Rahmen als Ablegehinweis. Da die Quelle durch den Drop bereits feststeht, entf\u00e4llt gegen\u00fcber dem Klick nur die Datei-\/Ordnerauswahl; die gewohnten Nachfragen (Kopieren oder am Ort belassen, Songtyp, bei Ordnern die Genre-Zuweisung) bleiben unver\u00e4ndert.<\/li>\n\n\n\n<li><strong>Ordner-Importe finden jetzt auch enthaltene ZIP-Pakete.<\/strong> Zieht man einen Ordner auf den NEU-Button (oder w\u00e4hlt ihn \u00fcber \u201eOrdner importieren&#8220;), durchsucht Callers Caddy ihn rekursiv nach Audiodateien UND ZIP-Label-Paketen. Bisher wurden ZIPs in einem Ordner ignoriert.<\/li>\n\n\n\n<li><strong>Bei gemischtem Inhalt fragt eine transparente R\u00fcckfrage nach.<\/strong> Enth\u00e4lt ein Drop bzw. Ordner sowohl MP3-\/Audiodateien als auch ZIP-Pakete, erscheint ein Dialog mit der genauen Anzahl beider Typen und den Optionen <strong>Nur MP3 \/ Nur ZIPs \/ Beides<\/strong>. Danach l\u00e4uft alles im gewohnten Import-Prozess weiter (ZIPs ins Vorschau-Fenster, Audio mit Kopieren\/Typ\/Genre).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.145 \u2014 Aufger\u00e4umtes Songlisten-Highlight &amp; Countdown verschwindet beim Liedstop (2026-09-02)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Hervorhebung in der Songliste nutzt jetzt die native Zeilen-Auswahl von Qt \u2014 genau eine Zeile ist markiert, und sie wandert beim Wechsel sauber in einem Schritt.<\/strong> Zuvor lag ein eigenes Highlight zus\u00e4tzlich \u00fcber der Auswahl. Beide schalteten nicht gleichzeitig um, wodurch beim Songwechsel kurz zwei Farben zu sehen waren und das alte Lied noch einmal aufblaute, bevor die Markierung weitersprang. Das zweite System ist entfallen \u2014 weniger Code, ein durchg\u00e4ngiges Verhalten.<\/li>\n\n\n\n<li><strong>Beim \u00dcberfahren mit der Maus wird die markierte Zeile nicht mehr grau \u00fcberdeckt.<\/strong> Eine Hover-Regel im Design f\u00e4rbte die Zelle unter dem Mauszeiger um, sodass es wirkte, als sei nur eine der beiden Spalten (Titel\/Gespielt) hervorgehoben. Die Regel wurde entfernt; die Markierung bleibt beim Hovern vollst\u00e4ndig erhalten.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der Einz\u00e4hl-Countdown verschwindet jetzt zuverl\u00e4ssig beim Stoppen oder Wechseln des Liedes.<\/strong> Das Countdown-Overlay liegt bewusst \u00fcber allen Fenstern; bei aktivem \u201eFeedback am Liedende&#8220;-Dialog blieb die Countdown-Zahl daher sichtbar vor dem Dialog stehen, wenn man mitten im Einz\u00e4hlen das Lied wechselte. Der Countdown wird nun direkt beim Liedstop ausgeblendet \u2014 noch bevor der Feedback-Dialog erscheint.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.144 \u2014 Doppelklick startet den Song &amp; durchg\u00e4ngiges Now-Playing-Highlight (2026-09-02)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Doppelklick in der Songliste startet den Song sofort.<\/strong> Ein Doppelklick auf einen Song in der Songliste l\u00e4dt ihn nicht nur, sondern <strong>spielt ihn direkt ab<\/strong> \u2014 ein Schritt weniger im Live-Betrieb. Der Einfachklick bleibt wie gewohnt: Er selektiert und l\u00e4dt den Song, ohne die Wiedergabe zu starten.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der aktuell spielende Song wird durchg\u00e4ngig hervorgehoben \u2014 in Songliste UND Playlist.<\/strong> Bisher war die Markierung uneinheitlich (mal sichtbar, mal nicht), weil sie an der Zeilen-Auswahl hing. Jetzt folgt ein eigenes Hintergrund-Highlight dem <strong>tats\u00e4chlich laufenden Song<\/strong> \u2014 egal, ob er per Klick, Doppelklick, aus der Playlist oder \u00fcber eine Regel gestartet wurde. Das Highlight bleibt auch nach Filtern\/Sortieren der Songliste an der richtigen Zeile.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">0.143 \u2014 Neue Regel-Aktion \u201eCreate Jump Marker&#8220; &amp; Fixes f\u00fcr den Neuaufbau aus dem Quellcode (2026-09-02)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neue Regel-Aktion \u201eCreate Jump Marker&#8220;.<\/strong> Setzt per Regel bzw. Stream-Deck-\/Tastenknopf eine eigene Sprungmarke an der aktuellen Abspielposition des laufenden Liedes. Anders als der manuelle \u201eMarker setzen&#8220;-Knopf fragt diese Aktion <strong>nicht<\/strong> nach einer Beschriftung, sondern nimmt automatisch die aktuelle Position als <strong>mm:ss<\/strong> als Beschriftung \u2014 ideal, um w\u00e4hrend des Callens im Vorbeigehen (z. B. per Fernbedienungs- oder Stream-Deck-Taste) eine Stelle zu markieren, ohne den Ablauf zu unterbrechen. Die Aktion wird nur bei <strong>laufender Wiedergabe<\/strong> ausgef\u00fchrt; liegt bereits eine Marke sehr nah (unter 1 Sekunde) an der Position, wird keine zweite gesetzt. Zu finden im Rule-Editor in der Gruppe \u201eTransport&#8220;.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Erster Start gegen eine leere Datenbank brach ab (<code>no such column: origin<\/code>).<\/strong> Die Spalte <code>origin<\/code> der Tabelle <code>dance_programs<\/code> stand nur als nachtr\u00e4gliche Migration (<code>ALTER TABLE<\/code>), nicht im <code>CREATE TABLE<\/code>. Da beim Erststart die Migration vor dem Anlegen der Tabelle l\u00e4uft, lief der ALTER ins Leere (Fehler wird verschluckt) und die Tabelle wurde ohne <code>origin<\/code> angelegt \u2014 worauf das Einspielen der Referenzdaten (<code>reseed_reference_data<\/code>) abst\u00fcrzte. Die Spalte steht jetzt zus\u00e4tzlich im <code>CREATE TABLE<\/code>; die Migration bleibt f\u00fcr bestehende Datenbanken erhalten. Im ausgelieferten Setup war der Fehler unsichtbar, weil dort die vorbereitete Datenbank mitkommt \u2014 er traf nur Neuaufbauten aus dem Quellcode. (Dank an Thomas Franzek f\u00fcr Analyse und Patch.)<\/li>\n\n\n\n<li><strong><code>pip install -r installer\/requirements.txt<\/code> schlug fehl.<\/strong> Der Versions-Pin <code>access-parser&gt;=0.4<\/code> verwies auf eine nicht existierende Version \u2014 auf PyPI gibt es die Bibliothek nur in der <code>0.0.x<\/code>-Reihe. Auf <code>access-parser&gt;=0.0.4<\/code> korrigiert (dieselbe gemeinte Untergrenze). Betraf jede Frischinstallation der Abh\u00e4ngigkeiten. (Dank an Thomas Franzek.)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">0.142 \u2014 Sprungmarken &amp; To-Call-Liste, relative Positions-Regelaktion, Genre-L\u00f6schfix (2026-09-01)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Eigene Sprungmarken mit Beschriftung (BL-185).<\/strong> Besonders f\u00fcr Caller, die mit Aufnahmen (Recordings) arbeiten: An beliebiger Stelle im Song lassen sich jetzt frei benannte Sprungmarken setzen \u2014 z. B. \u201eBeginn 2. Abschnitt&#8220; oder \u201eApplaus&#8220; \u2014 um eine Sequenz gezielt noch einmal anzuspielen. <strong>Setzen:<\/strong> Song im Player abspielen und im \u201eNew Songs&#8220;-Bereich auf <strong>\u201eMarker setzen&#8220;<\/strong> klicken (der Platz teilt sich jetzt mit \u201eBeat Snap&#8220;); es folgt eine Abfrage der Beschriftung (vorbef\u00fcllt mit dem Zeitstempel). <strong>Springen:<\/strong> In \u201eSong Data&#8220; erscheint zwischen \u201eLoo&#8212;p Offset&#8220; und \u201eLyrics file&#8220; pro Marke ein Button mit der Beschriftung \u2014 ein Klick springt dorthin. <strong>Verwalten:<\/strong> Rechtsklick auf einen Marker-Button (Beschriftung\/Zeit bearbeiten, l\u00f6schen) oder im Dialog \u201eErweiterte Daten&#8220; im neuen Reiter \u201eMarker&#8220;. Die Marken liegen platzsparend in den erweiterten Song-Daten (keine leeren Datenbankfelder f\u00fcr Caller, die das nicht nutzen) und sind an die Original-Zeit gebunden, also tempo-\/Pitch-unabh\u00e4ngig. Beliebig viele Marken pro Song m\u00f6glich.<\/li>\n\n\n\n<li><strong>Neues Fenster \u201eTo Call&#8220; \u2014 Calls \u00fcber den Abend abhaken (BL-199).<\/strong> Viele Caller wollen im Verlauf eines Abends jeden Call eines Programms mindestens einmal einsetzen. Das neue andockbare Fenster zeigt die gew\u00fcnschten Calls als Kacheln, gleichm\u00e4\u00dfig \u00fcbers Feld verteilt (mit dynamischem Umbruch wie beim Sprungmarken-Fenster). Anfangs sind alle kontrastreich; <strong>ein Klick markiert einen Call als erledigt<\/strong> \u2014 die Kachel wechselt Hintergrund und Text auf ged\u00e4mpfte Theme-Farben (weiterhin gut lesbar) und <strong>wandert ans Ende nach unten<\/strong>, wo sich die erledigten Calls in halber Gr\u00f6\u00dfe sammeln. Dadurch r\u00fccken die offenen Calls oben nach und bekommen mehr Platz \u2014 je weiter der Abend, desto gro\u00dfz\u00fcgiger stehen die noch offenen Figuren da. Die Schriftgr\u00f6\u00dfe passt sich pro Kachel automatisch an (kurze Namen gro\u00df, lange kleiner statt abgeschnitten). Nochmal klicken macht \u201eerledigt&#8220; r\u00fcckg\u00e4ngig. <strong>F\u00fcllen:<\/strong> \u00dcber den Knopf \u201eF\u00fcllen&#8220; in der Kopfzeile \u00f6ffnet sich ein Dialog mit dem aktuellen Tanzprogramm und allen seinen Calls (alle vorausgew\u00e4hlt), samt \u201eAlle an\/aus&#8220;. <strong>Vorab ablegen:<\/strong> Derselbe Dialog bietet \u201eZu Notizen hinzuf\u00fcgen&#8220; \u2014 die Auswahl landet als kompakter Eintrag in den Notizen (bei vollst\u00e4ndiger Auswahl nur das Programm; bei kleiner \u00c4nderung nur die Ausnahmen; sonst die Call-Liste). Beim Abhaken dieser Notiz wird das To-Call-Fenster automatisch damit gef\u00fcllt. So kann man sich die Call-Listen f\u00fcr den Abend vorbereiten. Der Abhak-Status gilt f\u00fcr die laufende Sitzung.<\/li>\n\n\n\n<li><strong>Neues Fenster \u201eSprungmarken&#8220;.<\/strong> Ein zus\u00e4tzliches, andockbares Widget (\u00fcber Men\u00fc \u201eAnsicht&#8220; einblendbar) zeigt alle Sprungziele des aktuellen Songs als gro\u00dfe Buttons: immer <strong>Start \u00b7 Loop-Start \u00b7 Loop-Ende \u00b7 Ende<\/strong> und dahinter alle eigenen Marken (nach Zeit sortiert). Die Buttons verteilen sich gleichm\u00e4\u00dfig \u00fcber die Fensterfl\u00e4che und brechen automatisch um, wenn man das Fenster verkleinert \u2014 \u00e4hnlich dem Stream Deck. Ein Klick springt sofort an die Stelle. Ideal, um w\u00e4hrend des Callens ohne Umweg \u00fcber die Song-Daten zwischen den wichtigen Stellen eines Recordings zu wechseln.<\/li>\n\n\n\n<li><strong>Neue Regel-Aktion \u201eShift Position (relative \u00b1)&#8220;.<\/strong> Verschiebt die Wiedergabe relativ zur aktuellen Position \u2014 z. B. 20 Sekunden zur\u00fcck. Der Wert wird im Format <strong>mm:ss.cs mit optionalem Vorzeichen<\/strong> eingegeben (<code>-0:20<\/code> = 20 s zur\u00fcck, <code>0:05<\/code> = 5 s vor; Dezimaltrenner Punkt oder Komma). Damit l\u00e4sst sich per Rule ein Button bauen, der beim Ausklingen eines Liedes noch einmal etwas Zeit zum sauberen Beenden schenkt. Die Zielposition wird automatisch auf Songanfang und -ende begrenzt; der Sprung nutzt denselben sanften Crossfade wie \u201eGo To Position&#8220;. Zu finden im Rule-Editor in der Gruppe \u201eTransport&#8220; direkt unter \u201eGo To Position&#8220;.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gel\u00f6schte Genres kamen beim Neustart zur\u00fcck.<\/strong> L\u00f6schte man ein Standard-Genre (z. B. \u201eBlues&#8220;), war es zwar sofort weg, tauchte beim n\u00e4chsten Programmstart aber wieder auf (mit 0 Songs). Ursache: Die Standard-Genre-Liste wurde bei jedem Start neu eingespielt. Jetzt werden die Standard-Genres nur noch <strong>einmalig<\/strong> bei der Erstbef\u00fcllung einer neuen Datenbank angelegt; danach bleiben vom Nutzer gel\u00f6schte Genres dauerhaft gel\u00f6scht. Ausnahme: Das System-Genre <strong>\u201eNEW&#8220;<\/strong> (Marker f\u00fcr neu importierte Lieder) wird weiterhin immer sichergestellt und l\u00e4sst sich nicht wegdeletieren.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.141 \u2014 Call-Mapping-Komfort &amp; -Tempo, Genre-Zuweisung beim Ordner-Import + neue Regel-Aktionen (2026-08-31)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Call-Mapping: Beispiele zu einem Call-Text ansehen.<\/strong> Im Fenster \u201eCall-Mapping&#8220; (Zuordnung der Sequenz-Texte zu den offiziellen Figuren) ist manchmal unklar, was ein aus dem Zusammenhang gerissener Text wie \u201e(Rotated)&#8220; eigentlich meint. Ein <strong>Rechtsklick<\/strong> auf einen Call-Text in der ersten Spalte bietet jetzt <strong>\u201eBeispiel zeigen&#8220;<\/strong>: Es \u00f6ffnet sich ein Betrachter mit allen Sequenzen, die diesen Text verwenden \u2014 zum Durchbl\u00e4ttern, wobei der gesuchte Text in jeder Sequenz gelb hervorgehoben ist.<\/li>\n\n\n\n<li><strong>Neue Regel-Aktionen f\u00fcr Sequenz-Filter und Tanzprogramm.<\/strong> Regeln k\u00f6nnen jetzt die Filter des Sequenzen-Fensters selbst setzen \u2014 passend z. B. zum Song-Typ oder Level: \u201eEnth\u00e4lt&#8220; (bestimmte Figur), \u201eLimit&#8220;, \u201eNur&#8220;, \u201eSchwierigkeit&#8220; und \u201eTags&#8220;. Dazu eine Aktion, die das\/die aktive(n) <strong>Tanzprogramm(e)<\/strong> setzt (Mehrfachauswahl per H\u00e4kchenliste). So stellt sich beim Start eines Blocks alles von selbst richtig ein. Au\u00dferdem neu: <strong>\u201eFokus Widget + Cursor&#8220;<\/strong> \u2014 wie \u201eFokus Widget&#8220;, bringt aber zus\u00e4tzlich den Mauszeiger in die Mitte des Widgets (praktisch beim Lyrics-Fenster, um sofort weiterzuscrollen).<\/li>\n\n\n\n<li><strong>Genres direkt beim Ordner-Import vergeben (BL-184).<\/strong> Wer einen ganzen Ordner importiert, dessen Lieder alle zusammengeh\u00f6ren (z. B. \u201eRecordings&#8220;, \u201eElvis&#8220; oder lauter Singings), kann die passenden Genres jetzt sofort f\u00fcr alle importierten Lieder auf einmal setzen. Nach der Ordnerwahl erscheint ein neuer Dialog mit einer H\u00e4kchenliste aller vorhandenen Genres \u2014 die angehakten werden jedem Lied des Imports zugewiesen. Ganz unten l\u00e4sst sich ein neues Genre anlegen; gibt es den Namen schon (unabh\u00e4ngig von Gro\u00df-\/Kleinschreibung), wird kein Duplikat erzeugt, sondern das vorhandene Genre angehakt. Das automatische \u201eNEW&#8220;-Genre ist in der Liste eingeblendet und vorausgew\u00e4hlt \u2014 man kann es hier abw\u00e4hlen, wenn die Lieder direkt als \u201eeingearbeitet&#8220; gelten sollen. Der reine Datei-Import (einzelne Dateien) bleibt unver\u00e4ndert.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Call-Mapping: komfortables Suchfeld f\u00fcr die Figur-Zuordnung.<\/strong> Die Spalte \u201eFigur (Teaching Order)&#8220; nutzt jetzt dieselbe Suche wie die Sequenz-Filter: Tippen findet Treffer auch in der Wortmitte (z. B. \u201ethru&#8220; \u2192 \u201ePass Thru&#8220;) und zeigt sie als Auswahl-Popup, und ein kleines \u201ex&#8220; im Feld leert die Eingabe mit einem Klick.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Call-Mapping \u201eAuswahl best\u00e4tigen&#8220; von mehreren Sekunden auf Sekundenbruchteile.<\/strong> Bisher wurde jede best\u00e4tigte Zeile einzeln in die Datenbank geschrieben und danach die komplette Liste (~10.000 Zeilen) neu aufgebaut \u2014 inklusive einer teuren Vorschlags-Berechnung \u00fcber alle Zeilen. Jetzt werden alle best\u00e4tigten Zeilen in einem Rutsch gespeichert und nur die betroffenen Zeilen aus der Ansicht entfernt.<\/li>\n\n\n\n<li><strong>Call-Mapping-Fenster \u00f6ffnet sp\u00fcrbar schneller.<\/strong> Die Bedienoberfl\u00e4che erscheint sofort, der sichtbare Teil der Liste ist gleich farbig, und die Vorschl\u00e4ge f\u00fcr die \u00fcbrigen Zeilen werden im Hintergrund nachgezogen (beim erneuten \u00d6ffnen in derselben Sitzung sofort). Die Vorschlags-Berechnung selbst wurde zus\u00e4tzlich beschleunigt.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.140 \u2014 Bugfixes: Sequenz-Programmfilter &amp; Suchfeld-Vervollst\u00e4ndigung (2026-08-29)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Verst\u00fcmmelte Auto-Vervollst\u00e4ndigung in den Sequenz-Suchfeldern.<\/strong> In den Feldern \u201eEnth\u00e4lt&#8220; und \u201eLimit&#8220; (sowie Tags) im Sequenzen-Fenster erzeugte die Eingabe eines Wortteils wie \u201eThru&#8220; w\u00e4hrend des Tippens Murks im Feld (z. B. \u201eThru thru&#8220;); erst mit Enter sprang es auf den richtigen Call (\u201ePass Thru&#8220;). Ursache war eine unpassende Vervollst\u00e4ndigungs-Betriebsart. Die Felder zeigen die Substring-Treffer jetzt sauber als Auswahl-Popup, und Enter \u00fcbernimmt den markierten Call direkt.<\/li>\n\n\n\n<li><strong>Sequenzen verschwanden bei Programm-Auswahl.<\/strong> Nach dem Import vieler eigener Sequenzen (z. B. aus SqView) zeigte die Sequenzliste <strong>nur ohne<\/strong> gew\u00e4hltes Tanzprogramm etwas an \u2014 sobald ein Programm gew\u00e4hlt war, blieb sie leer. Ursache: Bei einem Massenimport wurden die Figuren der importierten Sequenzen nicht automatisch den bekannten Calls zugeordnet, und ohne diese Zuordnung konnte der Programm-Filter keine Sequenz als \u201etanzbar&#8220; erkennen. Behoben an drei Stellen: (1) beim ersten Start der neuen Version werden fehlende Zuordnungen f\u00fcr eindeutige Call-Texte automatisch und einmalig nachgetragen (bestehende Datenbanken heilen sich damit von selbst, ohne Zutun); (2) jeder k\u00fcnftige Massenimport legt die Zuordnungen direkt mit an; (3) der \u201eRemapping&#8220;-Knopf im Sequenzen-Fenster erg\u00e4nzt jetzt ebenfalls fehlende Zuordnungen, statt nur neu zu rechnen. Manuelle Zuordnungen bleiben dabei unangetastet.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.139 \u2014 Tanzprogramm-Umstellung 2026 (MS50 \/ Plus \/ Advanced 1) (2026-08-27)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Unterst\u00fctzung f\u00fcr die neuen Tanzprogramme ab September 2026.<\/strong> Das Mainstream-Programm wird auf 50 Calls gestrafft (MS50), und einige Figuren wandern aus Mainstream und Advanced 1 nach Plus. Callers Caddy kennt jetzt beide Welten gleichzeitig: die neuen Programme <strong>Mainstream (2026)<\/strong>, <strong>Plus (2026)<\/strong> und <strong>Advanced 1 (2026)<\/strong> neben den bisherigen Listen <strong>Mainstream<\/strong>, <strong>Plus<\/strong> und <strong>Advanced 1<\/strong>. So bleibt in der \u00dcbergangszeit beides tanzbar.<\/li>\n\n\n\n<li><strong>Mehrere Tanzprogramme je Lokation.<\/strong> Eine Lokation kann jetzt mehrere Programme gleichzeitig f\u00fchren \u2014 als Checkbox-Auswahl, sowohl in den Lokations-Einstellungen als auch \u00fcber den Programm-Button im Player. Das ist n\u00f6tig, weil eine Figur in mehreren Programmen stehen kann: Wer z. B. Plus tanzt, w\u00e4hlt <strong>Plus (2026)<\/strong> und <strong>Mainstream (2026)<\/strong> gemeinsam an (die tieferen Programme geh\u00f6ren bewusst dazu und werden nicht automatisch mitgezogen).<\/li>\n\n\n\n<li><strong>Sequenz-Filter nach Programm-Auswahl.<\/strong> Die Sequenzliste zeigt genau die Sequenzen, deren Figuren alle in den gew\u00e4hlten Programmen der Lokation vorkommen \u2014 auch wenn eine Figur durch die Umstrukturierung in mehreren Programmen steht. Der \u201eNur&#8220;-Filter zeigt dabei die Sequenzen, die das <strong>h\u00f6chste<\/strong> gew\u00e4hlte Programm wirklich brauchen (nicht schon mit einem tieferen Programm tanzbar sind).<\/li>\n\n\n\n<li><strong>Tanzprogramm-Auswahl ist jetzt unabh\u00e4ngig von der Lokation.<\/strong> Die gew\u00e4hlten Tanzprogramme gelten f\u00fcr die ganze Sitzung und funktionieren auch <strong>ohne<\/strong> gew\u00e4hlte Lokation \u2014 der Programm-Button im Player \u00f6ffnet die Auswahl direkt. Die zuletzt getroffene Wahl wird gemerkt und beim n\u00e4chsten Start wieder geladen. W\u00e4hlt man eine Lokation, \u00fcbernimmt sie ihre eigenen Programme. Die aktuelle Auswahl steht zus\u00e4tzlich in <strong>Einstellungen \u2192 Sequenzen \u2192 Tanzprogramm(e)<\/strong> und l\u00e4sst sich dort \u00fcber einen Button \u00e4ndern. F\u00fcr die Ziel-Songdauer gilt das h\u00f6chste gew\u00e4hlte Programm.<\/li>\n\n\n\n<li><strong>Aufger\u00e4umte Tanzprogramm-Liste inkl. Class-Programme.<\/strong> Die Liste der Tanzprogramme ist jetzt klar nach Level gruppiert \u2014 innerhalb jeder Familie in der Reihenfolge <em>alt \u2192 (2026) \u2192 (Class)<\/em>. Die Class-Programme (Mainstream (Class), Plus (Class) \u2026) bleiben erhalten und nutzen dieselben Figuren wie die jeweilige 2026er-Liste; die Ziel-Songdauer l\u00e4sst sich pro Programm frei anpassen. Nebenbei behoben: Class-Programme konnten je nach Programmstart mal auftauchen und mal verschwinden.<\/li>\n\n\n\n<li><strong>Figuren-Filter im Sequenzen-Fenster folgen den gew\u00e4hlten Programmen.<\/strong> Die Auswahllisten \u201eEnth\u00e4lt&#8220; und \u201eLimit&#8220; zeigen jetzt nur noch Figuren der aktuell gew\u00e4hlten Tanzprogramme \u2014 und jede Figur an der richtigen Stelle: eine nach Plus gewanderte Figur (z. B. Spin Chain Thru) erscheint bei MS 2026 + Plus 2026 unter Plus, nicht mehr unter Mainstream. Der \u201eLimit&#8220;-Filter grenzt die Sequenzen jetzt sauber \u00fcber die Programm-B\u00e4nder ein (statt \u00fcber einen im Parallelbetrieb unzuverl\u00e4ssig gewordenen Einzelwert).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dynamic Lyrics mit Zufall: auch die erste Sequenz wird gemischt.<\/strong> Ist im Sequenzen-Detail der W\u00fcrfel-Modus (Shuffle) aktiv, startet Dynamic Lyrics jetzt schon mit einer zuf\u00e4lligen Sequenz \u2014 statt immer mit der ersten der festen Reihenfolge. Das \u201eschon gehabt&#8220;-Ged\u00e4chtnis der Sitzung wird dabei fortgef\u00fchrt: bereits gezeigte Sequenzen werden \u00fcbersprungen, bis alle dran waren.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sequenzliste bei Programmwechsel drastisch schneller.<\/strong> Die Auswertung \u201ewelche Sequenzen sind mit den gew\u00e4hlten Programmen tanzbar&#8220; wird nur noch <strong>einmal<\/strong> je Programm-Menge berechnet und dann gemerkt (statt bei jedem Wechsel mehrfach). Nach der ersten Wahl eines Programms sind Programmwechsel, Scrollen, Filter und Detail-Ansicht praktisch verz\u00f6gerungsfrei; die gemerkte Auswertung verwirft sich automatisch, sobald sich Sequenzen, Zuordnungen oder Programme \u00e4ndern. Auf schw\u00e4cheren Rechnern verschwindet die bisherige mehrsek\u00fcndige Wartezeit.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Umstellung &amp; Datensicherheit<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Automatische, einmalige Umstellung beim ersten Start.<\/strong> Bestehende Lokationen werden auf die 2026-Programme gestellt (Standard \u201eneu&#8220;). Vorher legt Callers Caddy automatisch ein Backup der Datenbank an. Wer eine Lokation weiterhin nach der alten Liste tanzen m\u00f6chte, w\u00e4hlt in den Einstellungen einfach die alten Programme wieder an (Basic 1 + 2, Mainstream, Plus, Advanced 1).<\/li>\n\n\n\n<li>Die Programme <strong>Advanced 2 bis Challenge 3B<\/strong> bleiben unver\u00e4ndert.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.138 \u2014 Sequenz-Tags, Detail-Header &amp; Rules-Fenster (2026-08-27)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neue Regel-Aktion \u201eCustom Size Widget&#8220;.<\/strong> \u00d6ffnet ein Widget als schwebendes Fenster mit frei w\u00e4hlbarer Gr\u00f6\u00dfe und Position \u2014 Breite, H\u00f6he sowie X-\/Y-Position jeweils in Prozent. Die bisherige Aktion \u201eFullsize Widget&#8220; (fest 90 %, zentriert) bleibt unver\u00e4ndert erhalten. X\/Y verstehen sich als Platzierung im verf\u00fcgbaren Rest (0 = b\u00fcndig links\/oben, 50 = zentriert, 100 = b\u00fcndig rechts\/unten), sodass das Fenster bei jeder Gr\u00f6\u00dfe voll sichtbar bleibt.<\/li>\n\n\n\n<li><strong>Sequenz-Detail zeigt Typ &amp; Schwierigkeit im Kopf.<\/strong> Die Sequenz-Detail-Ansicht hat jetzt oben eine Kopfzeile mit Sequenz-Typ und Schwierigkeit der gerade angezeigten Sequenz \u2014 so sieht man auf einen Blick, um welche Art Sequenz es sich handelt, auch ohne aktiven Filter. Die Kopfzeile passt ihre Schriftgr\u00f6\u00dfe automatisch an die verf\u00fcgbare Breite an und bleibt gut lesbar.<\/li>\n\n\n\n<li><strong>Frei vergebbare Tags f\u00fcr Sequenzen.<\/strong> Jede Sequenz kann jetzt zus\u00e4tzlich zu Typ und Schwierigkeit einen frei w\u00e4hlbaren Tag bekommen \u2014 etwa \u201eOnce and a half&#8220;, \u201eAsymmetrische Choreo&#8220; oder \u201eOne the x Hand&#8220;. Das Feld steht im Sequenz-Editor unter \u201eSchwierigkeit&#8220; und schl\u00e4gt beim Tippen bereits genutzte Tags vor, damit keine leicht abweichenden Schreibvarianten entstehen. Im Sequenzen-Fenster gibt es daf\u00fcr einen neuen Filter: Tag ausw\u00e4hlen zeigt nur Sequenzen mit genau diesem Tag, ein <strong>x<\/strong> setzt den Filter wieder zur\u00fcck.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u00dcbersichtlicher Regel-Editor.<\/strong> Die Parameter einer Aktion stehen jetzt beschriftet untereinander unter der Aktion, statt unbeschriftet in einer immer breiter werdenden Zeile. Das Rules-Fenster bleibt dadurch schmal, auch bei Aktionen mit vielen Einstellungen, und jedes Feld ist klar benannt.<\/li>\n\n\n\n<li><strong>Kein versehentliches Verstellen per Mausrad im Rules-Fenster.<\/strong> Scrollt man durch das Regelfenster, \u00e4ndern die Auswahl- und Zahlenfelder ihren Wert nicht mehr, nur weil der Mauszeiger dar\u00fcber schwebt. Klickt man ein Auswahlfeld aktiv an, l\u00e4sst sich die ge\u00f6ffnete Liste weiterhin per Mausrad durchscrollen. \u00dcbrige Fenster (z. B. lange Figuren-Listen) bleiben wie gewohnt scrollbar.<\/li>\n\n\n\n<li><strong>Figuren-Suche im Sequenzen-Filter: Tippen statt Scrollen.<\/strong> Die Felder \u201eEnth\u00e4lt&#8220; und \u201eLimit&#8220; sind jetzt echte Suchfelder: Man tippt einen Teil eines Figurennamens (z. B. \u201edodge&#8220;) und bekommt sofort alle passenden Figuren vorgeschlagen, in denen der Text irgendwo vorkommt \u2014 nicht mehr nur am Wortanfang. Die Vorschl\u00e4ge sind nach dem gew\u00e4hlten Tanzprogramm sortiert (Figuren des aktuellen Programms zuerst, h\u00f6here Programme danach). Ein kleines <strong>x<\/strong> im Feld setzt den Filter mit einem Klick zur\u00fcck, ohne wieder nach oben scrollen zu m\u00fcssen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.137 \u2014 Neues Theme \u201eWinter is Coming&#8220; (2026-08-26)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neues Theme \u201eWinter is Coming&#8220; von Thomas Franzek.<\/strong> Ein dunkles Theme mit tiefem Navy und eisigen Blau-Akzenten (angelehnt an \u201eGame of Thrones&#8220;). Ausw\u00e4hlbar \u00fcber <strong>Einstellungen \u2192 Anzeige \u2192 Skin \/ Theme<\/strong>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.136 \u2014 Gro\u00dfe Sequenz-Bibliothek, l\u00e4ngere Sequenzen &amp; schneller Import (2026-08-23)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Alle Sequenz-Typen im Vollpaket.<\/strong> Die Neuinstallation bringt jetzt die komplette Choreografie-Bibliothek mit rund 10.000 Sequenzen \u00fcber alle Typen mit (Corner Progression, R-H Lady, Singing Break, Static Set, Zero-Varianten u. v. m.).<\/li>\n\n\n\n<li><strong>Referenz-Sequenzen zum Nachimportieren.<\/strong> Bestandsnutzer finden im Programmordner unter <code>Sequence-Import<\/code> die Datei <code>sequence-import-v0136.json<\/code> mit allen Sequenzen und k\u00f6nnen sie \u00fcber \u201eSequenzen \u2192 Sequenzen importieren (JSON)\u2026&#8220; einspielen. Der Import \u00fcberspringt automatisch bereits vorhandene Sequenzen (keine Duplikate).<\/li>\n\n\n\n<li><strong>Sequenzen d\u00fcrfen jetzt mehr als 15 Calls haben.<\/strong> Die bisherige harte Grenze von 15 Calls pro Sequenz ist aufgehoben \u2014 lange Patter-Sequenzen (bis dato abgeschnitten) werden vollst\u00e4ndig gespeichert und angezeigt. \u00c4ltere Programmversionen k\u00f6nnen dieselbe Datenbank weiterhin lesen (Abw\u00e4rtskompatibilit\u00e4t).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Deutlich schnellerer Import.<\/strong> Alle Import-Wege (JSON, CSDS, Freitext, MDB, universeller Import) laufen jetzt geb\u00fcndelt: ein Import von 10.000 Sequenzen dauert Sekunden statt einer Minute. W\u00e4hrend des Imports zeigt der Mauszeiger eine Sanduhr.<\/li>\n\n\n\n<li><strong>Saubere Sequenz-Typen.<\/strong> Doppelte Typ-Bezeichnungen f\u00fcr dieselbe Sache wurden zusammengef\u00fchrt (z. B. \u201eSinger&#8220; und \u201eSinging call&#8220; f\u00fcr Corner Progression), Trenner vereinheitlicht (Pfeil statt Bindestrich) und das reine \u201eComplete Dance Routine&#8220;-Anh\u00e4ngsel entfernt, das Schein-Kategorien im Filter erzeugte.<\/li>\n\n\n\n<li><strong>Auswahl-Felder mit einem Klick.<\/strong> Editierbare Dropdown-Felder (u. a. \u201eEnth\u00e4lt&#8220;-Filter, Typ\/Schwierigkeit in den Import- und Editor-Dialogen, Figur-Auswahl im Call-Mapping) \u00f6ffnen ihre Liste jetzt bei einem Klick irgendwo ins Feld \u2014 nicht mehr nur \u00fcber den schmalen Pfeil. Tippen zum Suchen bleibt m\u00f6glich.<\/li>\n\n\n\n<li><strong>Sichtbarer Dropdown-Pfeil im Theme \u201ewin11&#8243;.<\/strong> Der Auswahl-Pfeil war dort wei\u00df auf wei\u00dfem Feld (unsichtbar) und ist jetzt klar erkennbar.<\/li>\n\n\n\n<li><strong>Call-Mapping: Suche pro Spalte.<\/strong> Unter den Spalten\u00fcberschriften gibt es Suchfelder, mit denen sich Call-Text, Figur und Quelle filtern lassen (z. B. alle Figuren mit \u201e&amp; Spread&#8220; finden).<\/li>\n\n\n\n<li><strong>Call-Mapping \u00f6ffnet mit Ladeanzeige.<\/strong> Statt 1\u20133 Sekunden ohne R\u00fcckmeldung zu warten, erscheint das Fenster sofort mit Hinweis \u201eL\u00e4dt \u2026&#8220; und Sanduhr.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes &amp; Technik<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Der \u201eEnth\u00e4lt&#8220;-Filter ist intern auf einen indizierten Nachschlage-Index umgestellt und bleibt dadurch auch bei \u00fcber 10.000 Sequenzen schnell.<\/li>\n\n\n\n<li>Typlose Alt-Sequenzen ohne erkennbaren Typ wurden bereinigt.<\/li>\n\n\n\n<li><strong>Call-Mapping-Lesbarkeit:<\/strong> Die farbig hinterlegten Call-Texte hatten im dunklen Theme hellen Text auf hellem Grund \u2014 jetzt durchgehend dunkler, gut lesbarer Text.<\/li>\n\n\n\n<li><strong>Singing-Call-Abschnitte:<\/strong> Eine \u00dcberschrift wie \u201eALTERNATE OPENER \u2013 BREAK \u2013 CLOSER&#8220; beanspruchte f\u00e4lschlich die echten Opener\/Break\/Closer-Abschnitte, sodass die Dynamic-Lyrics-Anzeige zum Alternativ-Block sprang. Solche \u201eAlternate\/Additional&#8220;-Bl\u00f6cke werden jetzt korrekt als Zusatz behandelt (betroffene Songs einmal neu synchronisieren).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.135 \u2014 Lokations-Sessions (Termine, Start-Erkennung, geteilte Historie) &amp; Zufallssprung per Regel (2026-08-21)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Termin-Angaben pro Lokation (mehrere Wochentag\/Uhrzeit-Slots).<\/strong> Im Einstellungs-Dialog einer Lokation l\u00e4sst sich jetzt eine Liste von Terminen hinterlegen \u2014 jeder mit eigenem Wochentag und eigener Von-bis-Uhrzeit. So kann dieselbe Lokation z. B. dienstags abends und samstags nachmittags zu unterschiedlichen Zeiten tanzen. Termine lassen sich per \u201e+ Termin&#8220; hinzuf\u00fcgen und einzeln entfernen. Grundlage f\u00fcr die neue Start-Erkennung und kommende Session-Funktionen. Ohne Termin gilt die Lokation wie bisher als terminlos.<\/li>\n\n\n\n<li><strong>Automatische Lokations-Erkennung beim Programmstart.<\/strong> Passt der aktuelle Wochentag und die Uhrzeit zu einer hinterlegten Lokation, schl\u00e4gt Callers Caddy diese beim Start vor (\u201ePassend zu heute \u2026 Lokation \u201aX&#8216; starten?&#8220;) und \u00fcbernimmt sie auf Best\u00e4tigung. Bei mehreren passenden Lokationen erscheint eine Auswahl, bei keiner passenden bleibt alles wie gehabt. Der Vorschlag greift nur, solange noch keine Lokation gew\u00e4hlt ist, und mit einem Toleranzfenster ab 60 Minuten vor Beginn.<\/li>\n\n\n\n<li><strong>Geteilte Abspielhistorie zwischen Lokationen.<\/strong> Im Einstellungs-Dialog einer Lokation l\u00e4sst sich \u00fcber \u201eHistorie teilen mit \u2026&#8220; eine andere Lokation als gemeinsame Historien-Basis w\u00e4hlen. Danach z\u00e4hlen Plays beider Lokationen zusammen \u2014 ideal f\u00fcr Clubs, die an mehreren Tagen mit teils denselben T\u00e4nzern tanzen: derselbe \u201eneue&#8220; Song wird nicht doppelt empfohlen. Bereits vorhandene Eintr\u00e4ge werden nach R\u00fcckfrage in die gemeinsame Historie \u00fcbernommen. Notizen, Tanzprogramm, Tempo und Termine bleiben pro Lokation getrennt.<\/li>\n\n\n\n<li><strong>Neue Unter-Lokation anlegen.<\/strong> Ein Klick erzeugt eine Lokation, die alle Einstellungen und Termine der gew\u00e4hlten Lokation \u00fcbernimmt und ihre Historie automatisch mit ihr teilt \u2014 der schnelle Weg, einen zweiten Tanztag desselben Clubs einzurichten.<\/li>\n\n\n\n<li><strong>Verkn\u00fcpfte Lokationen sichtbar &amp; anklickbar.<\/strong> Der Einstellungs-Dialog zeigt unter den Terminen alle Lokationen mit gemeinsamer Historie; die historienf\u00fchrende Lokation ist fett und unterstrichen hervorgehoben, und per Klick wechselt man direkt in deren Einstellungen. In der Lokationsliste ist eine geteilte Historie mit \u201e\u2192 Zielname&#8220; gekennzeichnet.<\/li>\n\n\n\n<li><strong>Neue Rule-Aktion \u201eRandom Sequence&#8220; (Gruppe Sequence View).<\/strong> Springt in der Sequenz-Detailansicht per Regel zu einer zuf\u00e4llig gew\u00e4hlten anderen Sequenz \u2014 unabh\u00e4ngig davon, ob der W\u00fcrfel-Umschalter aktiv ist. Damit l\u00e4sst sich der Zufallssprung jetzt auch \u00fcber das Virtual Stream Deck bzw. eine Fernbedienung ausl\u00f6sen. Es gilt dieselbe Logik wie im W\u00fcrfel-Modus: Ziehen ohne Zur\u00fccklegen pro Sitzung mit stiller Auff\u00fcllung, wenn alle passenden Sequenzen einmal dran waren.<\/li>\n\n\n\n<li><strong>Auswahl h\u00e4lt sich an die eingestellten Filter.<\/strong> Der Zufallssprung zieht immer nur aus den Sequenzen, die den aktuell gesetzten Filtern (Enth\u00e4lt, Typ, Schwierigkeit usw.) entsprechen \u2014 auch dann, wenn das Detail-Fenster beim Filterwechsel gerade nicht sichtbar war. Der Filterstand wird beim Ausl\u00f6sen frisch \u00fcbernommen, ohne das Sitzungs-Ged\u00e4chtnis (schon gezeigte Sequenzen) zu verlieren.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Uhrzeit-Felder in allen Themes lesbar.<\/strong> Die neuen Von-bis-Zeitfelder (und alle k\u00fcnftigen Zeit-Eingaben) werden jetzt vom Skin-System gestylt wie die \u00fcbrigen Eingabefelder \u2014 vorher waren sie im Default-Theme heller Text auf hellem Grund und kaum lesbar.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.134 \u2014 Zufalls-Modus f\u00fcr die Sequenz-Navigation (2026-08-20)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>W\u00fcrfel-Button in der Sequenz-Detailansicht (Sequence View).<\/strong> Neben \u201eWeiter&#8220; gibt es jetzt einen W\u00fcrfel-Umschalter. Ist er aktiv, springt \u201eWeiter&#8220; (Button, Pfeiltaste rechts und das automatische Durchschalten bei Dynamic Lyrics) nicht mehr zur n\u00e4chsten Sequenz in der Reihenfolge, sondern zu einer <strong>zuf\u00e4llig<\/strong> gew\u00e4hlten anderen Sequenz \u2014 immer nur aus den Sequenzen, die den aktuell eingestellten Filtern entsprechen.<\/li>\n\n\n\n<li><strong>Ziehen ohne Zur\u00fccklegen (pro Session).<\/strong> Callers Caddy merkt sich f\u00fcr die laufende Sitzung, welche Sequenzen im Zufalls-Modus schon dran waren, und wiederholt sie nicht, bis alle passenden Sequenzen einmal gezeigt wurden. Ist der Vorrat ersch\u00f6pft, f\u00fcllt er sich <strong>still im Hintergrund<\/strong> wieder auf (keine Meldung) \u2014 so st\u00f6rt im Singing Call nichts, auch nicht bei aktiven Dynamic Lyrics.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.133 \u2014 Neue Rule-Aktionen f\u00fcr Sequenzen &amp; Songs + manueller Stream-Deck-Trigger (2026-08-16)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neue Rule-Aktion \u201eSet Sequence Type&#8220; (Gruppe Sequence View).<\/strong> Schaltet den Typ-Filter im Sequenzen-Fenster per Regel auf einen gew\u00e4hlten Wert um \u2014 z. B. beim Singing Call auf die Singing-Call-Figuren, beim Patter auf Module und Get-Outs. Der Parameter bietet die tats\u00e4chlich in der Datenbank vorhandenen Sequenz-Typen als Auswahl an. Ist der gespeicherte Typ nicht mehr vorhanden, bleibt der Filter unver\u00e4ndert und ein kurzer Hinweis erscheint in der Statuszeile.<\/li>\n\n\n\n<li><strong>Neue Rule-Aktion \u201eLoad Song&#8220; (Gruppe Transport).<\/strong> W\u00e4hlt automatisch einen Song nach Typ (Singing oder Patter) und Sortierung aus und l\u00e4dt ihn startbereit in den Player (ohne automatisches Abspielen). \u201eEmpfehlung&#8220; liefert dabei immer den besten Song, w\u00e4hrend Zufalls-Sortierungen wie \u201eBalanced Roulette&#8220; (gewichteter Zufall) bei jedem Ausl\u00f6sen einen anderen Song bringen. Die Auswahl nutzt exakt dieselbe Bewertung wie die sichtbare Songliste. Verf\u00fcgbar sind alle Sortierungen der Songliste (Empfehlung, gewichteter Zufall, Zufall, Qualit\u00e4t, Zuletzt gespielt, Alphabetisch, Hinzugef\u00fcgt).<\/li>\n\n\n\n<li><strong>Neuer Trigger \u201eVirtual Stream Deck (manual only)&#8220;.<\/strong> Regeln mit diesem Trigger feuern nicht mehr automatisch bei einem Ereignis, sondern werden ausschlie\u00dflich \u00fcber das Virtual Stream Deck (bzw. manuellen Aufruf) ausgel\u00f6st. Steht ganz oben in der Trigger-Auswahl. Damit lassen sich reine Knopfdruck-Aktionen anlegen, ohne einen k\u00fcnstlichen Ausl\u00f6ser w\u00e4hlen zu m\u00fcssen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Automatisches Song-Laden per Regel blockiert nicht mehr.<\/strong> Die Aktion \u201eLoad Song&#8220; zeigt beim Laden eines Singing Calls keinen interaktiven Sync-Punkte-\u00dcbernehmen-Dialog mehr \u2014 dieser Abfrage-Dialog bleibt der manuellen Songauswahl vorbehalten. Vorher konnte im Live-Betrieb ein solcher Dialog (teils hinter dem Fenster) das Laden h\u00e4ngen lassen.<\/li>\n\n\n\n<li><strong>Virtual Stream Deck: Anfangsbuchstabe wieder gro\u00df und mitwachsend.<\/strong> Hat eine Regel kein Icon, zeigt der Button ihren Anfangsbuchstaben \u2014 dieser war bisher sehr klein und skalierte nicht mit der Kachelgr\u00f6\u00dfe. Der Buchstabe f\u00fcllt die Kachel jetzt \u00e4hnlich wie ein Icon und w\u00e4chst beim Vergr\u00f6\u00dfern\/Verkleinern des Decks korrekt mit.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.132 \u2014 Dynamic Lyrics: Sequenzen live in den Singing Call einblenden (2026-07-29)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Button \u201eDynamic Lyrics&#8220; im Lyric-Fenster (neben Auto-Scroll).<\/strong> Ist er aktiv, wird der Text der vier Figuren-Abschnitte eines Singing Calls vor\u00fcbergehend durch die im Sequence-View gew\u00e4hlten Choreografie-Sequenzen ersetzt. Die Lyric-Datei bleibt dabei komplett unangetastet \u2014 nur die Anzeige wird getauscht. Beim Ausschalten erscheint sofort wieder der Originaltext aus dem Dokument.<\/li>\n\n\n\n<li><strong>Auto-Scroll l\u00e4uft weiter.<\/strong> Die gesetzten SyncPoints bleiben g\u00fcltig; die Anzeige folgt weiter der Musik, zeigt aber die eingeblendeten Sequenz-Texte statt der Figuren-Zeilen aus der Lyric-Datei. Das Timing der Abschnitte bleibt identisch.<\/li>\n\n\n\n<li><strong>Live-Durchschalten der Choreografie.<\/strong> Beim ersten Aktivieren fragt Callers Caddy einmalig, wie die Sequenzen verteilt werden sollen: entweder dieselbe Sequenz in allen vier Figuren, oder \u2014 beginnend bei der aktuell gew\u00e4hlten Sequenz \u2014 pro Figuren-Durchgang die jeweils n\u00e4chste Sequenz. Bei geteiltem FIGURE-Block schaltet die Anzeige genau an jeder Figuren-Teil-Grenze zur n\u00e4chsten Sequenz weiter (nach dem vierten Durchgang bleibt sie stehen). Die Figuren-Teil-Zeiten werden aus den vorhandenen SyncPoints abgeleitet.<\/li>\n\n\n\n<li><strong>Einstellungen werden gemerkt.<\/strong> Sowohl die getroffene Wahl (Option 1 oder 2) als auch, ob Dynamic Lyrics \u00fcberhaupt aktiv sein soll, werden gespeichert und beim n\u00e4chsten Start wiederhergestellt. Beides l\u00e4sst sich auch in den Einstellungen unter \u201eLyrics&#8220; umschalten (\u201eDynamic Lyrics aktiv&#8220; und \u201eDynamic-Lyrics-Modus&#8220;) \u2014 die neuen Felder sind vollst\u00e4ndig \u00fcbersetzt (DE\/EN\/JA).<\/li>\n\n\n\n<li><strong>Dynamic Lyrics bleibt \u00fcber Songwechsel aktiv.<\/strong> Ist der Modus eingeschaltet, greift er beim n\u00e4chsten Song automatisch wieder und spiegelt dabei die aktuell im Sequence-View gezeigte Sequenz \u2014 man muss ihn nicht pro Titel erneut aktivieren. Bei einem Song ohne die n\u00f6tigen Voraussetzungen pausiert er still und kommt beim n\u00e4chsten passenden Titel von selbst zur\u00fcck.<\/li>\n\n\n\n<li><strong>Das Sequence-View steuert, das Lyric-Feld spiegelt.<\/strong> Beim Live-Umbl\u00e4ttern (Option 2) bl\u00e4ttert Callers Caddy an jeder Figuren-Teil-Grenze im Sequence-View eine Sequenz weiter, und das Lyric-Feld zeigt genau das, was dort gerade steht. Dieselbe Kopplung greift, wenn man im Sequence-View von Hand vor- oder zur\u00fcckbl\u00e4ttert \u2014 das Lyric-Feld folgt sofort. So ist die Grundlage gelegt, das Weiterbl\u00e4ttern sp\u00e4ter auch per Fernbedienung dem Nutzer zu \u00fcberlassen.<\/li>\n\n\n\n<li><strong>Eingeblendete Sequenzen ohne Hintergrund-Marker.<\/strong> Der eingef\u00fcgte Sequenz-Text \u00fcbernimmt Schriftart und -farbe der Umgebung, aber keine Hintergrund-\/Highlight-Farbe aus der Lyric-Datei mehr \u2014 er wird also nicht mehr versehentlich rosa (o. \u00e4.) unterlegt.<\/li>\n\n\n\n<li><strong>Sauberes Ausgrauen.<\/strong> Der Button ist nur verf\u00fcgbar, wenn alle Voraussetzungen erf\u00fcllt sind: Lyric geladen, SyncPoints gesetzt, Figuren-Abschnitte erkannt und mindestens eine Sequenz im Sequence-View gew\u00e4hlt. Fehlt etwas, ist der Button ausgegraut und nennt den Grund im Tooltip. Im Sync- und Bearbeiten-Modus ist Dynamic Lyrics nicht verf\u00fcgbar.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.131 \u2014 Update-Erinnerung pausieren, manueller Update-Check &amp; mehr Stream-Deck-Icons (2026-07-26)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Deutlich mehr Symbole f\u00fcr die Stream-Deck-Buttons.<\/strong> F\u00fcr praktisch jede Regel-Aktion gibt es jetzt ein passendes Icon (Tempo, Pitch, Live-Lautst\u00e4rke, BPM, Fenster-Fokus\/Vollbild, Dual-View, Auto-Scroll, Sequenz-Ansicht, Foto, Genre, Meldungen, Warnfarbe u. v. m.), dazu Standard-Symbole wie Richtungspfeile in alle acht Richtungen, ein Auge und ein Mauszeiger. Alle neuen Symbole sind im selben Stil gehalten und werden \u2014 wie bisher \u2014 automatisch in der Theme-Farbe eingef\u00e4rbt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Der Update-Hinweis l\u00e4sst sich jetzt f\u00fcr 7 Tage stummschalten.<\/strong> Im Fenster \u201eUpdate verf\u00fcgbar&#8220; gibt es zus\u00e4tzlich zu \u201eJetzt herunterladen&#8220; und \u201eSp\u00e4ter&#8220; die Auswahl \u201eF\u00fcr 7 Tage nicht mehr erinnern&#8220;. Wer sie anhakt, wird beim n\u00e4chsten Start eine Woche lang nicht erneut auf dieselbe Version hingewiesen \u2014 der t\u00e4gliche Hinweis beim \u00d6ffnen entf\u00e4llt also, ohne dass man das Update aus den Augen verliert. Nach Ablauf der 7 Tage meldet sich das Programm von selbst wieder. \u201eSp\u00e4ter&#8220; bleibt wie bisher der Weg f\u00fcr \u201enur dieses Mal wegklicken&#8220;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Eine wirklich neuere Version durchbricht die Ruhephase.<\/strong> Erscheint innerhalb der sieben Tage eine noch h\u00f6here Version als die verschobene, wird der Hinweis trotzdem sofort wieder angezeigt \u2014 stillgehalten wird nur genau die Version, f\u00fcr die man \u201eRuhe&#8220; gew\u00e4hlt hat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Neuer Men\u00fcpunkt \u201eNach Updates suchen\u2026&#8220; im Men\u00fc \u201eInfo&#8220;.<\/strong> Damit l\u00e4sst sich jederzeit von Hand nach einer neuen Version schauen. Anders als die automatische Pr\u00fcfung beim Start gibt der manuelle Aufruf immer R\u00fcckmeldung: entweder das Update-Fenster, \u201eCallers Caddy ist aktuell&#8220; oder ein Hinweis, wenn gerade keine Verbindung besteht. Eine gesetzte 7-Tage-Ruhephase wird dabei bewusst \u00fcbergangen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">0.130 \u2014 Automatische Update-Pr\u00fcfung beim Programmstart (2026-07-25)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Callers Caddy pr\u00fcft beim Start automatisch, ob eine neuere Version bereitsteht.<\/strong> Kurz nach dem \u00d6ffnen schaut das Programm im Hintergrund im Online-Download-Bereich nach. Liegt dort eine h\u00f6here Version als die installierte, erscheint ein Hinweis \u201eEs ist ein Update (Version xy) verf\u00fcgbar&#8220; mit den Schaltfl\u00e4chen \u201eJetzt herunterladen&#8220; und \u201eSp\u00e4ter&#8220;. Ist alles aktuell, passiert nichts \u2014 kein Fenster, keine Verz\u00f6gerung. Auch wenn gerade keine Internetverbindung besteht, startet das Programm ganz normal weiter.<\/li>\n\n\n\n<li><strong>\u201eJetzt herunterladen&#8220; l\u00e4dt gezielt die richtige Update-Datei.<\/strong> Statt in einem Ordner voller ZIP-Dateien selbst suchen zu m\u00fcssen, startet der Knopf direkt den Download der passenden Update-Datei in den Download-Ordner. So kann nicht mehr versehentlich die komplette Neuinstallation geladen werden, die vorhandene Daten \u00fcberschreiben w\u00fcrde.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.129 \u2014 Fehlende Lyrics aus einem Ordner auff\u00fcllen: \u201eSuche in der Krabbelkiste&#8220; (2026-07-24)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Knopf \u201eSuche in der Krabbelkiste&#8220; im Optimierungs-Fenster unter \u201eOhne Lyrics&#8220;.<\/strong> Damit lassen sich fehlende Songtexte f\u00fcr Singing Calls in einem Rutsch aus einem vorhandenen Ordner voller loser Lyric-Dateien auff\u00fcllen \u2014 etwa dem exportierten Lyrics-Ordner eines anderen Programms. Nach dem Klick erkl\u00e4rt ein kurzer Dialog, was gleich passiert, und l\u00e4sst die Wahl zwischen \u201enur dieser Ordner&#8220; und \u201eauch Unterordner (rekursiv)&#8220;. Danach w\u00e4hlt man den Ordner aus, und das Programm durchsucht ihn nach passenden Kandidaten. Betroffen sind ausschlie\u00dflich Singing Calls ohne hinterlegte Lyrics.<\/li>\n\n\n\n<li><strong>Die Zuordnung erkennt passende Dateien an Titel, Label und Plattennummer \u2014 nach denselben Prinzipien wie der ZIP-Import und die Cue-Sheet-Suche.<\/strong> Abweichende Schreibweisen (Slugs, Bindestrich- und Mehrwort-Labels, Modifier-Suffixe, Gro\u00df-\/Kleinschreibung) werden dynamisch ber\u00fccksichtigt. Gesucht wird nicht nur im Dateinamen, sondern zus\u00e4tzlich im Kopf der Datei selbst \u2014 so werden auch Dateien mit nichtssagendem Namen gefunden, wenn der Titel im Text steht. Weil Songtexte pro Titel gelten und nicht pro Aufnahme, z\u00e4hlen Label und Plattennummer hier als zus\u00e4tzliche Best\u00e4tigung, verhindern aber keinen guten Titeltreffer (anders als bei der Cue-Sheet-Suche, wo es um eine bestimmte Aufnahme geht).<\/li>\n\n\n\n<li><strong>Ein Ergebnis-Dialog stellt Song und gefundene Datei gegen\u00fcber und zeigt je Zeile eine Wahrscheinlichkeit.<\/strong> Die Tabelle zeigt nebeneinander Titel, Label und Nummer des Songs sowie die aus der Datei ermittelten Angaben, dazu die Quelle (Dateiname oder Dateiinhalt) und eine kurze Begr\u00fcndung. Alle Vorschl\u00e4ge sind vorausgew\u00e4hlt \u2014 man kann sie also komplett durchwinken oder gezielt einzelne abw\u00e4hlen. Die Tabelle l\u00e4sst sich nach jeder Spalte sortieren (z. B. nach Wahrscheinlichkeit), sodass jeder selbst entscheidet, wie weit er gehen m\u00f6chte. Beim \u00dcbernehmen werden die gew\u00e4hlten Dateien in den Lyrics-Ordner kopiert und dem jeweiligen Song zugeordnet \u2014 der durchsuchte Ordner darf also ruhig ein tempor\u00e4rer Zwischenlager-Ordner sein.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Suchprinzipien von ZIP-Import und Cue-Sheet-Suche liegen jetzt an einer zentralen Stelle.<\/strong> Titel-\/Label-\/Nummer-Zerlegung und Trefferbewertung wurden in eine gemeinsame Basis zusammengef\u00fchrt, die von der neuen Krabbelkiste-Suche und der ceder.net-Suche geteilt wird. Verbesserungen an der Erkennung wirken damit k\u00fcnftig \u00fcberall gleichzeitig. Das Verhalten der Cue-Sheet-Suche bleibt dabei unver\u00e4ndert.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Im Sequenz-Detail-Fenster wird die letzte Zeile nicht mehr abgeschnitten.<\/strong> Die automatische Schriftanpassung lie\u00df bei gro\u00dfer Schrift und wenigen Zeilen einen kleinen \u00dcberlauf zu, wodurch die unterste Call-Zeile halb aus dem Fenster ragte. Die Schrift wird jetzt so weit verkleinert, dass der gesamte Inhalt sicher in die verf\u00fcgbare H\u00f6he passt \u2014 kein Anschnitt mehr, egal wie man das Fenster zieht.<\/li>\n\n\n\n<li><strong>Beim Bearbeiten einer Regel gehen Name, Trigger und Aktion nicht mehr verloren, wenn man die Stream-Deck-Felder anfasst.<\/strong> Bisher wurde beim Setzen der Button-Nummer (bzw. Icon\/Tooltip) sofort die ganze Regel gespeichert und neu geladen \u2014 noch nicht per \u201eSpeichern&#8220; best\u00e4tigte Eingaben oberhalb gingen dabei verloren, und der \u201eSpeichern&#8220;-Knopf wurde ausgegraut. Jetzt sind die Stream-Deck-Felder bei eigenen Regeln normale Editor-Felder: \u00c4nderungen halten den \u201eSpeichern&#8220;-Knopf aktiv, und ein Klick auf \u201eSpeichern&#8220; schreibt alles gemeinsam (Name, Trigger, Aktionen und Deck-Parameter inklusive der l\u00fcckenlosen Neunummerierung). System-Regeln werden weiterhin sofort aufs Deck \u00fcbernommen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.128 \u2014 Stream Deck: das Regel-System als Klick-Oberfl\u00e4che (2026-07-23)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neues, andockbares Fenster \u201eStream Deck&#8220; \u2014 das m\u00e4chtige Regel-System bekommt ein sichtbares Gesicht.<\/strong> Jede Regel kann eine Buttonnummer, ein Icon und einen Tooltip erhalten; alle Regeln mit einer Nummer gr\u00f6\u00dfer als 0 erscheinen als quadratische Kacheln im Stream Deck, sortiert nach ihrer Nummer. Ein Klick auf einen Button f\u00fchrt die Regel sofort aus \u2014 die Bedingungen werden dabei weiterhin gepr\u00fcft (z. B. \u201enur f\u00fcr Singing&#8220;), lediglich der Tasten-Ausl\u00f6ser wird \u00fcbersprungen. Die Buttons nutzen die Fensterfl\u00e4che optimal aus: sie sind immer quadratisch, brechen bei vielen Buttons in mehrere m\u00f6glichst gleichm\u00e4\u00dfig gef\u00fcllte Reihen um, und die Button-Matrix sitzt zentriert. Oben rechts \u00f6ffnet ein dezentes Zahnrad direkt das Regel-Fenster zum Anpassen. Das Fenster l\u00e4sst sich frei andocken, mit anderen Fenstern tabben oder schweben lassen \u2014 die Anordnung bleibt \u00fcber einen Neustart erhalten.<\/li>\n\n\n\n<li><strong>Das Stream Deck ist ab Werk mit den f\u00fcnf Standard-Steuertasten best\u00fcckt.<\/strong> F5\u2192Play, F6\u2192Pause, F7\u2192Stop, F8\u2192Fade Out und Leertaste\u2192Play\/Pause liegen von Anfang an als Buttons im Deck (mit passenden Icons). Es sind System-Regeln, also immer vorhanden \u2014 sie funktionieren weiterhin auch \u00fcber die echten Tasten. Wer einen Button nicht braucht, nimmt ihn einfach aus dem Deck; er kommt nicht ungefragt wieder. Auch bestehende Installationen erhalten diese Erstbest\u00fcckung beim n\u00e4chsten Start.<\/li>\n\n\n\n<li><strong>Regeln haben jetzt einen Abschnitt \u201eStream Deck&#8220; im Editor.<\/strong> Dort lassen sich Buttonnummer (= Position), Icon und Tooltip festlegen \u2014 mit einer Vorschau des gew\u00e4hlten Icons, dargestellt wie die sp\u00e4tere Kachel (damit die Icons auch auf hellen Themes gut sichtbar sind). Die Nummern werden immer l\u00fcckenlos vergeben (so viele verschiedene Zahlen wie Buttons), und eine Positions\u00e4nderung ist sofort im Deck sichtbar. Der Abschnitt ist bewusst auch f\u00fcr System-Regeln editierbar, sodass sich jede Regel aufs Deck legen l\u00e4sst.<\/li>\n\n\n\n<li><strong>17 neue Symbole f\u00fcr die Buttons.<\/strong> Play, Stop, Pause, Play\/Pause, Fade Out, Lauter, Leiser, Schneller (Hase), Langsamer (Schildkr\u00f6te), Loop, Notiz abhaken, N\u00e4chstes Lied, Pause mit letztem Lied, Pause (Kaffeetasse), Fenster \u00f6ffnen, Fenster schlie\u00dfen und Choreo (Tanzabdruck). Sie werden \u2014 wie alle Icons \u2014 automatisch in der Theme-Farbe eingef\u00e4rbt; reine Titelleisten-Icons stehen in der Auswahl bewusst nicht zur Verf\u00fcgung.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Im Sync-Modus l\u00e4sst sich der Songstart jetzt direkt per Knopf um eine Sekunde verschieben.<\/strong> Links neben den Zoom-Kn\u00f6pfen im Lyric-Fenster gibt es zwei neue Schaltfl\u00e4chen \u201e\u22121 s&#8220; und \u201e+1 s&#8220;. Ein Klick verschiebt den Beginn des Songs samt aller gesetzten Sync-Punkte und des Endpunkts um eine Sekunde nach vorne bzw. hinten \u2014 praktisch, um einen leicht zu fr\u00fch oder zu sp\u00e4t sitzenden Start nachzujustieren, ohne jeden Punkt einzeln anzufassen. Die Funktion gab es bisher schon, aber versteckt als Rechtsklick-Men\u00fc auf einem Sync-Punkt (\u201eAlle verschieben&#8220;); sie ist jetzt nur besser erreichbar. Beide Wege nutzen dieselbe Logik, und die Kn\u00f6pfe erscheinen ausschlie\u00dflich im Sync-Modus.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Fenster merken sich ihre Anordnung wieder zuverl\u00e4ssig \u2014 inklusive des zuletzt vorne liegenden Tabs.<\/strong> Fenster, die erst sp\u00e4t beim Programmstart erzeugt werden (u. a. die Pausen-Uhr und das neue Stream Deck), kehrten nach einem Neustart an eine Standardposition zur\u00fcck, statt dorthin, wo man sie zuletzt hatte \u2014 sie existierten zum Zeitpunkt der Layout-Wiederherstellung schlicht noch nicht. Jetzt werden alle Docks vor der Wiederherstellung angelegt, und zus\u00e4tzlich wird pro Tab-Gruppe gemerkt, welcher Tab vorne lag (das vergisst Qt beim Wiederherstellen sonst). Position, Gr\u00f6\u00dfe, Sichtbarkeit und aktiver Tab kommen damit f\u00fcr jedes Fenster einheitlich zur\u00fcck \u2014 ganz ohne die fr\u00fcheren Einzel-Sonderbehandlungen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.127 \u2014 Pausen-Regeln, ceder.net-Filterung, robustere Abschnittserkennung (2026-07-22)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zwei neue Regel-Aktionen f\u00fcr die Pause.<\/strong> In der Gruppe \u201eTransport&#8220; gibt es jetzt \u201eStart Break&#8220; und \u201eStart Break with last Song&#8220;. Beide \u00f6ffnen die Pausen-Uhr und starten den Countdown; die zweite spielt zus\u00e4tzlich den zuletzt gespielten Song als Wartemusik. Die Pausendauer l\u00e4sst sich als Parameter (Minuten) vorgeben \u2014 bei 0 wird automatisch die Standard-Pausendauer der aktuellen Lokation verwendet.<\/li>\n\n\n\n<li><strong>Neuer Knopf \u201e\u2728 Mach alles sch\u00f6n&#8220; im Optimierungs-Fenster (Potential).<\/strong> Ganz unten auf der \u00dcbersichtsseite f\u00fchrt er die vorhandenen Heilungsfunktionen auf Wunsch nacheinander aus, statt jede einzeln in ihrem Reiter anzusto\u00dfen. Ein Klick \u00f6ffnet eine Auswahlliste mit allen Aktionen und der jeweils gefundenen Fallzahl \u2014 BPM erkennen, Auto-Loop f\u00fcr Patter ohne Loop, BeatSnap, Songanfang und Sync-Punkte erkennen. Die auff\u00fcllenden Aktionen sind vorausgew\u00e4hlt; die beiden l\u00f6schenden Aufr\u00e4um-Aktionen (leere Lokationen, verwaiste Historie) sind bewusst nicht angehakt und m\u00fcssen einzeln aktiviert werden. Aktionen ohne F\u00e4lle sind ausgegraut. Der Lauf zeigt eine ToDo-Fortschrittsliste mit hervorgehobenem aktuellem Schritt, l\u00e4sst sich jederzeit abbrechen (bereits gemachte \u00c4nderungen bleiben erhalten) und meldet am Ende pro Aktion, wie viele Songs bearbeitet und wie viele \u00fcbersprungen wurden. Nur die jeweils offenen F\u00e4lle werden angepackt \u2014 die \u201eALLE neu durchrechnen&#8220;-Varianten der Reiter bleiben unber\u00fchrt.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Tanzprogramme und ihre Figuren-Limits werden jetzt auch bei bestehenden Installationen nachgetragen.<\/strong> Wer Callers Caddy \u00fcber ein Update aktualisiert hat (bei dem die Datenbank absichtlich erhalten bleibt), hatte die Tanzprogramme teils gar nicht oder ohne hinterlegtes Sequenz-Limit. Dadurch bewirkte der Programmwechsel keine Filterung im Sequenzen-Fenster. Beim n\u00e4chsten Start werden fehlende Programme angelegt und fehlende Figuren-Limits einmalig erg\u00e4nzt (Mainstream, Plus, A1, A2, C1, C2, C3A samt Class-Varianten). Selbst angepasste Programme, eigene Ziel-Patternl\u00e4ngen und ein bewusst auf \u201ekein Limit&#8220; gesetztes Programm bleiben dabei unangetastet.<\/li>\n\n\n\n<li><strong>Der Z\u00e4hler \u201eLoop ohne BeatSnap&#8220; sinkt jetzt nach einem BeatSnap-Lauf.<\/strong> Bisher blieb die Zahl unver\u00e4ndert, obwohl der Stapel-BeatSnap gelaufen war: Die Pr\u00fcfung wertet einen Loop erst dann als optimiert, wenn ein Loop-Offset gesetzt ist \u2014 der Stapel-Lauf hatte aber nur die Loop-Marken auf den Beat geschnappt und den Offset nie gemessen. Jetzt misst der Stapel-BeatSnap zus\u00e4tzlich den Loop-Offset (Tiefpass-Kreuzkorrelation im Bassbereich), genau wie der Einzel-Song-BeatSnap. Dadurch werden die Loops nicht nur beat-genau, sondern auch sauber \u00fcberblendbar, und die bearbeiteten Songs verschwinden aus der Liste. Das gilt auch f\u00fcr den bestehenden \u201eAlle optimieren&#8220;-Knopf im BeatSnap-Reiter.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Das Feld \u201eKontaktadresse f\u00fcr Serveranfragen&#8220; in den Einstellungen wurde entfernt.<\/strong> Es war eine reine H\u00f6flichkeits-Angabe f\u00fcr den ceder.net-Zugriff, blieb aber fast immer leer und stiftete nur Verwirrung. Bei Anfragen an ceder.net wird weiterhin ein sprechender Kennungstext mitgeschickt (Programmname + Homepage), aber keine pers\u00f6nliche E-Mail-Adresse mehr.<\/li>\n\n\n\n<li><strong>Der Netzwerk-Abschnitt in den Einstellungen ist jetzt \u00fcbersetzt.<\/strong> Der Abschnitt \u201eNetzwerk&#8220; samt \u201eCue-Sheet-Suche auf ceder.net&#8220; (inkl. Tooltip) wurde bisher in der englischen und japanischen Oberfl\u00e4che noch auf Deutsch angezeigt. Die fehlenden \u00dcbersetzungen sind erg\u00e4nzt.<\/li>\n\n\n\n<li><strong>Die Einstellung \u201ePatter-F\u00fcllung im Planner&#8220; ist jetzt \u00fcbersetzt.<\/strong> Feldname und Erkl\u00e4rungs-Tooltip erschienen in der englischen und japanischen Oberfl\u00e4che bisher noch auf Deutsch. Die fehlenden \u00dcbersetzungen sind erg\u00e4nzt.<\/li>\n\n\n\n<li><strong>Der ceder.net-Trefferdialog ist jetzt vollst\u00e4ndig \u00fcbersetzt.<\/strong> Die Spalten \u201eSicherheit&#8220; (sicher \/ wahrscheinlich \/ unsicher) und \u201eBegr\u00fcndung&#8220; (etwa \u201eTitel identisch&#8220;, \u201eTitel \u00e4hnlich (85 %)&#8220;, \u201eLabel stimmt&#8220;, \u201ePlattennummer stimmt&#8220;, \u201ekein Cue Sheet&#8220;) kamen bisher hartkodiert auf Deutsch aus der Suchlogik und blieben in der englischen und japanischen Oberfl\u00e4che un\u00fcbersetzt. Sie laufen jetzt \u00fcber die zentrale \u00dcbersetzungstabelle (Deutsch, Englisch, Japanisch).<\/li>\n\n\n\n<li><strong>Beim Holen eines Cue Sheets von ceder.net werden Navigationselemente jetzt weggefiltert.<\/strong> Der \u201etwo columns&#8220;-Umschalter oben rechts und die Datenbank-Links im Footer (\u201eData page&#8220;, \u201eCue sheet&#8220;, \u201eLyrics&#8220;) landeten bisher mit im lokalen Lyric, obwohl sie dort nichts n\u00fctzen. Sie werden jetzt vor dem Speichern entfernt. Der Herkunftsnachweis bleibt als HTML-Kommentar in der Datei erhalten.<\/li>\n\n\n\n<li><strong>Die Abschnittserkennung f\u00fcr den Auto-Sync verkraftet jetzt an die \u00dcberschrift angeh\u00e4ngte Zus\u00e4tze.<\/strong> Viele Cuesheets (u. a. von ceder.net) schreiben hinter die \u00dcberschrift nach einer gr\u00f6\u00dferen L\u00fccke noch das Tanzprogramm oder eine Beschreibung \u2014 etwa \u201eOPENER &#8211; MIDDLE BREAK &#8211; CLOSER Mainstream&#8220; oder \u201eFIGURE Plus, corner progression&#8220;. Bisher verwarf die Erkennung solche Zeilen komplett (ein einziges Fremdwort lie\u00df die ganze \u00dcberschrift durchfallen), sodass der Auto-Sync mit \u201ekeine passenden Texte&#8220; abbrach. Der Zusatz hinter der L\u00fccke wird jetzt abgetrennt; der Schutz gegen Fehlalarme aus normalen Liedzeilen bleibt bestehen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.126 \u2014 Patter auf Ziell\u00e4nge f\u00fcllen, Sequenz-Limit beim Programmwechsel (2026-07-20)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neu in den Planner aufgenommene Patter k\u00f6nnen automatisch auf die Ziell\u00e4nge gebracht werden.<\/strong> In den Einstellungen gibt es im Bereich Planer das neue Feld \u201ePatter-F\u00fcllung&#8220; mit zwei Optionen. Bei \u201eEndlos&#8220; bleibt alles wie bisher: ein neu hinzugef\u00fcgter Patter l\u00e4uft ohne feste L\u00e4nge (\u221e), bis man ihn von Hand beendet oder pro Song eine L\u00e4nge einstellt. Bei \u201eAuf Ziell\u00e4nge optimieren&#8220; wird f\u00fcr jeden neu aufgenommenen Patter \u2014 egal ob per Knopf, Doppelklick, Ziehen oder \u00fcber den Zauberstab \u2014 automatisch die passende Loop-Anzahl gesetzt, sodass er die Ziell\u00e4nge des aktiven Tanzprogramms m\u00f6glichst genau trifft. Liegt keine ganze Loop-Anzahl nah genug an der Zielzeit, wird zus\u00e4tzlich die feine K\u00fcrzung (ganze Phrasen) angewandt, die bis auf rund 20 Sekunden herankommt \u2014 dieselbe Rechnung wie im Loop-Dialog von Hand. Songs ohne g\u00fcltige Loop-Marken bleiben unver\u00e4ndert endlos. Voreingestellt ist \u201eEndlos&#8220;, sodass sich f\u00fcr bestehende Abl\u00e4ufe nichts \u00e4ndert, solange man es nicht umstellt.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ein von Hand gesetztes Limit im Sequenzen-Fenster bleibt beim Wechsel des Tanzprogramms erhalten.<\/strong> Bisher wurde der Limit-Filter beim Programmwechsel auf \u201eAlle&#8220; zur\u00fcckgesetzt, sobald das neu gew\u00e4hlte Tanzprogramm kein eigenes Sequenz-Limit hinterlegt hatte \u2014 das von Hand gew\u00e4hlte Limit ging dabei jedes Mal verloren. Jetzt wird der Filter nur noch angepasst, wenn das Zielprogramm ein Sequenz-Limit vorgibt; andernfalls bleibt die aktuelle Auswahl stehen. F\u00fcr Programme mit hinterlegtem Sequenz-Limit \u00e4ndert sich nichts.<\/li>\n\n\n\n<li><strong>Der gespeicherte Zoom im Lyric-Fenster gilt jetzt sofort beim Start.<\/strong> Wer die Lyric-Schriftgr\u00f6\u00dfe von Hand eingestellt hatte, sah nach dem Programmstart zun\u00e4chst die kleine Standardgr\u00f6\u00dfe \u2014 erst ein Druck auf einen Zoom-Knopf stellte den gemerkten Wert wieder her. Ursache war, dass die gespeicherte Gr\u00f6\u00dfe nur auf das noch leere Lyric-Fenster angewendet wurde und beim Laden des ersten Textes verloren ging. Jetzt wird sie direkt auf den geladenen Text \u00fcbernommen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.125 \u2014 Farbige Lyric-Abschnitte, pers\u00f6nliche Voreinstellungen (2026-07-20)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Lieblings-Sortierung l\u00e4sst sich jetzt fest hinterlegen.<\/strong> Wer immer nach \u201eZuletzt gespielt&#8220; oder \u201eEmpfehlung&#8220; arbeitet, musste die Sortierung bisher nach jedem Programmstart neu umstellen. In den Einstellungen gibt es daf\u00fcr den neuen Bereich \u201eSortierung&#8220; mit dem Feld \u201eLieblings-Sortierung&#8220; \u2014 alle sieben Sortierungen stehen zur Auswahl. Beim n\u00e4chsten Start sind Songliste und Planner bereits so sortiert. Im Planner wurde die Sortierung bisher bei jedem \u00d6ffnen des Fensters fest auf \u201eEmpfehlung&#8220; beziehungsweise \u201eQualit\u00e4t&#8220; gestellt \u2014 ist eine Lieblings-Sortierung hinterlegt, hat diese jetzt Vorrang, und auch eine von Hand ge\u00e4nderte Sortierung bleibt beim Wieder\u00f6ffnen erhalten. Ohne hinterlegte Lieblings-Sortierung bleibt es beim bisherigen Verhalten.<\/li>\n\n\n\n<li><strong>Der \u201eNur&#8220;-Filter im Sequenzen-Fenster kann voreingestellt werden.<\/strong> Wer grunds\u00e4tzlich nur die Sequenzen des gew\u00e4hlten Programms sehen will, setzt die neue Einstellung \u201e\u201aNur&#8216;-Filter beim Start aktiv&#8220; im Bereich Sequenzen. Die Checkbox im Sequenzen-Fenster ist dann von Anfang an gesetzt, l\u00e4sst sich im laufenden Betrieb aber wie gewohnt umschalten.<\/li>\n\n\n\n<li><strong>Die Abschnitte eines Singing Calls werden im Lyric-Fenster farbig angezeigt.<\/strong> Im Sync-Modus erscheint rechts neben dem Text eine eigene Spalte, die Opener, die vier Figuren, Middle Break, Closer, Tag und Additional Lyrics als farbige Balken zeigt \u2014 in denselben Farben wie die Abschnittsleiste am Player. Teilen sich mehrere Abschnitte denselben Text, was auf vielen Cuesheets der Normalfall ist, stehen sie als schmale Spalten nebeneinander statt \u00fcbereinander.<\/li>\n\n\n\n<li><strong>Die Abschnittsgrenzen lassen sich mit der Maus verschieben.<\/strong> Ober- und Unterkante jedes Balkens sind einzeln greifbar, der Mauszeiger zeigt es an. Die Grenze rastet auf Textzeilen ein, und der Anfang kann das Ende nicht \u00fcberholen. Gespeichert wird beim Loslassen. Weil die Spalte neben dem Text liegt und nicht dar\u00fcber, kann ein Klick auf eine Kante keinen versehentlichen Sync-Punkt mehr ausl\u00f6sen.<\/li>\n\n\n\n<li><strong>Jeder Abschnitt bleibt einzeln verschiebbar, auch wenn mehrere auf demselben Text starten.<\/strong> Liegen Opener, Middle Break und Closer nach der Auto-Analyse auf einem gemeinsamen Block, l\u00e4sst sich trotzdem nur einer davon herausziehen \u2014 etwa um den Middle Break nachtr\u00e4glich bis in die Alternativen Lyrics zu verl\u00e4ngern. \u00dcberlappen sich Abschnitte danach nur noch teilweise, r\u00fccken sie automatisch in nebeneinanderliegende Spuren, statt sich zu verdecken. Wer sich mit niemandem \u00fcberlappt, nutzt die volle Breite.<\/li>\n\n\n\n<li><strong>Die erkannten Abschnitte werden dauerhaft am Song gespeichert<\/strong> und stehen damit auch nach einem Neustart zur Verf\u00fcgung, statt bei jedem Auto-Sync neu berechnet zu werden. Das gilt f\u00fcr beide Wege: den Auto-Sync im Lyric-Fenster und den Sammellauf \u201eSync-Punkte setzen&#8220; im Hintergrund. Der Sammellauf hat die Abschnitte ohnehin schon berechnet, bisher aber nur die Sprungmarken daraus gespeichert und die Analyse danach verworfen.<\/li>\n\n\n\n<li><strong>\u201eAdditional Lyrics&#8220; und \u201eAlternate Lyrics&#8220; werden als eigener Abschnitt erkannt.<\/strong> Das behebt einen Fehler mit sichtbarer Wirkung: Weil ein Abschnitt bis zur n\u00e4chsten erkannten \u00dcberschrift reicht, wanderte der alternative Figurentext bisher in den davorstehenden Block und verl\u00e4ngerte etwa den Opener um ein Vielfaches. In 29 der vorhandenen Lyric-Dateien wird dadurch jetzt ein Block korrekt begrenzt.<\/li>\n\n\n\n<li><strong>Der Tag bekommt einen eigenen Sprungpunkt<\/strong> am Ende des Closers. Bisher wurde er beim Auto-Sync \u00fcbersprungen.<\/li>\n\n\n\n<li><strong>Neuer Knopf \u201eALLE Lieder mit Lyrics neu berechnen&#8220; im Tab \u201eOhne SyncPunkte&#8220;.<\/strong> Er l\u00e4uft \u00fcber den gesamten Bestand, also auch \u00fcber Songs, die schon Sync-Punkte haben und deshalb gar nicht in der Liste stehen. Gedacht f\u00fcr den Fall, dass sich die Erkennung verbessert hat und man alles einmal frisch durchrechnen will. Weil dabei bestehende Sprungmarken gel\u00f6scht und neu gesetzt werden, z\u00e4hlt die R\u00fcckfrage vorher genau, wie viele Songs betroffen sind und wie viele davon bereits Marken haben.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der Knopf \u201eAlle Lieder erg\u00e4nzen&#8220; hei\u00dft jetzt \u201eAlle Lieder der Liste erg\u00e4nzen&#8220;.<\/strong> Er hat schon immer nur die Songs der angezeigten Liste bearbeitet, also die ohne Sync-Punkte \u2014 der alte Name legte einen Komplettlauf \u00fcber alle Lieder nahe.<\/li>\n\n\n\n<li><strong>Ein wiederholter Sammellauf hinterl\u00e4sst keine Reste mehr.<\/strong> Bisher wurden die Sprungmarken \u00fcber die vorhandenen geschrieben. Hatte ein Song vorher mehr Marken als der neue Lauf erzeugt, blieben die \u00fcberz\u00e4hligen aus der alten Synchronisation stehen und vermischten sich mit den neuen. Jetzt werden die alten Marken des Slots erst entfernt. Songs, deren Analyse fehlschl\u00e4gt, bleiben dabei unangetastet.<\/li>\n\n\n\n<li><strong>\u00dcberschriften mit erkl\u00e4rendem Zusatz in Klammern werden wieder erkannt.<\/strong> Eine Zeile wie \u201eFIGURE (twice for heads, twice for sides):&#8220; wurde bisher verworfen, weil die L\u00e4ngenpr\u00fcfung vor dem Abschneiden des Klammerzusatzes lief \u2014 die Zeile ist 42 Zeichen lang, die eigentliche \u00dcberschrift nur 6. In 14 Lyric-Dateien werden dadurch jetzt s\u00e4mtliche Figur-Abschnitte erkannt, die vorher komplett fehlten. Das wirkt sich auch auf den Auto-Sync aus: diese Songs bekamen bisher falsch gesetzte Sprungmarken.<\/li>\n\n\n\n<li><strong>Wird ein Song beim Sammellauf \u00fcbersprungen, sagt die Meldung jetzt, wo es weitergeht.<\/strong> Statt nur \u201ekein Songanfang&#8220; steht dort der Hinweis auf den Tab \u201eOhne Songpunkte&#8220;, in dem sich der fehlende Wert setzen l\u00e4sst. Der Grund war zwar schon immer korrekt benannt, f\u00fchrte aber leicht auf die falsche F\u00e4hrte \u2014 bei tadellosen Lyrics sucht man den Fehler zuerst dort.<\/li>\n\n\n\n<li><strong>Beide Einstellungen sind in allen drei Sprachen beschriftet<\/strong> und im Einstellungen-Fenster als neustartpflichtig gekennzeichnet \u2014 sie greifen beim n\u00e4chsten Programmstart.<\/li>\n\n\n\n<li><strong>Der Zufalls-Tiebreaker ist beim Start korrekt bedienbar.<\/strong> Bisher war das K\u00e4stchen nach dem Start immer ausgegraut, weil die Anwendung fest von \u201eAlphabetisch&#8220; ausging. Jetzt richtet es sich nach der tats\u00e4chlich eingestellten Startsortierung.<\/li>\n\n\n\n<li><strong>Neue Einstellungen erscheinen auch bei einer frischen Installation.<\/strong> Bislang zeigte das Einstellungen-Fenster nur Bereiche an, die bereits in der INI-Datei standen \u2014 bei einer Neuinstallation blieben noch nie benutzte Bereiche unsichtbar.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.124 \u2014 Ziel-BPM pro Lokation, \u201eNur&#8220;-Filter f\u00fcr Sequenzen, ZIP-Import (2026-07-19)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Die Sequenzliste kann jetzt gezielt nur die Sequenzen des gew\u00e4hlten Programms anzeigen.<\/strong> Neben dem Limit-Auswahlfeld sitzt die neue Checkbox \u201eNur&#8220;. Hintergrund: Wer beim Limit zum Beispiel A1 w\u00e4hlt, bekam bisher auch s\u00e4mtliche Sequenzen der tieferen Programme angezeigt \u2014 Plus, Mainstream und Basic. Tanzbar sind die f\u00fcr A1-T\u00e4nzer zwar alle, aber wer zu einem A1-Abend gekommen ist, will A1 tanzen. Mit gesetzter Checkbox bleiben nur die Sequenzen \u00fcbrig, deren schwerster Call im Programm des Limits liegt \u2014 also garantiert mindestens ein A1-Call pro Sequenz.<\/li>\n\n\n\n<li><strong>Das funktioniert auch mit einem Limit mitten im Programm.<\/strong> Wer als Limit einen einzelnen Call w\u00e4hlt (etwa den Lernstand einer Class), bekommt mit der Checkbox genau die Sequenzen, die mindestens einen Call des angefangenen Programms enthalten, aber keinen \u00fcber dem gew\u00e4hlten Call \u2014 passend zum Unterrichten.<\/li>\n\n\n\n<li><strong>Der Filter wirkt \u00fcberall dort, wo die gefilterte Liste weiterverwendet wird:<\/strong> beim Durchbl\u00e4ttern im Detail-Fenster, bei den Regel-Aktionen auf der gefilterten Auswahl und beim \u00dcbernehmen in die Notizen. Ohne gew\u00e4hltes Limit hat die Checkbox keine Wirkung; der erkl\u00e4rende Tooltip liegt in allen drei Sprachen vor.<\/li>\n\n\n\n<li><strong>Jede Lokation kann jetzt ein Ziel-Tempo in BPM vorgeben.<\/strong> In den Lokations-Einstellungen steht neben dem bekannten prozentualen Tempo ein zweites Feld \u201eZiel-BPM&#8220;. Ist es aktiv, wird bei jedem Songwechsel das heutige Tempo automatisch so berechnet, dass der Song genau mit der eingestellten BPM-Zahl l\u00e4uft \u2014 unabh\u00e4ngig davon, wie schnell die Aufnahme von Hause aus ist. Damit laufen alle Songs eines Abends h\u00f6rbar im selben Tempo. Grundlage der Rechnung ist die tats\u00e4chliche Song-Geschwindigkeit, also Basis-BPM mal Song-Tempo.<\/li>\n\n\n\n<li><strong>Umgeschaltet wird per Auswahlknopf, nicht durch L\u00f6schen.<\/strong> Vor beiden Feldern sitzt je ein Auswahlknopf, der bestimmt, welcher Wert gilt. Beide Zahlen bleiben dabei gespeichert \u2014 wer zwischen \u201e103 %&#8220; und \u201e128 BPM&#8220; wechselt, muss nichts neu eintippen. Bestehende Lokationen laufen unver\u00e4ndert im Prozent-Modus weiter.<\/li>\n\n\n\n<li><strong>Manuelles Abweichen bleibt m\u00f6glich.<\/strong> Das heutige Tempo l\u00e4sst sich nach dem automatischen Setzen wie gewohnt von Hand verstellen \u2014 etwa schneller f\u00fcr einen Hot Hash oder langsamer im Workshop. Die Abweichung gilt f\u00fcr den laufenden Song; beim n\u00e4chsten Songwechsel rechnet die Automatik wieder auf die Ziel-BPM.<\/li>\n\n\n\n<li><strong>Schutz vor Tippfehlern.<\/strong> Beim erstmaligen Aktivieren ist das Feld mit 128 BPM vorbelegt, dem \u00fcblichen Square-Dance-Tempo. Liegt der eingetragene Wert au\u00dferhalb von 100\u2013150 BPM, fragt der Dialog vor dem Speichern nach \u2014 eine vertippte \u201e13&#8243; w\u00fcrde sonst jeden Song unbemerkt ans Tempo-Limit fahren.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der ZIP-Import erkennt jetzt deutlich mehr Dateinamen-Schemata der Label.<\/strong> Als Vorlage diente eine Analyse des Open-Source-Programms SquareDesk, dessen Namenserkennung \u00fcber die Jahre mit vielen realen Musikdateien gewachsen ist. Neu erkannt werden: Labels mit Bindestrich im Namen wie \u201e4-Bar-B 123 &#8211; Chicken Plucker&#8220; (bisher wurde der Labelname am Bindestrich zerschnitten), mehrwortige Labels wie \u201eNew Beat 203a&#8220; oder \u201eBlue Star 1790&#8243;, Labelk\u00fcrzel mit Ziffer wie \u201eOGRMP3 04&#8243;, reine Nummern-Labels wie \u201e123 &#8211; Chicken Plucker&#8220; \u2014 auch mit Punkt statt Bindestrich (\u201e123.Chicken Plucker&#8220;) \u2014 sowie die Schreibweise mit Bindestrich zwischen Label und Nummer wie \u201ePaper Doll &#8211; Windsor-4936B&#8220;.<\/li>\n\n\n\n<li><strong>Download-Dateinamen mit Unterstrichen werden automatisch aufger\u00e4umt.<\/strong> Aus einem Shop-Dateinamen wie \u201eego_112_-_go_tell_aunt_rhody&#8220; macht der Import jetzt Titel \u201eGo Tell Aunt Rhody&#8220; und Label \u201eego 112&#8243;. Komplett klein- oder gro\u00dfgeschriebene Titel werden dabei in normale Gro\u00df-\/Kleinschreibung gebracht; gemischte Schreibweisen bleiben unangetastet.<\/li>\n\n\n\n<li><strong>Vocal-Dateien werden zuverl\u00e4ssiger als Variante erkannt.<\/strong> Neben den bekannten K\u00fcrzeln z\u00e4hlt jetzt auch das ausgeschriebene Wort \u201evocal&#8220; im Dateinamen sowie die Klammer-Zus\u00e4tze \u201e(Vocal)&#8220; und \u201e(Inst)&#8220;. Solche Dateien werden nicht mehr versehentlich als Haupt-Titel vorgeschlagen.<\/li>\n\n\n\n<li><strong>Die Labels mit Bindestrich und die mehrwortigen Labels stehen in der pflegbaren Label-Liste.<\/strong> Wer ein weiteres Label mit ungew\u00f6hnlichem Namen nutzt, tr\u00e4gt es einfach im Import-Dialog nach \u2014 ab dann wird es korrekt erkannt.<\/li>\n\n\n\n<li><strong>Beigepackte Bilder (Cover) und XML-Dateien werden im Vollst\u00e4ndigkeitsbericht mit klarem Grund ausgewiesen<\/strong> statt nur als \u201eunbekannter Dateityp&#8220;.<\/li>\n\n\n\n<li><strong>Kompakte Dateinamen im SqView-Stil werden erkannt.<\/strong> Bei Dateien wie \u201eA1005m&#8220;\/\u201eA1005v&#8220; (Labelnummer plus angeh\u00e4ngter Kennbuchstabe, ohne Titel) wird die Labelnummer als Label \u00fcbernommen und das Paar korrekt zu Haupt-MP3 plus Vocal-Variante geb\u00fcndelt. Im Praxistest mit der vorhandenen Bibliothek (755 Dateien) stieg die Label-Erkennung damit von 15 % auf 52 % der Dateien \u2014 der Rest sind normale Musiktitel ohne Label, die bewusst keines bekommen.<\/li>\n\n\n\n<li><strong>Der Zauberstab im Planner w\u00fcrfelt bei den Zufalls-Sortierungen vor jedem Bef\u00fcllen neu.<\/strong> Wer als Sortierung \u201eZufall&#8220; oder \u201eGewichteter Zufall&#8220; eingestellt hatte und die Playlist zweimal hintereinander automatisch bef\u00fcllen lie\u00df, bekam bisher beide Male exakt dieselbe Songauswahl \u2014 ein zweiter Versuch f\u00fcr einen anderen Vorschlag war damit zwecklos. Hintergrund: Die gezogenen Zufallszahlen werden absichtlich zwischengespeichert, damit sich die Songliste nicht bei jedem Tastendruck im Suchfeld neu sortiert. Der Zauberstab mischt sie jetzt vorher gezielt neu. Beim gewichteten Zufall bleibt die Gewichtung dabei erhalten: gut bewertete und lange nicht gespielte Songs kommen weiterhin bevorzugt dran, nur eben nicht mehr in immer derselben Reihenfolge. Bei allen anderen Sortierungen \u00e4ndert sich nichts.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Namensgleiche Dateien aus verschiedenen ZIPs \u00fcberschreiben sich nicht mehr gegenseitig.<\/strong> Enthielten zwei ZIP-Pakete eine Varianten- oder Lyrics-Datei mit identischem Dateinamen (etwa \u201evocal.mp3&#8243;), verwies der zweite Import bisher stillschweigend auf die Datei des ersten. Jetzt wird der Inhalt verglichen und bei Abweichung ein eindeutiger Name mit Zusatz \u201e_1&#8243; vergeben; echte Doppel-Importe derselben Datei bleiben wie gehabt ohne Duplikat.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hinweise<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kann ein Song die Ziel-BPM nicht erreichen (Stellbereich 50\u2013150 %), wird so nah wie m\u00f6glich herangefahren und die BPM-Anzeige im Player erscheint in Warnfarbe; der Tooltip nennt den Grund. Songs ohne hinterlegte BPM laufen unver\u00e4ndert mit 100 % \u2014 die Anzeige zeigt dann \u201e\u2014&#8220;. Das Potential-Fenster listet Songs ohne BPM-Wert bereits auf.<\/li>\n\n\n\n<li>Da das heutige Tempo nur ganze Prozent kennt, kann die tats\u00e4chliche BPM-Zahl um bis zu einen halben Schlag pro Minute vom Ziel abweichen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.123 \u2014 Zoomen mit STRG + Mausrad, Zufallssortierungen (2026-07-18)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>STRG + Mausrad zoomt jetzt \u00fcberall dort, wo es bisher nur die Plus-\/Minus-Kn\u00f6pfe gab.<\/strong> Betroffen sind die Sequenzliste, das Lyrics-Fenster, das Notizen-Widget, der Class Designer, die Kurve im Abendplaner und die beiden Wellenformen im Beat-Snap-Dialog. Der Mauszeiger muss dabei \u00fcber dem jeweiligen Inhalt stehen. Gezoomt wird in denselben Schritten und innerhalb derselben Grenzen wie \u00fcber die Kn\u00f6pfe \u2014 die Prozentanzeige l\u00e4uft mit, und der beim Beenden gespeicherte Zoomstand verh\u00e4lt sich unver\u00e4ndert. Bei feinaufl\u00f6senden Mausr\u00e4dern und Touchpads werden Teilschritte aufaddiert, sodass eine gef\u00fchlte Rasterstufe auch genau einem Zoomschritt entspricht.<\/li>\n\n\n\n<li><strong>Zwei neue Sortierungen: \u201eReiner Zufall&#8220; und \u201eGewichteter Zufall&#8220;.<\/strong> Beide stehen im Sortier-Auswahlfeld von Songliste und Playlist-Manager und wirken damit auch beim automatischen Bef\u00fcllen \u00fcber den Magischen Button \u2014 ist eine der beiden ausgew\u00e4hlt, \u00fcbernimmt sie dort die Reihenfolge. \u201eReiner Zufall&#8220; mischt gleichverteilt. \u201eGewichteter Zufall&#8220; zieht nach dem Empfehlungs-Score, also Qualit\u00e4t mal Tage seit dem letzten Spielen: gut bewertete und lange nicht gespielte Songs kommen deutlich wahrscheinlicher nach vorn, schwach bewertete behalten aber eine echte Restchance und verschwinden nicht dauerhaft aus dem Programm. Gemessen an einer Bibliothek mit 526 Songs landet ein Titel mit Qualit\u00e4t 10 in rund 12 % der Ziehungen in den ersten zwanzig, einer mit Qualit\u00e4t 1 in rund 1 %.<\/li>\n\n\n\n<li><strong>Songs ohne Bewertung werden beim gewichteten Zufall wie mittelm\u00e4\u00dfige behandelt.<\/strong> Eine fehlende Bewertung ist in der Datenbank eine Null, und eine Null im Score h\u00e4tte bedeutet: dieser Song kommt nie dran \u2014 und kann deshalb auch nie bewertet werden. Beim gewichteten Zufall z\u00e4hlt eine fehlende Bewertung darum als neutrale 5, sodass der unbewertete Altbestand nach und nach ins Programm rutscht. Die normale Empfehlungs-Sortierung rechnet unver\u00e4ndert mit dem echten Wert.<\/li>\n\n\n\n<li><strong>Ein heute bereits gespielter Song bleibt hinten.<\/strong> Null Tage seit dem letzten Spielen ergeben auch beim gewichteten Zufall das kleinstm\u00f6gliche Gewicht \u2014 am selben Abend soll derselbe Titel nicht erneut vorgeschlagen werden.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hinweise<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die gew\u00fcrfelte Reihenfolge bleibt stabil, solange nur gefiltert wird \u2014 beim Tippen im Suchfeld oder einem Genre-Wechsel springt die Liste also nicht. Neu gemischt wird beim Programmstart und jedes Mal, wenn im Auswahlfeld erneut auf eine der beiden Zufallssortierungen umgeschaltet wird.<\/li>\n\n\n\n<li>Ohne gedr\u00fcckte STRG-Taste bleibt das Mausrad wie bisher das Scrollrad \u2014 das Zoomen greift ausschlie\u00dflich mit Modifikator.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.122 \u2014 Sortierung nach Einf\u00fcgedatum, mehr Cuesheets beim Auto-Sync erkannt (2026-07-17)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sortierung nach Einf\u00fcgedatum.<\/strong> Das Sortier-Auswahlfeld in Songliste und Planner hat einen neuen Eintrag \u201eEinf\u00fcgedatum&#8220; \u2014 die zuletzt aufgenommenen Songs stehen oben. Songs ohne gespeichertes Einf\u00fcgedatum (der bei der Migration \u00fcbernommene Altbestand) erben das Datum der Erstaufnahme aus der Konfiguration und bilden damit einen gemeinsamen Block hinter allen sp\u00e4teren Zug\u00e4ngen. Der Zufalls-Tiebreaker wirkt auch hier und mischt Songs mit gleichem Datum bei jedem Programmstart neu durch.<\/li>\n\n\n\n<li><strong>Die Datumsspalte wandert mit der Sortierung mit.<\/strong> Wird nach Einf\u00fcgedatum sortiert, zeigt die Spalte \u201eGespielt&#8220; in Songliste und Planner das Einf\u00fcgedatum und hei\u00dft \u201eHinzugef\u00fcgt&#8220;; wird nach Empfehlung sortiert, zeigt dieselbe Spalte den Empfehlungs-Score und hei\u00dft \u201eScore&#8220; \u2014 bei jeder anderen Sortierung steht dort wie bisher das Datum, an dem der Song zuletzt in dieser Gruppe gespielt wurde. So steht immer die Zahl in der Tabelle, nach der gerade sortiert wird. Geerbte Daten des Altbestands erscheinen grau und kursiv mit einem erkl\u00e4renden Tooltip, damit sie nicht mit einem echten Einf\u00fcgedatum verwechselt werden.<\/li>\n\n\n\n<li><strong>Score-Spalte bei der Empfehlung.<\/strong> Beim Sortieren nach \u201eEmpfehlung&#8220; zeigt die zweite Spalte den zugrunde liegenden Score als Ganzzahl \u2014 das Produkt aus Qualit\u00e4t und Tagen seit dem letzten Spielen. Damit ist direkt ablesbar, warum ein Song oben steht. Die angezeigte Zahl stammt aus genau derselben Berechnung wie die Sortierung selbst, kann also nicht davon abweichen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Abschnitts-Labels in Klammern am Zeilenanfang werden erkannt.<\/strong> Manche Cuesheets schreiben das Label geklammert vor den ersten Call derselben Zeile \u2014 etwa <code>(Figure): HEADS SQUARE THRU and go - four hands and go<\/code>. Solche Zeilen wurden bisher komplett \u00fcbersehen, der Auto-Sync fand in diesen Bl\u00e4ttern gar keine Abschnitte und brach ab. Jetzt gilt der Klammerinhalt als Label und der Rest der Zeile als Inhalt. Kombinierte Labels wie <code>(Middle Break &amp; Closer):<\/code> sind dabei eingeschlossen. Ohne Klammern bleibt es bei der bisherigen strengen Pr\u00fcfung, damit eine Liedzeile nicht versehentlich als \u00dcberschrift gilt.<\/li>\n\n\n\n<li><strong>Zus\u00e4tzliche Schreibweisen in der Schl\u00fcsselwort-Liste:<\/strong> <code>OPEN<\/code>, <code>CLOSE<\/code>, <code>BREAKS<\/code> sowie die auf Bl\u00e4ttern real vorkommende Falschschreibung <code>MIDLE<\/code>. Eine \u00dcberschrift z\u00e4hlt nur, wenn alle ihre W\u00f6rter bekannt sind \u2014 ein einziges unbekanntes Wort lie\u00df bisher die ganze Zeile mitsamt Opener und Closer durchfallen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Songliste: nie gespielte Songs wurden bei der Sortierung als \u201eheute gespielt&#8220; behandelt.<\/strong> In der Songliste fehlte die Datumsgrenze aus der Konfiguration, die der Planner l\u00e4ngst nutzt. Dadurch galt ein nie gespielter Song beim Sortieren nach \u201eZuletzt gespielt&#8220; bzw. \u201eEmpfehlung&#8220; als 0 Tage her und landete am Ende statt am Anfang \u2014 genau umgekehrt zur Absicht. Jetzt wird auch in der Songliste ab der gesetzten Datumsgrenze gerechnet, sodass lange nicht gespielte und nie gespielte Songs korrekt nach oben kommen. Der Planner war nie betroffen.<\/li>\n\n\n\n<li><strong>Getrennter Opener und Break wurden zu einem Block verschmolzen.<\/strong> Enthielt ein Blatt unter dem Opener eine zweite \u00dcberschrift mit einem bis dahin unbekannten Wort (z. B. <code>BREAK &amp; CLOSE<\/code>), fiel diese \u00dcberschrift durch und der Opener-Block wurde stillschweigend \u00fcber beide Abschnitte gezogen und f\u00fcr Opener, Middle Break und Closer gleicherma\u00dfen verwendet. Die drei Teile zeigen jetzt auf ihre jeweils eigenen Textbl\u00f6cke.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hinweise<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gemessen an der Testbibliothek (218 Cuesheets) steigt die Erkennung von 199 auf 204 Bl\u00e4tter. Alle bereits funktionierenden Bl\u00e4tter liefern unver\u00e4nderte Positionen. Von den verbleibenden Fehlschl\u00e4gen sind die meisten reine Songtexte ohne Abschnitts-\u00dcberschriften \u2014 dort gibt es nichts zu teilen, sie werden weiterhin bewusst abgelehnt statt geraten.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.121 \u2014 Sync-Punkte im Massenlauf setzen (2026-07-15)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sync-Punkte f\u00fcr viele Songs auf einmal setzen.<\/strong> Der Reiter \u201eOhne SyncPunkte&#8220; im Potential-Fenster hat jetzt zwei Schaltfl\u00e4chen unter der Liste: \u201eSelektierte Lieder erg\u00e4nzen&#8220; (Mehrfachauswahl in der Liste ist neu m\u00f6glich) und \u201eAlle Lieder erg\u00e4nzen&#8220; f\u00fcr die komplette Liste. Gerechnet wird exakt wie beim manuellen Sync im Lyric-Fenster: der Song-Body wird in 7 gleiche Abschnitte geteilt, die Abschnitts-\u00dcberschriften im Cuesheet gesucht und daraus bis zu 14 Anker gesetzt. Alle Lyric-Formate werden unterst\u00fctzt (HTML, RTF, DOCX, PDF, TXT) \u2014 die Lyric-Dateien selbst werden dabei nicht ver\u00e4ndert, die Punkte liegen wie bisher in der Datenbank.<\/li>\n\n\n\n<li><strong>Zeitsch\u00e4tzung vor dem gro\u00dfen Lauf.<\/strong> Ab 15 Songs laufen zuerst 5 als Probelauf, deren Dauer gemessen und die Gesamtlaufzeit hochgerechnet wird \u2014 mit R\u00fcckfrage, ob der Rest laufen soll. Die 5 Probe-Songs sind dabei bereits fertig eingetragen und werden nicht erneut berechnet. Gleiches Muster wie beim Songanfang-Reiter.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hinweise<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Voraussetzungen je Song:<\/strong> BPM und Songanfang m\u00fcssen gesetzt sein, die Lyric-Datei muss auffindbar sein. Ist ein Song-Ende gespeichert, wird es verwendet, sonst aus 448 Beats und der BPM abgeleitet.<\/li>\n\n\n\n<li><strong>\u00dcbersprungene Songs werden namentlich mit Grund gemeldet<\/strong> \u2014 entweder weil eine Voraussetzung fehlt oder weil sich im Cuesheet keine Abschnitte erkennen lie\u00dfen. Nichts wird stillschweigend ausgelassen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Auslieferungs-Datenbank enthielt Daten aus der Entwicklungsumgebung.<\/strong> Die mitgelieferte Datenbank im Vollpaket wird aus der Entwicklungs-Datenbank erzeugt und dabei geleert \u2014 bislang blieben die Tabellen <code>notes<\/code> und <code>song_properties<\/code> jedoch gef\u00fcllt zur\u00fcck, obwohl die zugeh\u00f6rigen Songs und Lokationen l\u00e4ngst gel\u00f6scht waren. Beide werden jetzt mitgeleert, ebenso <code>photos<\/code> und <code>potential_ignored<\/code>. Betraf alle Versionen bis einschlie\u00dflich 0.120; das Update-ZIP war nie betroffen, da es keine Datenbank enth\u00e4lt.<\/li>\n\n\n\n<li><strong>Der Build bricht jetzt ab, wenn Benutzerdaten in der Auslieferungs-Datenbank \u00fcbrig bleiben<\/strong> \u2014 inklusive Warnung bei neuen, noch nicht eingeordneten Tabellen. Vorher wurden die Zahlen nur ausgegeben und nicht gepr\u00fcft.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.120 \u2014 Sync-Punkte gemeinsam verschieben &amp; Songstart daran gekoppelt (2026-07-14)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Alle Sync-Punkte auf einmal um eine Sekunde verschieben.<\/strong> Im Sync-Modus des Lyric-Fensters gibt es beim Rechtsklick jetzt das Untermen\u00fc \u201eAlle Sync-Punkte verschieben&#8220; mit den Eintr\u00e4gen \u201e1 Sek. fr\u00fcher (\u22121 s)&#8220; und \u201e1 Sek. sp\u00e4ter (+1 s)&#8220;. Damit l\u00e4sst sich ein durchgehender Versatz korrigieren, wenn der Text insgesamt konstant zu fr\u00fch oder zu sp\u00e4t mitl\u00e4uft, ohne jeden Punkt einzeln nachziehen zu m\u00fcssen. Kein Sync-Punkt rutscht dabei vor den Songanfang (bei 0:00 wird abgeschnitten). Das Men\u00fc ist verf\u00fcgbar, sobald \u00fcberhaupt Sync-Punkte gesetzt sind \u2014 auch bei Rechtsklick auf eine leere Textstelle.<\/li>\n\n\n\n<li><strong>Songstart bleibt an den fr\u00fchesten Sync-Punkt gekoppelt.<\/strong> Der gespeicherte Musik-Startpunkt eines Songs folgt jetzt automatisch dem fr\u00fchesten Sync-Punkt (dem Beginn des Openers). Egal ob per \u201eAlle verschieben&#8220;, Einzel-Verschieben, L\u00f6schen oder direktem Zeit-Edit \u2014 sobald sich der fr\u00fcheste Sync-Punkt bewegt, wird der Songstart parallel auf dieselbe Zeit gesetzt. So sind Opener-Beginn und Songstart immer verschr\u00e4nkt, was besonders f\u00fcr Singing Calls korrekt ist. Der Start-Countdown zieht sofort mit und z\u00e4hlt zur neuen Startzeit. Bei \u201eAlle verschieben (\u00b11 s)&#8220; wandert zus\u00e4tzlich der Song-Endpunkt um denselben Betrag mit, sodass die Body-L\u00e4nge unver\u00e4ndert bleibt. Songs ohne gesetzten Startpunkt (z. B. Patter ohne Body) bleiben unber\u00fchrt \u2014 es wird kein Startpunkt erfunden.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.119 \u2014 Potential-Dashboard neu strukturiert: \u00dcbersichts-Reiter, Workflow-Reihenfolge &amp; Lesbarkeits-Fixes (2026-07-08)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Start-Reiter \u201e\u00dcbersicht&#8220; im Potential-Dashboard.<\/strong> Beim \u00d6ffnen des Fensters landet man jetzt zuerst auf einer \u00dcbersicht mit Schaltfl\u00e4chen zu allen Reitern, gruppiert nach dem sinnvollen Arbeitsablauf. Jeder Button springt zum passenden Reiter und tr\u00e4gt ein Badge mit der Anzahl offener Punkte: eine Zahl bei den schnellen Pr\u00fcfungen, ein Haken \u201e\u2713&#8220; wenn nichts mehr offen ist, und \u201e[ ? ]&#8220; bei den aufw\u00e4ndigen Datei-Pr\u00fcfungen (Ohne MP3 \/ Inkompatibles Format) \u2014 die ermitteln ihre echte Zahl erst, wenn man den Reiter tats\u00e4chlich \u00f6ffnet, damit die \u00dcbersicht schnell bleibt. Die Buttons brechen bei schmalem Fenster automatisch in die n\u00e4chste Zeile um.<\/li>\n\n\n\n<li><strong>Zwei Abh\u00e4ngigkeitsketten sind mit Pfeilen sichtbar gemacht.<\/strong> Auf der \u00dcbersicht zeigen gro\u00dfe Pfeile die Reihenfolge an, in der Schritte aufeinander aufbauen: die <strong>Patter-Kette<\/strong> \u201eOhne Loop \u2192 Ohne BeatSnap \u2192 Loop optimieren&#8220; und die <strong>Singing-Kette<\/strong> \u201eOhne Lyrics \u2192 Ohne Liedpunkte \u2192 Ohne Songanfang \u2192 Ohne SyncPunkte&#8220;. So ist auf einen Blick erkennbar, dass z. B. SyncPunkte einen gesetzten Songanfang voraussetzen.<\/li>\n\n\n\n<li><strong>Sticky \u201e\u2302&#8220;-Button links in der Reiterleiste.<\/strong> Ein kleiner Haus-Button ganz vorne bleibt immer sichtbar \u2014 auch wenn man weit nach rechts durch die Reiter gescrollt hat \u2014 und bringt per Klick sofort zur\u00fcck zur \u00dcbersicht.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Alle Potential-Reiter in eine logische Reihenfolge gebracht.<\/strong> Statt einer gewachsenen Liste sind die Reiter jetzt in vier Gruppen sortiert: <strong>Basis<\/strong> (gilt f\u00fcr jeden Song: Ohne MP3, Inkompatibles Format, Ohne BPM, Ohne Genre, Ohne Qualit\u00e4t, Ohne ERR, Quality + ERR f\u00fcllen, Metadaten f\u00fcllen), <strong>Patter-Kette<\/strong>, <strong>Singing-Kette<\/strong> und <strong>Wartung<\/strong> (Leere Lokationen, Verwaiste Historie, Massen-L\u00f6schen). \u201eOhne BPM&#8220; sitzt bewusst in der Basis-Gruppe, weil es sowohl Patter als auch Singings betrifft.<\/li>\n\n\n\n<li><strong>Die Scroll-Pfeile der Reiterleiste sind wieder brauchbar.<\/strong> Weil so viele Reiter nicht mehr nebeneinander passen, blendet Qt Scroll-Pfeile (\u2039 \u203a) ein. Diese waren im Windows-11-Theme zu einem winzigen, kaum klickbaren Bereich zusammengequetscht \u2014 sie haben jetzt gen\u00fcgend Platz und sind normal bedienbar.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Windows-11-Theme: Men\u00fc- und Reiter-Texte beim \u00dcberfahren waren kaum lesbar.<\/strong> Beim Hovern (und bei selektierten Men\u00fceintr\u00e4gen) lag dunkler Text auf dunkelblauem Hintergrund. Men\u00fcleiste, Kontext-\/Aufklapp-Men\u00fcs und alle Reiterleisten zeigen den Text in diesem Zustand jetzt in Wei\u00df \u2014 gut lesbar. Betrifft die ganze App, nicht nur das Potential-Fenster.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.118 \u2014 Neuer \u201eOhne Songanfang&#8220;-Reiter mit CHECK-Pr\u00fcf-Marker \u00b7 Warte-Overlay \u00b7 \u201eOhne BPM&#8220; schlanker (2026-07-07)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Reiter \u201eOhne Songanfang&#8220; im Potential-Dashboard.<\/strong> Er listet alle Singing Calls, f\u00fcr die noch kein Musik-Startpunkt gesetzt ist \u2014 bewusst auch solche ohne hinterlegte Lyrics, denn die automatische Erkennung (aus 0.117) arbeitet rein auf der Audiospur und braucht keine Lyrics. Darunter drei Schaltfl\u00e4chen: \u201eSelektierte analysieren&#8220; (nur die in der Tabelle markierten), \u201eOffene analysieren&#8220; (alle noch offenen Kandidaten der Liste) und \u201eALLE analysieren&#8220;. Der letzte Button l\u00e4uft \u00fcber s\u00e4mtliche Singing Calls \u2014 auch \u00fcber solche mit bereits gesetztem Startpunkt \u2014 und \u00fcberschreibt bestehende Werte; deshalb kommt hier vorab eine deutliche Sicherheitsabfrage. F\u00fcr jeden erkannten Song werden Anfang <strong>und<\/strong> Ende gesetzt (das Ende ergibt sich starr aus Anfang + 448 Beats). Ab 15 zu bearbeitenden Liedern wird \u2014 wie beim \u201eOhne BPM&#8220;-Reiter \u2014 zun\u00e4chst anhand einer Stichprobe von f\u00fcnf Songs die voraussichtliche Gesamtdauer gesch\u00e4tzt und zur Best\u00e4tigung angezeigt; diese f\u00fcnf werden dabei gleich mitgespeichert, nicht verworfen. Die Analyse l\u00e4uft im Hintergrund, damit die Wiedergabe nicht stockt.<\/li>\n\n\n\n<li><strong>\u201eCHECK: START&#8220;: unsichere Erkennungen landen automatisch auf einer pr\u00fcfbaren To-Do-Liste.<\/strong> Bei der Stapel-Analyse ist niemand dabei, der jeden Vorschlag einzeln best\u00e4tigen k\u00f6nnte. Damit trotzdem jeder Singing Call ausgestattet wird und die Wackelkandidaten nicht untergehen, verf\u00e4hrt Callers Caddy so: Der Start-\/Endpunkt wird f\u00fcr <strong>alle<\/strong> erkannten Songs gesetzt \u2014 die Erkennung meldet aber je Song, ob sie sicher oder mehrdeutig war. Songs mit mehrdeutigem Ergebnis erhalten zus\u00e4tzlich das neue Genre <strong>\u201eCHECK: START&#8220;<\/strong>. Der Caller kann die Songliste nach diesem Genre filtern und gezielt genau die Lieder nachh\u00f6ren, bei denen die Automatik unsicher war \u2014 eine automatisch gepflegte Pr\u00fcf-Liste, ganz analog zum bekannten \u201eNEW&#8220;-Genre bei neu importierten Songs. Der Marker r\u00e4umt sich selbst wieder ab: Sobald der Caller den Anfang eines solchen Songs im Sync-Modus neu setzt (egal ob er den Auto-Vorschlag \u00fcbernimmt oder von Hand klickt), verschwindet \u201eCHECK: START&#8220; bei diesem Song automatisch \u2014 die To-Do-Liste leert sich also von selbst, w\u00e4hrend man sie abarbeitet. Ebenso entfernt eine erneute Stapel-Analyse den Marker, wenn ein Song diesmal sicher erkannt wird. Der manuelle Weg \u00fcber den Sync-Button vergibt selbst nie einen Marker (dort sieht der Caller die \u201eMehrdeutig&#8220;-Warnung ja direkt und entscheidet sofort). \u201eCHECK: START&#8220; ist das erste einer wiederverwendbaren \u201eCHECK: &#8222;-Reihe solcher Pr\u00fcf-Marker.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>W\u00e4hrend die automatische Start-\/Ende-Erkennung l\u00e4uft, erscheint jetzt ein \u201eBitte warten&#8220;-Overlay<\/strong> (wie beim Loop-Finder). Bisher gab es nur einen kleinen Statustext, sodass der Eindruck entstehen konnte, man k\u00f6nne bereits weiterarbeiten, w\u00e4hrend die Audio-Analyse f\u00fcr die Sync-Punkte noch rechnete. Das Overlay verschwindet automatisch, sobald das Ergebnis vorliegt (bzw. der Best\u00e4tigungsdialog erscheint) oder die Analyse fehlschl\u00e4gt.<\/li>\n\n\n\n<li><strong>\u201eOhne BPM&#8220;: Probelauf nur noch ab 15 Liedern \u2014 und ohne doppelte Arbeit.<\/strong> Die vorgeschaltete Zeitsch\u00e4tzung (Probelauf mit 5 Songs) wird jetzt erst ab 15 zu bearbeitenden Liedern angeboten; darunter l\u00e4uft die BPM-Ermittlung ohne Umweg direkt durch. Zus\u00e4tzlich werden die 5 Songs des Probelaufs nicht mehr verworfen, sondern gleich ermittelt und eingetragen \u2014 der eigentliche Lauf verarbeitet danach nur noch die restlichen Lieder. Das spart die doppelte Analysezeit f\u00fcr die Stichprobe.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.117 \u2014 Automatische Singing-Erkennung \u00b7 Stream-Schutz bei Play-Regeln \u00b7 Neuer \u201eOhne BPM&#8220;-Reiter (2026-07-06)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Automatische Erkennung von Anfang und Ende eines Singing Calls.<\/strong> Im Sync-Modus gibt es neben \u201eAnfang &amp; Ende selbst setzen&#8220; jetzt die Option \u201eAutomatisch erkennen&#8220;: Callers Caddy analysiert die Musik und schl\u00e4gt Start- und Endpunkt des Singing-Call-Bodys vor, aus denen anschlie\u00dfend die sieben Abschnitte (starr 7 \u00d7 64 = 448 Beats) und die Sync-Punkte abgeleitet werden \u2014 das erspart das manuelle Setzen bei hunderten Liedern. So arbeitet die Erkennung: Zun\u00e4chst wird ein <strong>Beat-Raster<\/strong> berechnet und an der in der Datenbank gespeicherten <strong>BPM verankert<\/strong> \u2014 dieser Tempo-Anker verhindert, dass das Raster auf einer Subharmonischen (halbes\/doppeltes Tempo) einrastet und dadurch unm\u00f6gliche Grids erzeugt. Pro Beat werden ein <strong>beat-synchrones log-Mel-Timbre<\/strong> (Spektralform), die Energie und ein <strong>Kick-Transient<\/strong> bestimmt. \u00dcber das Timbre findet eine <strong>Foote-Checkerboard-Novelty<\/strong> die <strong>Arrangement-Kanten<\/strong> (Besetzungswechsel), denn Intro und Outro brechen klanglich mit dem Body, auch wenn die Melodie durchl\u00e4uft. Ein <strong>8-Zinken-Kamm<\/strong> bewertet gezielt die Position, an der gleichzeitig an allen acht Sektionsgrenzen (c, c+64, \u2026, c+448) eine Kante liegt \u2014 das ist typisch f\u00fcr den Body und hebt ihn von zuf\u00e4lligen Einzelkanten ab. Anschlie\u00dfend rasten ein <strong>Downbeat-Snap<\/strong> (Kick-Akzent modulo 8) auf die Phrasen-\u201e1&#8243; und ein <strong>Chroma-Figuren-Paar-Tiebreak<\/strong> gegen den h\u00e4ufigen <strong>\u00b132-Beat-Halbsektions-Alias<\/strong> ein; eine kleine <strong>Kalibrierung (+2 Beats)<\/strong> gleicht die systematische Klick-Latenz aus. Das Ergebnis kommt stets als <strong>Vorschlag mit Confidence-Wert<\/strong> (der Kamm-Margin, also der Abstand der besten zur zweitbesten Position) \u2014 nie als stilles \u00dcberschreiben. Der Nutzer sieht Anfang und Ende und w\u00e4hlt \u201e\u00dcbernehmen&#8220;, \u201eSelbst setzen&#8220; oder \u201eAbbrechen&#8220;; liegt die Confidence unter der aus der Validierung bestimmten Schwelle, erscheint zus\u00e4tzlich ein Pr\u00fcf-Hinweis. Die Analyse l\u00e4uft in einem Hintergrund-Thread, damit die Wiedergabe nicht stockt. Bewusst als <strong>Vorschlag<\/strong> ausgelegt: Je nach Musik kann er ein, zwei Beats danebenliegen und wird dann kurz von Hand nachgezogen \u2014 die Zeitersparnis \u00fcber die Masse bleibt.<\/li>\n\n\n\n<li><strong>Neuer Reiter \u201eOhne BPM&#8220; im Potential-Dashboard.<\/strong> Er listet alle Songs, f\u00fcr die keine BPM gesetzt ist oder deren Wert unplausibel au\u00dferhalb des Square-Dance-Bereichs liegt (kleiner 100 oder gr\u00f6\u00dfer 150) \u2014 allesamt Kandidaten f\u00fcr die automatische BPM-Ermittlung. Darunter drei Schaltfl\u00e4chen: \u201eSelektierte ermitteln&#8220; (nur die in der Tabelle markierten), \u201eAlle leeren ermitteln&#8220; (alle ganz ohne BPM) und \u201eALLE ermitteln&#8220;. Der letzte Button l\u00e4sst den BPM-Finder \u00fcber die komplette Bibliothek laufen und \u00fcberschreibt dabei auch bereits gute Werte \u2014 deshalb kommt hier vorab eine deutliche Sicherheitsabfrage. Bei mehr als f\u00fcnf Songs wird zun\u00e4chst anhand einer Stichprobe von f\u00fcnf Liedern die voraussichtliche Gesamtdauer gesch\u00e4tzt und zur Best\u00e4tigung angezeigt (gleiches Verfahren wie beim Stapel-Loop-Finder). Die BPM-Erkennung l\u00e4uft im Hintergrund, damit die Wiedergabe nicht stockt.<\/li>\n\n\n\n<li><strong>Existenz-Pr\u00fcfung nach dem BPM-Lauf.<\/strong> Songs, deren Audiodatei in keinem Musikordner mehr auffindbar ist, werden nun am Ende namentlich aufgelistet, statt stillschweigend \u00fcbersprungen zu werden und unerkl\u00e4rt als Kandidat stehenzubleiben. Der Hinweis verweist auf den Reiter \u201eOhne MP3&#8243;, der zum Aufr\u00e4umen solcher verwaisten Eintr\u00e4ge gedacht ist.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Der Auto-Loop-Finder h\u00e4lt den Song jetzt zur\u00fcck, bis er fertig ist.<\/strong> Wird per Regel beim Abspielstart automatisch ein Loop gesucht, startet der Song erst h\u00f6rbar, wenn die Analyse abgeschlossen ist \u2014 der Loop ist damit garantiert schon gesetzt, wenn die Musik l\u00e4uft.<\/li>\n\n\n\n<li><strong>BPM-Erkennung pr\u00e4ziser: Suchband auf 100\u2013150 BPM eingegrenzt.<\/strong> Der Auto-BPM-Detektor (Onset-Strength-Envelope + Comb-Filter-Bank) suchte bisher in einem weiten Tempobereich und rastete gelegentlich auf einer Subharmonischen ein (halbes\/doppeltes Tempo \u2014 z. B. \u201eWaltzing Matilda&#8220; f\u00e4lschlich als 90-BPM-Walzer). Das engere Band deckt den f\u00fcr Square Dance typischen Bereich ab (weniger als eine Oktave, 150\/100 = 1,5) und beseitigt diese Oktavfehler zuverl\u00e4ssig. Davon profitieren die Auto-BPM-Erkennung, die neue Body-Erkennung (als Tempo-Anker) und der Reiter \u201eOhne BPM&#8220; gleicherma\u00dfen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kein Ruckeln mehr beim Abspielstart, wenn eine Regel gleichzeitig das Layout umbaut.<\/strong> Regeln, die beim Starten oder Fortsetzen eines Songs sofort einen Layout-Wechsel ausl\u00f6sen (z. B. Dual-View mit Lyrics und Sequenzen einblenden), lie\u00dfen den gerade startenden Audio-Stream h\u00f6rbar stocken \u2014 auf leistungsschw\u00e4cheren Rechnern besonders deutlich. Solche stream-gef\u00e4hrdenden Aktionen laufen jetzt zuerst zu Ende (w\u00e4hrend noch Stille herrscht), und erst danach setzt die Wiedergabe h\u00f6rbar ein. Regeln ohne Layout-Wechsel starten wie bisher ohne jede Verz\u00f6gerung.<\/li>\n\n\n\n<li><strong>Auto-Loop-Regel: leeres Preset-Feld.<\/strong> Beim Einrichten der Regel \u201eAuto-Set Best Loop&#8220; blieb das Feld f\u00fcr das Loop-Preset leer, solange der Loop-Finder-Reiter zuvor noch nie ge\u00f6ffnet worden war. Die Auswahl ist jetzt unabh\u00e4ngig davon immer gef\u00fcllt; zus\u00e4tzlich zeigt sie den seit einiger Zeit umbenannten Standardwert wieder korrekt an (bestehende Regeln mit dem alten Namen funktionieren unver\u00e4ndert weiter).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.116 \u2014 Evening Planner: Feinschliff &amp; Shuffle \u00b7 Loop-Finder: neue Strategie \u00b7 Statistik: Mehrfachauswahl (2026-07-05)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Evening Planner: Shuffle-Modus f\u00fcr Songvorschl\u00e4ge.<\/strong> Ein neuer Umschalt-Button in der oberen Leiste steuert den Zufalls-Tiebreaker: Haben mehrere Songs denselben Score, wird bei aktivem Shuffle zuf\u00e4llig statt immer alphabetisch der oberste gew\u00e4hlt (innerhalb einer Sitzung stabil, springt also nicht bei jedem Neuaufbau). Der Schalter teilt sich dieselbe Einstellung wie der Tiebreaker in Songliste und Planner und merkt sich seinen Zustand \u00fcber Neustarts hinweg.<\/li>\n\n\n\n<li><strong>Tiebreaker-Einstellung wird jetzt dauerhaft gemerkt.<\/strong> Der Zufalls-Tiebreaker in Songliste und Planner stand nach jedem Programmstart wieder auf \u201ean&#8220; \u2014 sein Zustand wird nun gespeichert und beim n\u00e4chsten Start wiederhergestellt.<\/li>\n\n\n\n<li><strong>Auto-Loop-Finder: neue Strategie \u201eBestes Vielfaches von 8 Beats&#8220;<\/strong> \u2013 Erg\u00e4nzung zur bisherigen \u201eBestes Vielfaches von 64 Beats&#8220;. Sinnvoll f\u00fcr Musik au\u00dferhalb des klassischen Square-Dance-Rasters, bei der eine feste 64-Beat-Phrasenl\u00e4nge nicht passt, aber trotzdem noch ein sauberer, taktgenauer Loop-Punkt gew\u00fcnscht ist.<\/li>\n\n\n\n<li><strong>Statistik-Widget: Mehrfachauswahl in allen 3 Spalten<\/strong> (TOP\/FLOP\/Nie gespielt) per Shift-\/Strg-Klick. \u201eZur Playlist hinzuf\u00fcgen&#8220; und \u201eZu Notizen&#8220; wirken jetzt auf die gesamte Auswahl; Quality\/ERR \u00b11 sind bei Mehrfachauswahl bewusst ausgegraut, da es daf\u00fcr keine einheitliche Basis gibt.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Evening Planner ist jetzt ein freies Fenster<\/strong> und dockt nicht mehr ungewollt an anderen Bereichen an, wenn man ihn verschiebt.<\/li>\n\n\n\n<li><strong>Redundanter \u00dcbernehmen-Button (gr\u00fcner Haken) im Evening Planner entfernt.<\/strong> Seine Aufgabe \u2013 best\u00e4tigte Songs in die Playliste zu \u00fcbertragen \u2013 \u00fcbernimmt vollst\u00e4ndig der Button \u201e\u00dcbernehmen zur Playliste&#8220; in der unteren Leiste (inkl. Sicherheitsabfrage bei noch nicht best\u00e4tigten Songs).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Evening Planner: Songs mit beiden Typ-Markierungen (Patter <em>und<\/em> Singing) landen jetzt mit dem korrekten Typ in der Playliste.<\/strong> Bisher wurde ein solcher Song, der in einem Singing-Slot geplant war, beim \u00dcbertragen f\u00e4lschlich als Patter (P) eingetragen. Nun beh\u00e4lt er die Rolle seines Slots (S bzw. P). Der Weg \u201eZu Notizen&#8220; war davon nicht betroffen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.115 \u2014 Regeln: Mehrfachauswahl f\u00fcr Export, Duplizieren &amp; L\u00f6schen (2026-07-02)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Regelliste unterst\u00fctzt jetzt Mehrfachauswahl<\/strong> (Shift\/Strg-Klick wie gewohnt).<\/li>\n\n\n\n<li><strong>Export exportiert nur die Auswahl<\/strong>, sofern etwas markiert ist \u2014 ohne Auswahl wird wie bisher alles exportiert.<\/li>\n\n\n\n<li><strong>Duplizieren dupliziert alle markierten Regeln<\/strong> auf einmal (System- und User-Regeln als neue User-Regel-Kopien).<\/li>\n\n\n\n<li><strong>L\u00f6schen l\u00f6scht alle markierten User-Regeln auf einmal<\/strong>, weiterhin mit Sicherheitsabfrage (jetzt mit Anzahl bei mehreren Regeln). System-Regeln in der Auswahl werden dabei ignoriert, da sie sich nie l\u00f6schen lassen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.114 \u2014 Sync-Punkte: Statusfarbe &amp; robust gegen Text-Edits (2026-07-02)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sync-Button zeigt jetzt den Fortschritt per Farbe:<\/strong> Rot, solange f\u00fcr die aktuelle Musik-\/Lyric-Variante noch kein einziger Sync-Punkt gesetzt ist; normal (Theme-Standard), w\u00e4hrend der Sync-Modus aktiv ist (Punkte werden gerade erfasst); gr\u00fcn, sobald Start, Ende und mindestens ein Sync-Punkt vorhanden sind \u2014 Zeichen daf\u00fcr, dass hier nichts mehr zu tun ist.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sync-Punkte \u00fcberleben jetzt das Bearbeiten des Lyric-Texts:<\/strong> Bisher wurden Sync-Punkte (Zeichenpositionen im Text) nach dem L\u00f6schen\/\u00c4ndern von Zeilen im Editor beim n\u00e4chsten Rendern stillschweigend \u00fcbersprungen, sobald ihre Position hinter das (k\u00fcrzere) Textende rutschte \u2014 sichtbar wirkte das wie ein kompletter Datenverlust, obwohl die Werte noch in der Datenbank standen. Callers Caddy vergleicht beim Speichern eines In-App-Edits jetzt den Text vor und nach der \u00c4nderung per Diff: Sync-Punkte in unver\u00e4ndert gebliebenen Abschnitten bleiben exakt erhalten und werden automatisch nachgef\u00fchrt, nur Punkte auf tats\u00e4chlich gel\u00f6schten\/ge\u00e4nderten Zeilen entfallen (m\u00fcssen dort neu gesetzt werden).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.113 \u2014 Robustere Lyrics-Anzeige &amp; Countdown-Feinschliff (2026-07-01)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zeilenumbruch bricht bei defektem Lyrics-HTML nicht mehr grossfl\u00e4chig ab:<\/strong> Manche aus Word exportierten Cuesheets enthalten nicht geschlossene Formatierungs-Tags (z. B. ein verwaistes <code>&lt;nobr&gt;<\/code>). Das lie\u00df bisher den kompletten restlichen Song ohne automatischen Zeilenumbruch anzeigen \u2014 der Text lief \u00fcber den Rand hinaus statt umzubrechen. Callers Caddy erkennt das jetzt beim Laden, warnt und bietet an, die Datei dauerhaft zu reparieren. Bei RTF\/DOCX (dort ist das HTML nur eine abgeleitete Darstellung, keine eigene Nutzerdatei) wird still automatisch bereinigt, ohne R\u00fcckfrage.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Start-Countdown-Overlay: unn\u00f6tigen Overhead entfernt.<\/strong> Das Overlay hat bisher bei jedem 50ms-UI-Tick die Fenstergeometrie neu gesetzt und sich in den Vordergrund geholt \u2014 das passiert jetzt nur noch beim erstmaligen Erscheinen bzw. wenn sich die Hauptfenster-Position tats\u00e4chlich ge\u00e4ndert hat. Die Zahlenanzeige bleibt unver\u00e4ndert fl\u00fcssig (l\u00e4uft weiter \u00fcber den eigenen Puls-Timer).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.112 \u2014 Potential-Fenster: Tabs f\u00fcr fehlende Lied- und Sync-Punkte (2026-06-30)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zwei neue Reiter im Potential-Fenster<\/strong> \u2013 direkt hinter \u201eOhne Lyrics&#8220;:<\/li>\n\n\n\n<li><strong>\u201eOhne Liedpunkte&#8220;:<\/strong> listet alle Singing Calls (mit Lyrics), bei denen <strong>Liedstart und -ende<\/strong> noch nicht beide gesetzt sind.<\/li>\n\n\n\n<li><strong>\u201eOhne SyncPunkte&#8220;:<\/strong> listet alle Singing Calls (mit Lyrics), die noch <strong>keine Sync-Punkte<\/strong> haben.<\/li>\n\n\n\n<li>Per <strong>Doppelklick<\/strong> springt man direkt ins Lyrics-Fenster, und <strong>Maus + Fokus liegen sofort auf dem Sync-Button<\/strong> \u2013 der n\u00e4chste Arbeitsschritt ist ohne Suchen griffbereit.<\/li>\n\n\n\n<li>Wie bei \u201eOhne Lyrics&#8220; mit Anzahl-Badge im Reiter und \u201eIgnorieren&#8220;-Funktion. Gelistet werden bewusst nur Songs mit Lyrics, da sich die Punkte sonst gar nicht setzen lassen (Songs ohne Lyrics stehen weiterhin unter \u201eOhne Lyrics&#8220;).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Win11-Theme: Plus\/Minus-Kn\u00f6pfe der Zahlenfelder immer sichtbar.<\/strong> Die Auf\/Ab-Schaltfl\u00e4chen in Eingabefeldern (z. B. Tempo) waren vorher nur beim Dr\u00fcberfahren mit der Maus zu sehen. Jetzt sind sie dauerhaft sichtbar und werden beim Hover dezent dunkler.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.111 \u2014 ZIP-Import: mehr Varianten erkannt, bessere Titel &amp; gemerkter Ordner (2026-06-30)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ZIP-Import erkennt mehr Tonart- und Stimm-Varianten:<\/strong> Pakete im Rhythm-Records-Schema (z. B. \u201eJolene&#8220;, RR 409) werden jetzt korrekt aufgeschl\u00fcsselt \u2014 <strong>Female Vocal<\/strong>, <strong>Male Vocal<\/strong> und <strong>Harmony 1\/2\/3<\/strong> landen als benannte Varianten statt mehrfach als \u201eInstrumental&#8220;. Auch Labels mit Tonart- oder Index-K\u00fcrzel wie <code>RR 409F<\/code> oder <code>RR 409h1<\/code> werden zuverl\u00e4ssig als Label erkannt.<\/li>\n\n\n\n<li><strong>Saubere Songtitel aus dem Paket statt aus dem ZIP-Dateinamen:<\/strong> Bei Paketen mit kryptischem Download-Namen (z. B. <code>ego_112_-_go_tell_it_on_the_mountain<\/code>, <code>GP509MP3_\u2026_0e76qf<\/code>) oder reinem Label-Namen (<code>STING 22209<\/code>) \u00fcbernimmt CC Titel und Label jetzt aus der enthaltenen Haupt-MP3. Vorbelegt wird damit z. B. <strong>\u201eGo Tell It On The Mountain \/ EGO 112&#8243;<\/strong> oder <strong>\u201eI Think We&#8217;re Alone Now \/ STING 22209&#8243;<\/strong> statt des rohen Dateinamens.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ZIP-Import merkt sich den zuletzt genutzten Ordner:<\/strong> Der Dateidialog beim ZIP-Import \u00f6ffnet wieder dort, wo zuletzt importiert wurde. Bisher wurde der Pfad nur beim Datei-\/Ordner-Import gespeichert, beim ZIP-Import nicht \u2014 der Dialog sprang dadurch jedes Mal an die falsche Stelle.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.110 \u2014 Start-Countdown, Liedrahmen im Player &amp; Sync-Feinschliff (2026-06-27)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Start-Countdown vor dem Liedeinsatz:<\/strong> Ein gro\u00dfes, halbtransparentes Vollbild-Overlay z\u00e4hlt vor dem Gesangsstart die Beats herunter \u2014 im Takt der Musik und mit kurzem Aufleuchten bei jedem Beat. So wei\u00df man genau, wann der erste Call kommt, ohne auf die Uhr zu schauen. Die letzten zwei Beats bleiben bewusst still (kein Overlay), damit der Blick frei ist, wenn es losgeht.<\/li>\n\n\n\n<li>Rein visuell \u2014 der Countdown greift <strong>nicht<\/strong> in die Audiowiedergabe ein und erscheint auch \u00fcber freischwebenden Fenstern.<\/li>\n\n\n\n<li>Ben\u00f6tigt eine hinterlegte <strong>BPM<\/strong> und einen gespeicherten <strong>Liedstart<\/strong> (aus dem Auto-Sync, siehe unten). Folgt automatisch dem Tempo-Regler.<\/li>\n\n\n\n<li>Ein-\/ausschaltbar \u00fcber <strong>Einstellungen \u2192 Anzeige \u2192 \u201eStart-Countdown anzeigen&#8220;<\/strong> (standardm\u00e4\u00dfig an). Vollst\u00e4ndig \u00fcbersetzt (DE\/EN\/JA).<\/li>\n\n\n\n<li><strong>Liedrahmen im Statusleisten-Player:<\/strong> Die sieben Abschnittsstreifen im Mini-Player der Statusleiste liegen jetzt exakt zwischen gespeichertem <strong>Liedstart und -ende<\/strong> \u2014 der Balken zeigt damit den tats\u00e4chlich gesungenen Bereich statt einer pauschalen Aufteilung. Sind keine Zeiten gespeichert, bleibt die bisherige Darstellung erhalten.<\/li>\n\n\n\n<li><strong>Auto-Sync nutzt gespeicherte Start-\/Endzeiten (BL-161):<\/strong> Sind f\u00fcr einen Song bereits Start und Ende hinterlegt, bietet der erste Sync drei Wege an: <strong>\u201eJetzt berechnen&#8220;<\/strong> (die sieben Abschnitte sofort aus den gespeicherten Zeiten ableiten \u2014 ganz ohne Mitlaufen), <strong>\u201eNeu messen&#8220;<\/strong> oder <strong>\u201eManuell&#8220;<\/strong> setzen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Synchron scrollende Lyrics: aktuelle Zeile zentriert:<\/strong> Die gerade gesungene Zeile rastet jetzt in der <strong>Mitte<\/strong> des Lyrics-Fensters ein (vorher im oberen Viertel) \u2014 gleich viel Vorschau nach unten wie Kontext nach oben.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kein Zittern mehr beim Auto-Scroll:<\/strong> Kleine R\u00fcckw\u00e4rts-Spr\u00fcnge durch Mess-Ungenauigkeit der Wiedergabeposition werden jetzt unterdr\u00fcckt, sodass der Text ruhig l\u00e4uft. Echte R\u00fcckspr\u00fcnge (z. B. wiederholte Sequenz oder Loop) werden weiterhin sauber nachvollzogen.<\/li>\n\n\n\n<li><strong>Stabilere Sync-Marker:<\/strong> Marker, die rechnerisch au\u00dferhalb des Textes liegen w\u00fcrden, werden \u00fcbersprungen statt falsch platziert; ein zus\u00e4tzliches Sicherheitsnetz entfernt eventuell zur\u00fcckgebliebene Marker-Zeichen restlos.<\/li>\n\n\n\n<li><strong>Genauere automatische Abschnittsberechnung:<\/strong> Ein Figur-Abschnitt beginnt jetzt an seiner \u00dcberschriftszeile (statt erst an der ersten Inhaltszeile), und der End-Anker sitzt knapp vor dem Abschnittsende \u2014 so sitzen die berechneten Sync-Punkte pr\u00e4ziser.<\/li>\n\n\n\n<li><strong>Saubere Statusleiste bei wechselnden Buttons:<\/strong> Ausgeblendete Schaltfl\u00e4chen (z. B. die Sync-Buttons im Auto-Sync-Modus) belegen keinen Platz mehr \u2014 keine L\u00fccken oder \u00dcberlappungen mehr beim Ein-\/Ausblenden.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.109 \u2014 Lyrics-Sync-Punkte, Theme \u201eFire&#8220; &amp; mehr Stabilit\u00e4t (2026-06-25)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Synchron scrollende Cuesheets \u00fcber Sync-Punkte (BL-160):<\/strong> Automatisch scrollende Lyrics\/Cuesheets bleiben jetzt zuverl\u00e4ssig im Takt der Musik. Im neuen <strong>Sync-Modus<\/strong> koppelst du einzelne Textzeilen fest an eine Liedposition (Anker). Zwischen zwei Ankern interpoliert der Auto-Scroll, an jedem Anker f\u00e4ngt er sich wieder ein \u2014 so l\u00e4uft die Anzeige \u00fcber den ganzen Song synchron.<\/li>\n\n\n\n<li>Gesetzte Anker werden direkt im Text <strong>gelb markiert<\/strong>.<\/li>\n\n\n\n<li>Bei <strong>R\u00fcckw\u00e4rtsspr\u00fcngen<\/strong> (z. B. wiederholte Sequenz) bleibt die Anzeige kurz stehen, statt zur\u00fcckzuspringen.<\/li>\n\n\n\n<li>Im Sync-Modus sind <strong>Regeln und History-Logging pausiert<\/strong>, damit das Setzen der Punkte nichts ungewollt ausl\u00f6st.<\/li>\n\n\n\n<li><strong>Sync in 2 Klicks automatisch erfassen (BL-161):<\/strong> Beim ersten Synchronisieren eines Songs fragt Callers Caddy, ob die Abschnitte <strong>automatisch<\/strong> berechnet werden sollen. In der Automatik markierst du nur <strong>Beginn des 1. Teils<\/strong> und <strong>Ende des 7. Teils<\/strong> \u2014 CC verteilt daraus die sieben Abschnitte selbst. Wo die Ankerzeile im Fenster einrastet, l\u00e4sst sich bei Bedarf per INI (<code>lyric_sync\/viewport_frac<\/code>) feinjustieren.<\/li>\n\n\n\n<li><strong>Neues Theme \u201eFire&#8220;:<\/strong> dunkles Theme mit leuchtend feuer-orangem Akzent. Ausw\u00e4hlbar \u00fcber <strong>Einstellungen \u2192 Anzeige \u2192 Skin \/ Theme<\/strong>.<\/li>\n\n\n\n<li><strong>Crash-Hinweis: \u201eOrdner \u00f6ffnen&#8220;:<\/strong> Der beim Start angezeigte Hinweis auf ein Absturz-Protokoll bietet jetzt zus\u00e4tzlich <strong>\u201eOrdner \u00f6ffnen&#8220;<\/strong>, um direkt zum Log-Verzeichnis (<code>logs\/crashes<\/code>) zu springen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Absturz beim schnellen Durchsteppen mit Auto-Loop behoben (TIC-0029):<\/strong> Mit aktiver Regel \u201ebester Loop automatisch setzen&#8220; konnte schnelles Wechseln durch mehrere Songs die App mit \u201eQThread: Destroyed while thread is still running&#8220; abst\u00fcrzen lassen. Der Lebenszyklus des Loop-Finder-Threads ist jetzt sauber abgesichert.<\/li>\n\n\n\n<li><strong>Kein Absturz mehr beim Beenden (TIC-0026):<\/strong> Beim Schlie\u00dfen konnte ein zuletzt bearbeitetes Eingabefeld noch ein Auto-Speichern ausl\u00f6sen, nachdem die Datenbank bereits geschlossen war (<code>AttributeError<\/code>). Auto-Speichern und Lautst\u00e4rke-Speichern pr\u00fcfen jetzt, ob die Datenbank noch offen ist.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u00dcbersetzungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Englische und japanische Texte f\u00fcr drei zuletzt erg\u00e4nzte Einstellungen nachgezogen: <strong>Hinweis-Sound (Timer-\u00dcberzug)<\/strong>, <strong>Lautst\u00e4rke Hinweis-Sound<\/strong> und <strong>\u201eFilter automatisch auf Tanzprogramm setzen&#8220;<\/strong> (Sequenzen).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.108 \u2014 Sicherer ZIP-Import &amp; neue Songs automatisch markiert (2026-06-24)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ZIP-Label-Import: Vollst\u00e4ndigkeitscheck + lernende Erkennung (BL-157):<\/strong> Der Import von Label-Paketen geht jetzt sicher mit allem im ZIP um \u2014 und wird durch pflegbare Listen mit jedem Eintrag besser.<\/li>\n\n\n\n<li><strong>Alles bleibt sichtbar:<\/strong> Alle Musikdateien landen in der Song-Area, alle Lyrics in der Lyric-Area, alles \u00dcbrige (z. B. Word-Beiwerk) mit Begr\u00fcndung in einer <strong>\u201eSonstige&#8220;-Liste<\/strong>. Oben zeigt eine <strong>Bilanz<\/strong>, dass jede Datei ber\u00fccksichtigt ist. So f\u00e4llt ein Paket nicht mehr in mehrere \u201eSongs&#8220; auseinander, nur weil eine Originalspur oder Variante anders hei\u00dft.<\/li>\n\n\n\n<li><strong>Vier pflegbare Listen in einem Dialog<\/strong> (Varianten-Abk\u00fcrzungen, Label-Verzeichnis, Beiwerk-Muster, Rollen-W\u00f6rter): \u00dcber <strong>\u201eListen bearbeiten\u2026&#8220;<\/strong> pflegst du, woran CC Songs erkennt. Deine Eintr\u00e4ge bleiben bei Updates erhalten, neue mitgelieferte Standards kommen automatisch dazu (nichts wird \u00fcberschrieben). Per <strong>\u201eListe importieren\u2026&#8220;<\/strong> kannst du die Sammlung eines Kollegen additiv \u00fcbernehmen.<\/li>\n\n\n\n<li><strong>Varianten besser erkannt:<\/strong> Ein Varianten-K\u00fcrzel wird jetzt in Klammern <code>(V)<\/code>, direkt an der Labelnummer (<code>WM 002v<\/code>) <strong>und<\/strong> als freies Wort am Dateinamen-Ende (<code>\u2026 VJ<\/code>) erkannt \u2014 sofern es in deiner Liste steht. Flip-Side-Nummern wie <code>509a<\/code> bleiben dabei unangetastet.<\/li>\n\n\n\n<li><strong>Standard-Songtyp<\/strong> im Vorschau-Fenster ist jetzt <strong>Singing<\/strong> (Label-Pakete sind meist Singing Calls).<\/li>\n\n\n\n<li>Hinweis: Lyrics im alten <code>.doc<\/code>-Format kann CC weiterhin nicht anzeigen (nur <code>.docx<\/code>); solche Dateien erscheinen sichtbar unter \u201eSonstige&#8220;.<\/li>\n\n\n\n<li><strong>Genre \u201eNEW&#8220; f\u00fcr frisch hinzugekommene Songs (BL-040):<\/strong> Jeder Song, der neu in die Datenbank kommt \u2013 per Import, ZIP-Label-Import, \u201eNeu&#8220;-Button oder durch das Laden einer noch unbekannten MP3 in den Player \u2013 erh\u00e4lt <strong>automatisch das Genre \u201eNEW&#8220;<\/strong>. So sieht man auf einen Blick, was zuletzt dazugekommen ist: einfach in der Songliste (oder im Planner) auf das Genre <strong>\u201eNEW&#8220;<\/strong> filtern.<\/li>\n\n\n\n<li>Der Caller entscheidet selbst, wann ein Song \u201eeingearbeitet&#8220; ist, und entfernt das \u201eNEW&#8220;-Tag dann wie gewohnt \u00fcber den Genre-Dialog im Song-Datensatz.<\/li>\n\n\n\n<li>\u201eNEW&#8220; verh\u00e4lt sich wie jedes andere Genre (filtern, umbenennen, im Genre-Manager verwalten).<\/li>\n\n\n\n<li>Beim Import automatisch erkannte Genre-Vorschl\u00e4ge (aus dem Dateinamen) kommen <strong>zus\u00e4tzlich<\/strong> zum \u201eNEW&#8220;-Tag dazu \u2013 sie \u00fcberschreiben es nicht mehr.<\/li>\n\n\n\n<li><strong>Migrierter Altbestand<\/strong> (aus der alten Version \/ SqView) bekommt bewusst <strong>kein<\/strong> \u201eNEW&#8220;, da es sich dabei nicht um Neuzug\u00e4nge handelt.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ZIP-Import-Vorschau: Mausrad verstellt keine Auswahlfelder mehr:<\/strong> Beim Hoch- und Runterscrollen durch das Vorschau-Fenster sprang bisher der Wert eines Auswahlfeldes (z. B. Songtyp) um, sobald der Mauszeiger dar\u00fcber lag. Das Mausrad ist f\u00fcr die Auswahlfelder (Songtyp &amp; Co.) im Fenster jetzt deaktiviert \u2014 wie in den \u00fcbrigen Dialogen \u2014 und scrollt stattdessen den Fensterinhalt.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.107 \u2014 ZIP-Label-Import, zuverl\u00e4ssigeres Lyrics-Matching &amp; Audio-Standard-Fix (2026-06-23)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ZIP-Import f\u00fcr Label-Lieferungen (BL-157):<\/strong> Im Import-Dialog gibt es jetzt die Quelle <strong>\u201eZIP-Paket (Label-Lieferung)\u2026&#8220;<\/strong>. Callers Caddy entpackt das\/die ZIP(s), erkennt automatisch zusammengeh\u00f6rige Songs und zeigt vor dem \u00dcbernehmen ein <strong>Vorschau-Fenster<\/strong> zum Pr\u00fcfen und Anpassen.<\/li>\n\n\n\n<li><strong>Haupt-MP3 + Varianten:<\/strong> Die Instrumental-Version (ohne Modifier im Dateinamen) wird als Hauptlied vorgeschlagen; zus\u00e4tzliche Spuren (z. B. \u201e(V)&#8220; = Vocal, \u201e(NL)&#8220; = No Lead) werden als <strong>Varianten<\/strong> angeboten. Die Reihenfolge l\u00e4sst sich <strong>per Drag &amp; Drop<\/strong> \u00e4ndern (oberste = Hauptlied).<\/li>\n\n\n\n<li><strong>Lyrics in mehreren Formaten:<\/strong> Mitgelieferte Lyrics (HTML, PDF, DOCX, RTF, TXT) werden gefunden; man w\u00e4hlt an\/ab, bestimmt die prim\u00e4re Datei und kann jede <strong>Bezeichnung editieren<\/strong>.<\/li>\n\n\n\n<li><strong>Editierbare Abk\u00fcrzungs-Tabelle:<\/strong> \u00dcber \u201eAbk\u00fcrzungen bearbeiten\u2026&#8220; lassen sich die K\u00fcrzel (V\u2192Vocal, NL\u2192No Lead Instrument, NB\u2192No Backup Vocals, NBL\u2192No Backup Vocals\/No Lead, \u2026) selbst pflegen. Daraus werden die vorbelegten Varianten-Bezeichnungen abgeleitet; Unbekanntes wird roh \u00fcbernommen und ist \u00fcberschreibbar.<\/li>\n\n\n\n<li><strong>Probeh\u00f6ren im Preview:<\/strong> Jede Musikspur hat in der Liste eine Probe-Spalte (\u25b6\/\u23f8) \u2014 so kann man Instrumental und Varianten direkt anspielen und vergleichen, bevor man importiert. Das Probeh\u00f6ren ist \u201estill&#8220;: es l\u00f6st \u2014 wie das Vorh\u00f6ren im Loop Finder \u2014 <strong>weder Regeln noch History-Tracking<\/strong> aus.<\/li>\n\n\n\n<li>Beim \u00dcbernehmen landen Haupt-MP3 + prim\u00e4re Lyrics in den Stammdaten, alle weiteren Dateien als <strong>Varianten (Extended Data)<\/strong> am Song.<\/li>\n\n\n\n<li>Erkennt beide g\u00e4ngigen Label-Namensschemata: Modifier am Ende (<code>Titel - LABEL (V)<\/code>) und vor dem Label (<code>Titel (V) - LABEL<\/code>).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lyrics-Dateien kamen beim Song-Import nicht mit, wenn der Dateiname nicht exakt zur MP3 passte \u2013 behoben:<\/strong> Bisher wurde beim Import nur dann eine Lyrics-Datei automatisch verkn\u00fcpft, wenn ihr Name <strong>exakt<\/strong> mit dem der MP3 \u00fcbereinstimmte. Gerade Label-Pakete (z.B. als Word-\/DOCX-Datei) benennen die Lyrics aber oft anders als die Musikdatei \u2013 sie wurden dadurch \u00fcbersehen. Der Import vergleicht Namen jetzt <strong>tolerant<\/strong> (wie schon die Migration aus der alten Version):<\/li>\n\n\n\n<li>Label am Ende wird erkannt und ignoriert \u2013 auch ohne umgebende Leerzeichen (z.B. MP3 <code>Achy Breaky Heart-RYL 555<\/code>, Lyrics <code>Achy Breaky Heart.docx<\/code>).<\/li>\n\n\n\n<li>Funktioniert in <strong>beide Richtungen<\/strong>: egal ob das Label an der MP3 oder an der Lyrics-Datei h\u00e4ngt.<\/li>\n\n\n\n<li>Unterschiede in Schreibweise\/Sonderzeichen werden \u00fcber einen normalisierten Vergleich abgefangen.<\/li>\n\n\n\n<li>Liegen mehrere passende Dateien vor, gewinnt das hochwertigere Format (RTF vor HTML vor Text vor DOCX vor PDF). Ein exakter Namenstreffer hat immer Vorrang vor einem nur \u201elabel-bereinigten&#8220;.<\/li>\n\n\n\n<li><strong>Kein stummer Start mehr auf dem falschen Ausgang:<\/strong> Beim allerersten Start w\u00e4hlte Callers Caddy das Ausgabeger\u00e4t nach Backend-Priorit\u00e4t (WDM-KS vor WASAPI vor MME) \u2014 und erwischte dabei oft den <strong>digitalen SPDIF-Ausgang<\/strong>, sodass nichts zu h\u00f6ren war. Jetzt startet die App mit dem <strong>Windows-Standardwiedergabeger\u00e4t<\/strong> (\u201eSystem-Standard&#8220;), das praktisch immer h\u00f6rbar ist. Wer geringere Latenz will, w\u00e4hlt in der Statusleiste gezielt ein spezifischeres Ger\u00e4t (WDM-KS\/WASAPI, optional Exclusive). <em>(Bereits gespeicherte Ger\u00e4teauswahlen bleiben unver\u00e4ndert \u2014 ggf. einmalig \u201eSystem-Standard&#8220; w\u00e4hlen.)<\/em><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Ge\u00e4ndert<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Import-Dialog umgestellt:<\/strong> Zuerst wird die <strong>Quelle<\/strong> gew\u00e4hlt (Datei \/ Ordner \/ ZIP). Bei Datei\/Ordner kommen Kopieren und <strong>Songtyp erst danach<\/strong> (Typ ganz am Ende). ZIP-Pakete springen direkt ins Preview \u2014 kein unn\u00f6tiger Vorab-Dialog mehr. (Behebt auch, dass eine vorab gew\u00e4hlte Typ-Einstellung nicht zum ZIP-Preview passte.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technik<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer GUI-freier Analyzer <code>zip_import.py<\/code> (eigenst\u00e4ndig testbar) + Vorschau-Dialog <code>zip_import_dialog.py<\/code>. Entpacken\/Analysieren laufen im <strong>Hintergrund-Thread<\/strong> (Audio-Priorit\u00e4t bleibt gewahrt), mit <strong>Performance-Messmarken<\/strong> f\u00fcr Entpacken, Scan und Commit. Der bestehende Import wurde daf\u00fcr in einen wiederverwendbaren Kern (<code>_import_single_audio<\/code>) refaktoriert; das normale Import-Verhalten bleibt unver\u00e4ndert. Vollst\u00e4ndig \u00fcbersetzt (DE\/EN\/JA).<\/li>\n\n\n\n<li>Lyrics-Matching beim Import: neuer Helfer <code>_build_lyrics_map()<\/code> und \u00fcberarbeitetes <code>_find_and_import_lyrics()<\/code> \u2014 nutzt den bew\u00e4hrten 4-stufigen Matcher der SqView-Migration (<code>SqViewReader.match_lyrics<\/code>) plus die Label-Erkennung <code>_parse_filename()<\/code>; die Migration selbst bleibt unver\u00e4ndert.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.106 \u2014 Zentrale Icons, Farben aus dem Theme (2026-06-18)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features \/ Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Einheitliches Icon-Konzept f\u00fcr alle Themes:<\/strong> Alle Icons liegen jetzt zentral in einem gemeinsamen <code>images\/<\/code>-Ordner statt in jedem Theme dupliziert. Geometrie und Design werden einmal zentral gepflegt; die <strong>Farbe kommt ausschlie\u00dflich aus den Theme-Werten<\/strong>.<\/li>\n\n\n\n<li>Neuer Theme-Farb-Key <strong><code>icon_color<\/code><\/strong> (zus\u00e4tzlich zum bestehenden <code>title_icon<\/code>). Iconfarben lassen sich damit pro Theme rein \u00fcber <code>skin.json<\/code> steuern \u2014 ganz ohne eigene Bilddateien. Eigene Themes zu gestalten wird dadurch deutlich einfacher.<\/li>\n\n\n\n<li>Alle Themes nutzen dasselbe Icon-Set (modern, Outline-Stil); bisher abweichende Designs (win11, elegant) wurden angeglichen.<\/li>\n\n\n\n<li>Semantische Akzentfarben bleiben fest (Highlight-Gelb, Text-Color-Rot).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes (Theme-Feinschliff)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Spinbox-\/Combobox-Pfeile<\/strong> waren in hellen Themes (light\/win11) dunkel auf blauem Button-Grund (schlecht lesbar) \u2014 sie folgen jetzt <code>icon_color<\/code> und sind dort wei\u00df.<\/li>\n\n\n\n<li><strong>Splitter-Trennlinie<\/strong> (z.B. Planner zwischen Pool und Playlist) war ungestylt und erschien fast wei\u00df \u2014 sie nutzt jetzt die Theme-Trennfarbe wie die Dock-Trenner.<\/li>\n\n\n\n<li><strong>\u201e\u2026&#8220;-Buttons f\u00fcr Datei-Dialoge<\/strong> zeigten die drei Punkte nicht (Button-Padding schnitt den Text bei fester schmaler Breite ab) \u2014 eigene schmale Button-Variante, Punkte wieder sichtbar.<\/li>\n\n\n\n<li>Notes-Widget: Zoom-Icons werden wieder angezeigt (nutzen nun den zentralen Icon-Cache).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technik<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>SkinManager<\/code> f\u00e4rbt die zentralen Template-SVGs beim Theme-Laden mit den Theme-Farben ein (Temp-Cache); QSS referenziert Icons \u00fcber <code>{{icon_path}}<\/code>, Code \u00fcber <code>skin_mgr.icon_dir<\/code>. Dokumentation: <code>1_Source\/docs\/17_theming_icons.md<\/code> und `1_So<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.105 \u2014 Japanisch als dritte Sprache (2026-06-18)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Japanische Programmsprache (\u65e5\u672c\u8a9e):<\/strong> Callers Caddy l\u00e4sst sich jetzt auf Japanisch umstellen. Die gesamte Oberfl\u00e4che (Men\u00fcs, Dialoge, Tooltips, Meldungen, Tutorials, Migration und Class Designer \u2014 rund 1.460 Texte) wurde \u00fcbersetzt.<\/li>\n\n\n\n<li>Auswahl beim Erststart (dritter Button \u201e\u65e5\u672c\u8a9e\u3067\u958b\u59cb&#8220;) sowie jederzeit \u00fcber <strong>Einstellungen \u2192 Sprache<\/strong> bzw. das Sprach-Men\u00fc.<\/li>\n\n\n\n<li><strong>Square-Dance-Fachbegriffe bleiben bewusst englisch<\/strong> (z.B. Patter, Singing Call, Tip, Loop, BPM, Pitch, Beat Snap) \u2014 so wie international und auch von japanischen Callern \u00fcblich.<\/li>\n\n\n\n<li>Deutsch und Englisch sind unver\u00e4ndert: Die japanische \u00dcbersetzung wurde rein additiv erg\u00e4nzt, bestehende Sprachen wurden an keiner Stelle angetastet.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lyrics-Toolbar bricht bei schmalem Dock um:<\/strong> Die Buttons oben im Lyrics-Fenster (Auto-Scroll, Auto-Size, Auto-Width, Zoom, Bearbeiten) leiten ihre Breite aus ihrem Inhalt ab und brechen in die n\u00e4chste Zeile um, wenn das Widget schmaler wird als die Buttonzeile vertr\u00e4gt \u2014 statt abgeschnitten zu werden oder eine Mindestbreite zu erzwingen. Gleiches Umbruch-Verhalten wie bereits bei Songliste und Playlist.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technik<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Logfiles bleiben sprachneutral lesbar:<\/strong> Diagnose-\/Support-Logs (Crash-Logs, rules.log, perf_log.txt, System-Report) waren und bleiben unabh\u00e4ngig von der UI-Sprache (technisch\/englisch). Das <strong>Migrations-Detaillog<\/strong> wird ab jetzt bewusst immer auf Englisch geschrieben (samt Live-Anzeige w\u00e4hrend der Migration), damit es f\u00fcr den Support unabh\u00e4ngig von der gew\u00e4hlten Sprache lesbar bleibt \u2014 die \u00fcbrige Oberfl\u00e4che des Migrationstools bleibt in der Nutzersprache.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.104 \u2014 Massen-L\u00f6schen gro\u00dfer Songmengen (2026-06-17)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Reiter \u201eMassen-L\u00f6schen\u201c im Potential-Fenster (BL-148):<\/strong> Entfernt eine gro\u00dfe Menge Songs in einem Rutsch aus der Datenbank \u2014 gedacht f\u00fcr den Fall, dass versehentlich zu viele Songs geladen wurden (z.B. ein falscher Ordner beim Import).<\/li>\n\n\n\n<li><strong>Mehrfach sortierbare Liste<\/strong> mit den Spalten Typ (P\/S\/PS), Hinzugef\u00fcgt (Datum), Titel, Label, Genre, ERR und Qualit\u00e4t \u2014 jede Spalte per Klick auf den Kopf sortierbar, um den falschen Schwung schnell zu isolieren.<\/li>\n\n\n\n<li><strong>Komfortable Mehrfachauswahl:<\/strong> Shift+Klick markiert einen zusammenh\u00e4ngenden Bereich, Strg+Klick einzelne Zeilen, Strg+A alles in der Ansicht.<\/li>\n\n\n\n<li><strong>Eine einzige Sicherheitsabfrage<\/strong> f\u00fcr den ganzen Vorgang (keine R\u00fcckfrage pro Song), danach wird ohne weitere Unterbrechung gel\u00f6scht.<\/li>\n\n\n\n<li><strong>Historiendaten:<\/strong> Liegen zu den ausgew\u00e4hlten Songs Abspielverl\u00e4ufe vor, wird einmal gefragt, ob diese mitgel\u00f6scht werden sollen (Standard: Nein \u2014 die Historie kann sp\u00e4ter \u00fcber \u201eVerwaiste Historie\u201c bereinigt werden).<\/li>\n\n\n\n<li>Die Musikdateien auf der Festplatte werden dabei nicht angetastet.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technik \/ Performance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die Songliste des Reiters wird <strong>erst beim \u00d6ffnen<\/strong> geladen (kein Start-Overhead) und das L\u00f6schen l\u00e4uft im Hintergrund-Thread, damit ein laufender Song nie unterbrochen wird. Bei aktivem Performance-Log werden Messpunkte (DB-Abfrage, Genre-Zuordnung, Tabellenaufbau, L\u00f6schvorgang) protokolliert.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.103 \u2014 Lyrics: Word- (DOCX) und PDF-Dateien anzeigen (2026-06-16)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lyrics als Word-Dokument (.docx) anzeigen:<\/strong> Lyrics und Cuesheets, die als Word-Datei vorliegen, lassen sich jetzt direkt mit einem Song verkn\u00fcpfen und im Lyrics-Fenster anzeigen \u2013 inklusive Schriftgr\u00f6\u00dfen, gro\u00dfem zentriertem Titel, Einr\u00fcckungen, Fett\/Kursiv\/Unterstrichen sowie farbigen Text- und Hintergrund-Markierungen (z.B. die typischen gelben\/farbigen Tag-Markierungen). Es ist keine zus\u00e4tzliche Software (kein Word) n\u00f6tig.<\/li>\n\n\n\n<li><strong>Lyrics als PDF anzeigen:<\/strong> PDF-Dateien k\u00f6nnen ebenfalls als Lyrics verkn\u00fcpft und angezeigt werden \u2013 als schnelle Text-Leseansicht des Call-Texts. Hinweis: PDF wird bewusst nur als Text dargestellt; farbige Markierungen und das exakte Layout aus dem PDF werden dabei nicht \u00fcbernommen. Wer die volle Formatierung mit Markierungen braucht, verwendet daf\u00fcr Word, RTF oder HTML.<\/li>\n\n\n\n<li><strong>Bearbeiten von Word-\/PDF-Lyrics:<\/strong> Word und PDF sind reine Anzeigeformate. Wer ein solches Lyric bearbeiten m\u00f6chte, dem bietet Callers Caddy an, daraus eine bearbeitbare HTML-Kopie anzulegen (genau wie bisher bei RTF und Text). Die Originaldatei bleibt dabei unver\u00e4ndert.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Datei-Auswahl, automatischer Lyrics-Import beim Hinzuf\u00fcgen von Songs und die Migration aus der alten Version erkennen jetzt auch <code>.docx<\/code>&#8211; und <code>.pdf<\/code>-Dateien.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.102 \u2014 Startprobleme behoben: \u201el\u00e4uft bereits&#8220;, Audio auf ARM-Windows, Theme-Wechsel (2026-06-16)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u201eCallers Caddy l\u00e4uft bereits&#8220; trotz geschlossenem Programm \u2013 behoben:<\/strong> Bei einer Installation in gesch\u00fctzten Ordnern (z.B. <code>C:\\Programme\\\u2026<\/code>) lie\u00df sich Callers Caddy nicht starten \u2013 es kam die Meldung, das Programm laufe bereits, obwohl es geschlossen war. Behelfen konnte man sich nur mit \u201eAls Administrator ausf\u00fchren&#8220;. Ursache war die interne Sperrdatei, die im Programmordner abgelegt wurde, wo normale Benutzer nicht schreiben d\u00fcrfen. Sie liegt jetzt in einem immer beschreibbaren, benutzereigenen tempor\u00e4ren Ordner \u2013 der Admin-Trick ist nicht mehr n\u00f6tig. Mehrere getrennte Installationen blockieren sich dabei nicht gegenseitig.<\/li>\n\n\n\n<li><strong>Absturz beim Start auf Windows-on-ARM (z.B. Apple-Mac mit Parallels) \u2013 behoben:<\/strong> Lief Callers Caddy unter einem Windows auf ARM-Basis (etwa Windows 11 in Parallels auf einem MacBook), st\u00fcrzte es direkt beim Start mit <code>error 0x7e<\/code> ab, weil das Audio-System f\u00e4lschlich eine ARM-Variante der Audio-Bibliothek suchte, die nicht mitgeliefert wird. Callers Caddy nutzt jetzt korrekt die mitgelieferte 64-bit-Bibliothek (\u00fcber die Windows-Emulation) und startet auch in dieser Umgebung. Zus\u00e4tzlich rei\u00dft ein nicht ladbares Audio-System den Start an dieser Stelle nicht mehr roh ab, sondern wird sauber abgefangen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Theme\/Skin wechselt jetzt sofort:<\/strong> Eine \u00c4nderung von \u201eSkin \/ Theme&#8220; in den Einstellungen wird unmittelbar \u00fcbernommen \u2013 ein Neustart ist nicht mehr erforderlich.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.101 \u2014 Verst\u00e4ndliche Meldung statt Absturz, wenn das Audio-System blockiert ist (2026-06-15)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kein roher Absturz mehr beim Start, wenn die Audio-Komponente nicht geladen werden kann:<\/strong> Auf manchen Rechnern brach Callers Caddy direkt beim Start mit einem unverst\u00e4ndlichen Python-Fehlerfenster ab (<code>PortAudio library not found<\/code>, <code>error 0x7e<\/code>). Ursache ist fast immer der Rechner, nicht das Programm \u2014 meist ein Virenscanner, der die Audio-Datei <code>libportaudio64bit.dll<\/code> blockiert oder in die Quarant\u00e4ne verschiebt, oder eine heruntergeladene ZIP-Datei, die vor dem Entpacken nicht \u201ezugelassen&#8220; wurde (Windows-Sperre). Bisher passierte dieser Fehler so fr\u00fch, dass kein Hinweisfenster m\u00f6glich war.<\/li>\n\n\n\n<li><strong>Klartext-Hinweis mit L\u00f6sungsweg:<\/strong> L\u00e4sst sich das Audio-System nicht laden, erscheint jetzt ein verst\u00e4ndliches Fenster, das die wahrscheinliche Ursache nennt und Schritt f\u00fcr Schritt erkl\u00e4rt, wie man sie behebt (Virenscanner-Ausnahme bzw. ZIP vor dem Entpacken freigeben).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen (Diagnose)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Crash-Protokollierung greift jetzt von der allerersten Sekunde an:<\/strong> Der Absturz-Logger wird nun ganz fr\u00fch aktiviert \u2014 noch bevor die Audio-Komponenten geladen werden. Dadurch werden ab sofort auch Abst\u00fcrze <em>beim Programmstart<\/em> in eine Logdatei geschrieben (<code>logs\\crashes<\/code>), die bisher spurlos blieben.<\/li>\n\n\n\n<li><strong>Gezielte Audio-Diagnose:<\/strong> Schl\u00e4gt das Laden des Audio-Systems fehl, schreibt Callers Caddy automatisch eine Diagnosedatei. Sie pr\u00fcft unter anderem, ob die Audio-Datei \u00fcberhaupt noch vorhanden ist und lesbar ist \u2014 so l\u00e4sst sich unterscheiden, ob der Virenscanner sie <em>gel\u00f6scht\/in Quarant\u00e4ne<\/em> verschoben hat oder ob sie <em>vorhanden, aber blockiert<\/em> ist (was der Windows-Fehlercode allein nicht verr\u00e4t). Der Hinweisdialog nennt den Speicherort der Datei f\u00fcr eine R\u00fcckfrage beim Support.<\/li>\n\n\n\n<li><strong>Erkennung von Sonderzeichen im Installationspfad:<\/strong> Die Diagnose pr\u00fcft jetzt auch, ob der Programmpfad Sonderzeichen enth\u00e4lt (z.B. Umlaute oder Diakritika im Benutzernamen wie <code>C:\\Users\\Tom\u00e1\u0161\\\u2026<\/code>). Solche Pfade sind eine bekannte, regionsabh\u00e4ngige Ursache daf\u00fcr, dass die Audio-Bibliothek unter Windows nicht geladen werden kann \u2014 die Diagnose weist dann direkt darauf hin (Abhilfe: in einen Pfad ohne Sonderzeichen installieren, z.B. <code>C:\\Callers_Caddy<\/code>).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.100 \u2014 Relative Musikpfade: verstreute Bibliotheken \u00fcber mehrere Ordner (2026-06-15)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Funktionen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Songs d\u00fcrfen jetzt in beliebig tiefen Unterordnern liegen:<\/strong> Bisher merkte sich Callers Caddy zu jedem Song nur den reinen Dateinamen und suchte ihn direkt in den (bis zu vier) Musikpfaden. Wer seine Musik in viele Unterordner sortiert hat, stie\u00df damit an Grenzen. Jetzt wird zu jedem Song der <strong>relative Pfad innerhalb seines Musikpfads<\/strong> gespeichert (z.B. <code>Singing Calls\/Country\/song.mp3<\/code>). So gen\u00fcgen weiterhin die vier Musikpfade als Wurzeln \u2014 die Unterordner-Struktur darunter kann beliebig gro\u00df sein.<\/li>\n\n\n\n<li><strong>Bis zu vier Wurzelpfade, auch auf verschiedenen Laufwerken:<\/strong> Die vier Musikpfade gelten als eigenst\u00e4ndige Wurzeln und d\u00fcrfen auf unterschiedlichen Laufwerken liegen (z.B. C:, D:, E:, F:). Ein Song wird relativ zu seinem Musikpfad gespeichert; beim Abspielen werden die Pfade der Reihe nach durchprobiert.<\/li>\n\n\n\n<li><strong>Neues Werkzeug \u201eMusikbibliothek re-indexieren&#8220; (Men\u00fc Pfade):<\/strong> Durchsucht alle konfigurierten Musikpfade rekursiv und hebt bestehende Songs, deren Datei in einem Unterordner liegt, automatisch auf den passenden relativen Pfad \u2014 so werden bisher nicht auffindbare Songs wieder abspielbar. L\u00e4uft im Hintergrund, ohne einen laufenden Song zu st\u00f6ren. Am Ende erscheint ein Bericht (aktualisiert \/ mehrdeutig \/ weiterhin fehlend). Dateien gleichen Namens in mehreren Ordnern werden bewusst nicht geraten, sondern zur manuellen Zuordnung gemeldet.<\/li>\n\n\n\n<li><strong>Import beh\u00e4lt die Ordnerstruktur:<\/strong> Beim Import \u201eam Ort belassen&#8220; wird der gew\u00e4hlte Wurzelordner als Musikpfad eingetragen und jeder Song relativ dazu gespeichert \u2014 inklusive Unterordner.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Einheitliche, portable Pfadspeicherung:<\/strong> Relative Pfade werden \u00fcberall einheitlich mit Schr\u00e4gstrich <code>\/<\/code> gespeichert (statt gemischter Schr\u00e4gstriche). Eine einmalige Datenbank-Migration r\u00e4umt \u00e4ltere Eintr\u00e4ge automatisch auf. Das macht die Datenbank robuster beim Verschieben auf andere Rechner oder USB-Sticks.<\/li>\n\n\n\n<li><strong>Datei-Auswahl an allen Stellen vereinheitlicht:<\/strong> Der Datei-Button im Song-Datensatz, die Varianten-Verwaltung und die Lyrics-Auswahl ermitteln den relativen Pfad jetzt gegen alle Musikpfade einheitlich.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Migrations-Tool<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kopieren oder Verkn\u00fcpfen w\u00e4hlbar:<\/strong> Wie beim normalen Import fragt die Migration jetzt, ob die Musikdateien ins Ziel kopiert oder an ihrem Ort belassen und nur verkn\u00fcpft werden sollen. Verkn\u00fcpfen spart Speicherplatz und ist ideal f\u00fcr gro\u00dfe, verstreute Bibliotheken \u2014 die Quellordner werden dabei automatisch als Musikpfade in die Ziel-Konfiguration eingetragen.<\/li>\n\n\n\n<li><strong>Wurzelverzeichnis der Musikbibliothek:<\/strong> Die Migration fragt das Wurzelverzeichnis ab und speichert jeden Song relativ dazu \u2014 die Unterordner-Struktur bleibt erhalten.<\/li>\n\n\n\n<li><strong>Unterordner werden vollst\u00e4ndig durchsucht (CC1):<\/strong> Die Callers-Caddy-1.0-Migration durchsucht die Musikordner jetzt rekursiv inklusive aller Unterordner (vorher nur die oberste Ebene).<\/li>\n\n\n\n<li><strong>Keine verlorenen Dateien mehr bei gleichen Namen (SqView):<\/strong> Gleichnamige Dateien in verschiedenen Ordnern gingen bisher verloren. Jetzt bleiben beide erhalten; bei mehreren Treffern wird anhand des urspr\u00fcnglichen Pfads die passende Datei gew\u00e4hlt.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.99 \u2014 Migrations-Detaillog und robustere SqView-\u00dcbernahme (2026-06-14)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>App startet nach einem Absturz wieder zuverl\u00e4ssig:<\/strong> St\u00fcrzte Callers Caddy ab, blieb eine interne Sperrdatei zur\u00fcck, die jeden weiteren Start mit der Meldung \u201eCallers Caddy l\u00e4uft bereits&#8220; blockierte \u2014 auch ein Rechner-Neustart half nicht, da die Datei auf der Festplatte verblieb. Die App pr\u00fcft jetzt beim Start, ob die als Sperr-Besitzer eingetragene Programm-Instanz \u00fcberhaupt noch l\u00e4uft, und entfernt verwaiste Sperren automatisch. L\u00e4uft tats\u00e4chlich noch eine Instanz, erscheint die Hinweismeldung wie bisher.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Migrationstool<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Detailliertes Migrationslog:<\/strong> Bei jeder Migration (SqView wie auch Callers Caddy 1.0) wird jetzt im Zielordner eine Logdatei abgelegt (<code>migration_log_&lt;Datum&gt;_&lt;Uhrzeit&gt;.txt<\/code>). Sie protokolliert Schritt f\u00fcr Schritt, was pro Song getan wurde \u2014 Datensatz \u00fcbernommen, Sprungmarken \u00fcbernommen, Lyrics gefunden und eingetragen, MP3 gefunden und verkn\u00fcpft \u2014 und ist auch nach der Migration jederzeit nachlesbar. Die Datei wird laufend geschrieben, sodass auch bei einem Abbruch alles bis dahin erhalten bleibt.<\/li>\n\n\n\n<li><strong>Drei Meldungsstufen:<\/strong> Jeder Schritt wird als <code>DONE<\/code>, <code>WARNING<\/code> oder <code>ERROR<\/code> eingestuft. Am Ende des Logs steht eine Zusammenfassung, summiert nach Kategorien \u2014 auf einen Blick erkennbar, was gelungen ist und was nicht.<\/li>\n\n\n\n<li><strong>Suchbarer Doppel-Schl\u00fcssel (Schweregrad + Thema):<\/strong> Jede Logzeile beginnt mit einem sprachunabh\u00e4ngigen Schl\u00fcssel aus Schweregrad und Thema, z.B. <code>ERROR MUSIC<\/code>, <code>DONE LYRIC<\/code>, <code>WARNING LYRIC<\/code>, <code>DONE LOOP<\/code>. So lassen sich einzelne Themen im Log gezielt per Volltextsuche finden, unabh\u00e4ngig von der Sprache der Beschreibung.<\/li>\n\n\n\n<li><strong>Aufger\u00e4umte Live-Anzeige:<\/strong> W\u00e4hrend der Migration zeigt das Fenster nur noch den Phasen-Fortschritt, alle Warnungen\/Fehler und die Schluss-Zusammenfassung. Die vollst\u00e4ndige Schritt-f\u00fcr-Schritt-Liste landet im Detaillog. Ein neuer Button \u201eDetaillog \u00f6ffnen&#8220; \u00f6ffnet die Logdatei direkt \u2014 auch nach einem Fehlerabbruch.<\/li>\n\n\n\n<li><strong>Fehlende Dateien werden als Fehler erkannt:<\/strong> Ist eine Datei laut Quellsystem vorhanden, wird sie beim Import aber nicht gefunden (MP3 oder Lyrics), erscheint das jetzt als <code>ERROR<\/code> statt unbemerkt zu bleiben. Der bewusste Blind-Import ohne Musik-Ordner bleibt eine Warnung.<\/li>\n\n\n\n<li><strong>Lyrics-Zuordnungen aus SqView werden bevorzugt:<\/strong> Explizite Song-zu-Lyrics-Verkn\u00fcpfungen aus SqView (marry-Tabelle) werden jetzt zuerst ausgewertet, bevor auf die namensbasierte Suche zur\u00fcckgegriffen wird. Damit bleiben manuell gepflegte Zuordnungen erhalten.<\/li>\n\n\n\n<li><strong>Logsprache folgt der gew\u00e4hlten Sprache:<\/strong> Das Detaillog wird in Deutsch oder Englisch geschrieben \u2014 je nach gew\u00e4hlter Sprache. Die Stufen-Kennungen <code>DONE<\/code>\/<code>WARNING<\/code>\/<code>ERROR<\/code> bleiben sprachunabh\u00e4ngig, damit das Log durchsuchbar bleibt.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">SqView-Import: vollst\u00e4ndigere und korrekte \u00dcbernahme<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gesamte Song-Bibliothek wird \u00fcbernommen:<\/strong> Bisher kamen nur Songs aus den aktuellen Listen und der Abspielhistorie an (~1000). Jetzt wird die komplette Song-Bibliothek der Quelle gehoben \u2014 inklusive aller Songs mit gesetzten Loop-Markern, die in keiner aktuellen Liste mehr standen. Songs, deren Audiodatei nicht mehr auffindbar ist, werden als Blind-Eintrag mit Fehler-Hinweis protokolliert und lassen sich sp\u00e4ter per Datei-Import aktivieren.<\/li>\n\n\n\n<li><strong>Korrekte Patter\/Singing-Einstufung:<\/strong> Die Einstufung als Patter, Singing oder beides hing vorher allein am Ordnernamen \u2014 dabei wurden ganze Ordner (z.B. \u201eSinging Calls&#8220;) falsch als Patter erkannt. Neue Regel: Sind Loop-Marker gesetzt, ist es ein Patter; ist ein Lyric vorhanden, wird der Singing-Marker gesetzt; der Ordnerpfad z\u00e4hlt nur noch als Indiz. Songs, die beides erf\u00fcllen, z\u00e4hlen automatisch zu Patter UND Singing. Ohne jedes Signal wird ein Song als Singing eingestuft.<\/li>\n\n\n\n<li><strong>Apostrophe in Titeln werden bereinigt:<\/strong> Songtitel mit Apostroph (z.B. \u201eAin&#8217;t Misbehaving&#8220;) wurden aus der Quelle mit einem Platzhalter-Sonderzeichen \u00fcbernommen. Diese werden beim Import jetzt automatisch in einen normalen Apostroph zur\u00fcckgewandelt. Das Auffinden der zugeh\u00f6rigen Audio- und Lyrics-Dateien funktioniert unabh\u00e4ngig von der Schreibweise.<\/li>\n\n\n\n<li><strong>Lyrics-Zuordnung aus der Quelle bevorzugt:<\/strong> Explizite Song-zu-Lyrics-Verkn\u00fcpfungen der Quelle werden zuerst genutzt; nur wenn keine vorliegt, greift die namensbasierte Suche.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.98 \u2014 Lyrics direkt in der App bearbeiten (2026-06-08)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Funktionen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lyrics-Editor im Lyrics-Dock:<\/strong> Die Lyrics k\u00f6nnen jetzt direkt in Callers Caddy bearbeitet werden \u2014 keine externe Word- oder Editor-Sitzung mehr n\u00f6tig. Ein neuer Stift-Button (\u270e) rechts in der Lyrics-Toolbar schaltet zwischen Anzeige- und Bearbeitungsmodus um. Alternativ aktiviert ein Doppelklick auf den Lyric-Text den Bearbeitungsmodus.<\/li>\n\n\n\n<li><strong>Volle Rich-Text-Bearbeitung:<\/strong> Im Edit-Modus erscheint eine zweite Toolbar mit allen wichtigen Formatierungen \u2014 Absatz-Format (Normal \/ \u00dcberschrift 1\u20133), Schriftgr\u00f6\u00dfe (6\u201396 pt), Fett, Kursiv, Unterstrichen, Schriftfarbe und Hintergrundfarbe (Markierung). Damit lassen sich Tag-, Break- und Closer-Zeilen so hervorheben wie man es im Live-Betrieb sehen m\u00f6chte.<\/li>\n\n\n\n<li><strong>HTML als einheitliches Zielformat:<\/strong> Beim Speichern wird die Datei immer als HTML abgelegt. HTML deckt alle Anforderungen (\u00dcberschriften, Auszeichnungen, Schriftgr\u00f6\u00dfen, Farben, Hintergrundfarben) verlustfrei ab und ist von jedem Browser oder Editor weiter bearbeitbar.<\/li>\n\n\n\n<li><strong>Original-Dateien bleiben unangetastet:<\/strong> RTF- und TXT-Lyrics werden beim Bearbeiten NIE \u00fcberschrieben. Stattdessen legt Callers Caddy eine neue <code>.html<\/code>-Datei neben das Original und zieht den <code>lyrics_file<\/code>-Eintrag des Songs auf die neue Datei um. Das Original bleibt als Sicherung im Lyrics-Ordner liegen. Eine kurze Info-Meldung weist nach dem ersten Speichern darauf hin.<\/li>\n\n\n\n<li><strong>HTML-Originale werden mit Backup \u00fcberschrieben:<\/strong> Beim ersten Speichern einer HTML-Lyrics-Datei wird automatisch eine <code>.bak<\/code>-Sicherung der Originaldatei daneben angelegt \u2014 falls man die alte Fassung sp\u00e4ter noch braucht.<\/li>\n\n\n\n<li><strong>Tastatur-Shortcuts:<\/strong> <code>Strg+S<\/code> speichert und verl\u00e4sst den Edit-Modus, <code>Esc<\/code> verwirft die \u00c4nderungen (mit R\u00fcckfrage, falls etwas ge\u00e4ndert wurde).<\/li>\n\n\n\n<li><strong>Sicherheit beim Songwechsel:<\/strong> Wer den Song wechselt w\u00e4hrend Lyrics noch ungespeichert bearbeitet werden, bekommt eine R\u00fcckfrage \u201e\u00c4nderungen verwerfen?&#8220; \u2014 versehentlicher Verlust wird damit ausgeschlossen.<\/li>\n\n\n\n<li><strong>Schriftgr\u00f6\u00dfe wirkt sofort sichtbar:<\/strong> Wer im Edit-Modus die Schriftgr\u00f6\u00dfe \u00fcber das Spinbox-Feld \u00e4ndert (Pfeiltasten oder Eingabe), sieht die \u00c4nderung live im Text. Ohne Selektion wirkt die neue Gr\u00f6\u00dfe auf das ganze Dokument, mit Selektion nur auf den markierten Bereich.<\/li>\n\n\n\n<li><strong>Per-Wort-Schriftgr\u00f6\u00dfen bleiben in der Anzeige erhalten:<\/strong> Ein bewusst gr\u00f6\u00dfer gesetztes Wort (z.B. eine besonders zu betonende Stelle im Lyric) bleibt nach dem Speichern auch in der Lyrics-Anzeige sichtbar gr\u00f6\u00dfer. Vorher wurden Schriftgr\u00f6\u00dfen-Angaben beim Anzeigen vereinheitlicht \u2014 jetzt nicht mehr.<\/li>\n\n\n\n<li><strong>Zoom und Auto-Width skalieren das ganze Dokument proportional:<\/strong> Auch wenn einzelne W\u00f6rter unterschiedliche Schriftgr\u00f6\u00dfen haben, skalieren Zoom-Buttons und Auto-Width das gesamte Dokument verh\u00e4ltnistreu \u2014 der Gr\u00f6\u00dfenunterschied zwischen markierten und normalen Stellen bleibt bei jeder Anzeige-Gr\u00f6\u00dfe erhalten.<\/li>\n\n\n\n<li><strong>Auto-Modi sinnvoll im Edit-Mode:<\/strong> Auto-Scroll und Auto-Size sind w\u00e4hrend des Bearbeitens deaktiviert (w\u00fcrden den Cursor verschieben bzw. die Schrift beim Tippen springen lassen). Auto-Width und manueller Zoom bleiben verf\u00fcgbar \u2014 sie \u00e4ndern nur die Anzeige, nicht die gespeicherten Gr\u00f6\u00dfen. Nach dem Speichern werden alle Modi wieder aktiv.<\/li>\n\n\n\n<li><strong>Icons in allen Skins:<\/strong> Die neuen Toolbar-Buttons (Stift, Speichern, B\/I\/U, Schrift-\/Hintergrundfarbe, Verwerfen) liegen als SVG-Icons in jedem der vier mitgelieferten Skins (Default, Elegant, Light, Win11). Die Icons folgen dem etablierten Skin-Pattern und passen sich an das gew\u00e4hlte Theme an.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.97 \u2014 Pitch-Wechsel ohne Leiern, eigener Timer-Sound und Label im Player (2026-06-03)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Funktionen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Eigener Sound bei Timer-\u00dcberzug (BL-137):<\/strong> Statt des System-Pieps kann beim \u00dcberschreiten der Pattern-\/Singing-Zeit jetzt eine MP3 oder WAV abgespielt werden \u2014 z.B. das ber\u00fchmte Esel-Ger\u00e4usch eines Caller-Kollegen. Der Sound wird in den laufenden Audio-Stream eingemischt (gleicher Output, gleiches Ger\u00e4t, kein zweiter Stream) und st\u00f6rt die Musik nicht. Konfiguriert \u00fcber Einstellungen \u2192 Audio: \u201eHinweis-Sound (Timer-\u00dcberzug)&#8220; mit Datei-Picker und eigenem Lautst\u00e4rke-Schieberegler. Wenn kein Pfad gesetzt ist, bleibt der bisherige Doppel-Beep aktiv. Alternativ kann der Sound auch pro Rule individuell mitgegeben werden (Parameter <code>sound<\/code> in der <code>system_ping<\/code>-Aktion) \u2014 damit lassen sich Pattern und Singing mit unterschiedlichen T\u00f6nen unterscheiden.<\/li>\n\n\n\n<li><strong>Neue Rule-Aktion \u201eSound abspielen&#8220;:<\/strong> Im Rule-Editor erscheint in der Gruppe \u201eInfo &amp; Warnings&#8220; direkt \u00fcber \u201eSystem Ping (Beep)&#8220; die neue Aktion. \u00dcber einen Datei-Picker w\u00e4hlt man eine Audiodatei, die Lautst\u00e4rke ist pro Rule einstellbar. Die Datei wird in den laufenden Stream eingemischt \u2014 kein zweiter Kanal, kein Aussetzer im Hauptsong.<\/li>\n\n\n\n<li><strong>Plattenlabel im Player (BL-138):<\/strong> Das Plattenlabel des aktuell gespielten Songs (z.B. \u201eDGR 014&#8243;) wird jetzt rechts oben im Player direkt \u00fcber dem Status angezeigt \u2014 gleiche Schrift, kein Zusatzabstand. Wird ausgeblendet wenn kein Label gepflegt ist.<\/li>\n\n\n\n<li><strong>Rules im Loop-Finder-Vorh\u00f6ren pausiert:<\/strong> W\u00e4hrend des Vorh\u00f6rens im Loop-Finder (Audition) werden alle Rules komplett deaktiviert. Damit springt Auto-Advance oder andere song_stopped-Rules beim Ende der Audition nicht mehr an. Nach dem Beenden der Audition laufen Rules wieder normal. Technisch \u00fcber eine zentrale suspend\/resume-Mechanik in der Rule-Engine gel\u00f6st \u2014 wiederverwendbar f\u00fcr zuk\u00fcnftige Vorh\u00f6r-Funktionen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen f\u00fcr den Live-Betrieb<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pitch-Slider reagiert jetzt sofort:<\/strong> Wer den Pitch-Slider w\u00e4hrend der Wiedergabe verschoben hat, h\u00f6rte die neue Tonh\u00f6he bisher erst nach mehreren Sekunden \u2014 und in der \u00dcbergangsphase \u201eleierte&#8220; das Tempo h\u00f6rbar (ca. 20 % Schwankung \u00fcber 4 Sekunden). Die Audio-Engine setzt das Resampling jetzt hinter den WSOLA-Stretcher (SoundTouch-Architektur f\u00fcr rate &gt; 1), womit Pitch-\u00c4nderungen binnen weniger Millisekunden am Lautsprecher h\u00f6rbar sind und das Tempo durch den Wechsel praktisch nicht mehr aus dem Tritt kommt. Tempo-Slider (<code>set_today_tempo<\/code>, <code>set_tempo<\/code>) bleibt unver\u00e4ndert nach AR-021-Pattern. Messtechnisch: Tr\u00e4ger-Einschwingzeit von &gt;3000 ms auf 6 ms, RMS-Abweichung von 188 Hz auf 0,77 Hz.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Unter der Haube<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PitchShifter komplett \u00fcberarbeitet:<\/strong> Statt blockweisem FFT-Resampling jetzt ein stateful Cubic-Hermite-Interpolator (Catmull-Rom, 4-Punkt-Kernel) mit fraktionaler Lese-Position und 3-Sample-Tail \u00fcber Aufrufe hinweg. Pitch-Wechsel zur Laufzeit erfolgen ohne Reset\/Flush, nur der Ratio-Parameter wird gewechselt \u2014 analog zu SoundTouch&#8217;s RateTransposer.<\/li>\n\n\n\n<li><strong>Pipeline-Reihenfolge:<\/strong> Stretcher bekommt jetzt Original-Audio (vorher: pre-resampletes Audio im 5-Sekunden-Puffer, das beim Pitch-Wechsel mit dem neuen Tempo-Parameter kollidierte). Resampling l\u00e4uft im Audio-Callback hinter <code>stretcher.retrieve<\/code>, mit Carry-Buffer f\u00fcr variable Output-L\u00e4ngen.<\/li>\n\n\n\n<li><strong>Diagnose-Capture:<\/strong> Neue Engine-Methoden <code>start_output_capture<\/code> \/ <code>stop_output_capture<\/code> f\u00fcr Diagnose-Tools. Im Normalbetrieb ein einziger <code>is None<\/code>-Check pro Callback, keine Performance-Auswirkung. Test-Tools in <code>1_Source\/src\/tools\/pitch_transition_test.py<\/code> und <code>pitch_transition_analyze.py<\/code> f\u00fcr AM-modulierte Sinus-Messungen (Tr\u00e4ger zeigt Pitch, H\u00fcllkurve zeigt Tempo via Nulldurchgang-Analyse).<\/li>\n\n\n\n<li><strong>Rule-Engine Suspend\/Resume:<\/strong> Neue API <code>rule_engine.suspend(reason)<\/code> \/ <code>rule_engine.resume(reason)<\/code> und Kontext-Manager <code>with rule_engine.suspended(\"xy\"):<\/code>. Counter-basiert, verschachtelbar \u2014 mehrere gleichzeitige Suspend-Aufrufe heben sich erst dann auf wenn alle resume() gerufen wurden. W\u00e4hrend des Suspends werden alle Trigger (au\u00dfer <code>play_timer<\/code>) im rules.log als <code>SUSPENDED<\/code> protokolliert.<\/li>\n\n\n\n<li><strong>Einstellungen-Dialog (BL-129): neue Felder erscheinen automatisch.<\/strong> Der Dialog enumeriert jetzt nicht nur vorhandene INI-Keys, sondern auch alle Keys aus <code>SETTINGS_META<\/code> \u2014 auch wenn sie noch nie geschrieben wurden. Neuer Widget-Typ <code>file<\/code> f\u00fcr Datei-Picker (mit konfigurierbarem Audio-Filter).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.96 \u2014 Sequenzen verwalten und vereinheitlichter Import (2026-06-01)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Funktionen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Universeller Sequenz-Import (BL-098):<\/strong> Ein neuer Men\u00fcpunkt \u201eSequenzen \u2192 Sequenzen importieren\u2026&#8220; ersetzt die vier bisherigen Import-Wege (MDB, JSON, CSDS, Freitext). Du w\u00e4hlst einfach die Datei, der Dialog erkennt das Format automatisch (Datei-Endung + Inhalts-Stichprobe), zeigt eine Live-Vorschau der ersten drei Sequenzen und meldet, wie viele S\u00e4tze erkannt wurden. Format kann bei Bedarf manuell \u00fcberschrieben werden. Multi-Datei-Auswahl funktioniert f\u00fcr JSON, CSDS und Freitext \u2014 alle Dateien werden in einem Rutsch verarbeitet. Die alten Einzeleintr\u00e4ge sind aus dem Men\u00fc verschwunden; die zugrunde liegenden Routinen bleiben bis 1.8.2026 als Sicherheitsnetz erhalten (BL-135).<\/li>\n\n\n\n<li><strong>Freitext-Format mit drei Schreibweisen:<\/strong> Der Freitext-Parser versteht jetzt (1) eine Sequenz pro Zeile mit Komma-getrennten Calls, (2) ein Call pro Zeile mit Leerzeile als Trenner zwischen Sequenzen, (3) wie 2 aber mit <code>,<\/code> oder <code>;<\/code> am Zeilenende. Zus\u00e4tzlich werden Ceder-Webseiten-Header (<code>... ID=&lt;nummer&gt; Print<\/code>) als Sequenz-Trenner erkannt \u2014 du kannst die Choreo-Datenbank-Sammlungen also direkt copy-pasten und importieren.<\/li>\n\n\n\n<li><strong>Bulk-Werte oder aus der Datei (Typ + Schwierigkeit):<\/strong> Bei JSON- und CSDS-Importen, die Typ und Schwierigkeit pro Sequenz mitliefern, kannst du pro Feld w\u00e4hlen: entweder der im Dialog gesetzte Bulk-Wert f\u00fcr alle Sequenzen, oder die Werte aus der Datei (mit Bulk als Fallback wenn die Datei f\u00fcr eine einzelne Sequenz nichts mitbringt).<\/li>\n\n\n\n<li><strong>Duplikat-Erkennung beim Import:<\/strong> Vor dem Schreiben pr\u00fcft der Importer per 15-Feld-Vergleich, ob die Sequenz schon in der Datenbank steht oder zweimal in den ausgew\u00e4hlten Dateien vorkommt. Default-m\u00e4\u00dfig aktiviert; die Status-Zeile meldet \u201eX erkannt \u2014 Y neu, Z Duplikate&#8220;. Spart das nachtr\u00e4gliche Aufr\u00e4umen \u00fcber den Deduplikat-Dialog.<\/li>\n\n\n\n<li><strong>Sequenzen l\u00f6schen (BL-136):<\/strong> Rechtsklick auf eine Sequenz in der Sequenz-Liste \u2192 \u201eL\u00f6schen&#8220;. Mehrere markieren (Strg-\/Shift-Klick) und gemeinsam l\u00f6schen geht ebenfalls \u2014 entweder per Rechtsklick-Men\u00fc oder \u00fcber den neuen \u201eL\u00f6schen&#8220;-Button unter der Tabelle. Im Detail-Fenster (SequenzView) gibt es zus\u00e4tzlich einen L\u00f6schen-Button in der Navigations-Leiste; nach dem L\u00f6schen r\u00fcckt automatisch die n\u00e4chste Sequenz aus der gefilterten Liste nach. Jede L\u00f6schung fragt vor dem Vollzug nach, mit Singular- oder Plural-Text je nach Auswahl.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen f\u00fcr den Live-Betrieb<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lyrics passen sich nach Songwechsel automatisch an:<\/strong> Wer \u201eAuto-Gr\u00f6\u00dfe&#8220; oder \u201eAuto-Breite&#8220; im Lyrics-Fenster aktiv hat, sah bisher beim Songwechsel die neue Datei nur in Basis-Schriftgr\u00f6\u00dfe \u2014 der Refit fand schlicht nicht statt. Beide Modi sind jetzt persistente Schalter, die sich gegenseitig ausschlie\u00dfen, und werden bei jedem neuen Song erneut ausgel\u00f6st. Der Refit-Zeitpunkt h\u00e4ngt ab sofort am tats\u00e4chlichen Layout-Ende des Textbrowsers (statt an einer festen 50-ms-Verz\u00f6gerung), damit auch langsam ladende HTML- oder RTF-Dateien sauber skaliert werden.<\/li>\n\n\n\n<li><strong>Shift-\/Strg-Klick \u00f6ffnet den SequenzView nicht mehr:<\/strong> Wer in der Sequenz-Liste mit Mehrfach-Klick eine Auswahl aufbaut, bekam bei jedem Klick die Detail-Ansicht neu aufgerufen \u2014 st\u00f6rte beim Markieren. Jetzt: nur der einfache Klick (ohne Modifier) wechselt das Detail-Fenster.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.95 \u2014 Bessere Diagnose bei Audio-Problemen (2026-06-01)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Geladene Songs im Perf-Log:<\/strong> Bei jedem Song-Wechsel wird jetzt eine Diagnose-Zeile mit Dateinamen, vollem Pfad, Samplerate, Kan\u00e4len und Dauer geschrieben. Damit l\u00e4sst sich im Problemfall (Aussetzer, Klangst\u00f6rung, Stream-Reopen) sofort nachvollziehen, welche Datei genau in dem Moment lief \u2014 vorher musste man das umst\u00e4ndlich aus der Spielhistorie rekonstruieren. F\u00fcr den Live-Betrieb komplett unsichtbar; sp\u00fcrbar nur bei sp\u00e4terer Fehlersuche.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.94 \u2014 Tempo- und Pitch-Wechsel ohne Ruckler (2026-05-31)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen f\u00fcr den Live-Betrieb<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tempo-Wechsel klingen jetzt sauber durch (AR-021).<\/strong> Wer am Tempo- oder Pitch-Regler dreht, h\u00f6rt keinen kurzen Aussetzer mehr und das Lied bleibt exakt an der Stelle, an der es gerade war. Besonders relevant f\u00fcr \u201eHotHash&#8220;-Situationen, in denen das Tempo schrittweise erh\u00f6ht wird \u2014 jeder einzelne Klick f\u00fchrt jetzt zu einem nahtlosen \u00dcbergang statt zu einem h\u00f6rbaren Sprung. Gilt f\u00fcr alle drei Eingabewege: Song-Tempo (das in der DB gespeichert wird), Heutiges Tempo (Session-Faktor) und Pitch.<\/li>\n\n\n\n<li><strong>Etwas Reaktions-Latenz beim Tempo-Wechsel:<\/strong> Bis das neue Tempo h\u00f6rbar einsetzt, l\u00e4uft noch bis zu eine knappe Sekunde im alten Tempo weiter. Das ist der Audio-Vorrats-Puffer, der seit v0.93 f\u00fcr die generelle Aussetzer-Freiheit zust\u00e4ndig ist \u2014 wir lassen ihn bewusst in Ruhe, weil jeder Eingriff genau die Ruckler erzeugen w\u00fcrde, die wir vermeiden wollen. In der Praxis hei\u00dft das: zwischen zwei Tempo-Klicks lieber ein kleines bisschen Pause lassen, dann h\u00f6rt man jeden Schritt sauber.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.93 \u2014 WSOLA-Stretcher entkoppelt: Knistern bei niedriger Latenz behoben (2026-05-31)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Performance \/ Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>WSOLA-Passthrough bei Tempo 1.0 (AR-020 Fix A):<\/strong> Bisher lief die teure Coarse-to-Fine-Kreuzkorrelation in <code>time_stretcher.py<\/code> <strong>auch<\/strong> wenn der Tempo-Regler auf 1.0 stand. Bei COLA-konformen Hann-Fenstern mit 50 % Overlap und ana_hop == syn_hop ist die nominale Position aber mathematisch bereits exakt \u2014 die Korrelation liefert sowieso nur das nominale Ergebnis zur\u00fcck. Auf einem Celeron N3450 kostete diese unn\u00f6tige Suche bis zu 15 ms Lock-Hold pro Hop und wurde unter WDM-KS bei 11 ms Hardware-Latenz als Knistern h\u00f6rbar. Jetzt: bei Tempo == 1.0 wird die Korrelation komplett \u00fcbersprungen.<\/li>\n\n\n\n<li><strong>PREPROCESS_OUTPUT_SECONDS 0.25 \u2192 1.0 (AR-020 Fix B):<\/strong> Der Stretcher-Output-Buffer wird jetzt auf 1 s statt 250 ms Soll-Stand gehalten. Damit werden auch maximale Hop-Berechnungs-Spitzen (z. B. bei Tempo-Drag) absorbiert, bevor sie den Hardware-Buffer treffen k\u00f6nnen. Vorher: Buffer pendelte 232\u2013325 ms mit periodischem Dip auf 209 ms \u2192 23 ms Reserve unter WDM-KS. Nachher: Buffer pendelt 998\u20131091 ms \u2192 ~1 s Reserve \u00fcber alle Hostapis.<\/li>\n\n\n\n<li><strong>Stretcher mit zwei Locks (AR-020 Fix C):<\/strong> <code>time_stretcher.py<\/code> hatte einen einzigen Lock, den <code>preprocess()<\/code> w\u00e4hrend der gesamten teuren Hop-Berechnung gehalten hat. Der Audio-Callback wartete im <code>retrieve()<\/code> auf denselben Lock \u2014 selbst wenn er nur Output-Frames lesen wollte. Jetzt sch\u00fctzt ein zweiter, schmaler <code>_out_lock<\/code> ausschlie\u00dflich den Output-Buffer; <code>retrieve()<\/code> wartet h\u00f6chstens auf das kurze Append eines fertigen Hops, nicht mehr auf die WSOLA-Berechnung selbst.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Diagnose<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stretcher-Stats-Zeile alle 5 s:<\/strong> Neue <code>[Diag] Stretcher-Stats<\/code>-Zeile direkt unter jedem <code>[AudioBuf]<\/code>-Eintrag im Perf-Log. Format: <code>hops=N passthrough=N (X%) correlation=N lock_hold_ms avg=X.XX max=X.XX<\/code>. Zeigt damit auf einen Blick: ob Fix A greift (Passthrough-Anteil), wie teuer die Hop-Berechnung tats\u00e4chlich ist (Lock-Hold-Zeiten), und wann der User am Tempo war (Correlation &gt; 0).<\/li>\n\n\n\n<li><strong>Lock-Hold-Messung:<\/strong> Jeder Hop wird in <code>time_stretcher.preprocess()<\/code> via <code>time.monotonic_ns()<\/code> umrahmt \u2014 die Statistik liefert Avg + Max pro 5-s-Fenster.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hintergrund<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Thorstens v0.92-Trace 2026-05-31 (perf_24\u201327) zeigte: WDM-KS messtechnisch perfekt (0 XRuns, hw_default=44100 Hz, distinct=1 im Frame-Histogramm), aber h\u00f6rbares Knistern wie Kabelbruch. AR-020 Mechanismus (a) und (c) damit definitiv widerlegt. Code-Review im Stretcher: <code>min10s=209 ms<\/code> exakt konstant entspricht ~2 Callback-Blocks unter dem 250-ms-Soll \u2192 der Feeder konnte einzelne Ticks nicht rechtzeitig liefern, weil der einzige Lock von der teuren Hop-Berechnung gehalten wurde. Die drei Fixes adressieren genau diese Engstelle.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.92 \u2014 Audio-Diagnose: Sample-Rate-Mismatch und Callback-Frame-Histogramm (2026-05-30)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Logs &amp; Diagnose<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hardware-Sample-Rate im Stream-Diag-Log (AR-020 T1):<\/strong> Sowohl <code>[Diag] Stream-Init Versuch<\/code> als auch <code>[Diag] Stream gestartet<\/code> zeigen jetzt zus\u00e4tzlich <code>hw_default=XHz<\/code> \u2014 die native Sample-Rate des Audio-Devices. Wenn das nicht zu unserer angeforderten Rate (44100 Hz) passt, \u00fcbernimmt der Treiber Resampling \u2014 auf manchen Hostapi\/Codec-Kombinationen (WDM-KS + Realtek HD ist bekannt) ist die Qualit\u00e4t schlecht und als \u201ekomischer Klang&#8220;\/\u201eGeschwindigkeitsfluktuation&#8220; h\u00f6rbar, ohne dass es zu Buffer-Underruns kommt. Wenn <code>hw_default \u2260 angeforderte SR<\/code>, erscheint zus\u00e4tzlich ein deutlicher <code>\u26a0 SR-MISMATCH (wir fordern NHz)<\/code>-Marker direkt in der Versuchs-Zeile.<\/li>\n\n\n\n<li><strong>Callback-Frame-Count-Histogramm (AR-020 T1):<\/strong> Pro Stream werden die ersten 200 Aufrufe des PortAudio-Callbacks gez\u00e4hlt und einmalig als kompaktes Histogramm geloggt: <code>[Diag] Callback-frames-Histogramm (erste 200): min=1024 max=1024 distinct=1 | top: 1024\u00d7200 (100%)<\/code>. Liefert der Treiber konstante Block-Gr\u00f6\u00dfen, steht <code>distinct=1<\/code> \u2014 schwankt er (Verdacht WDM-KS), sieht man die Verteilung sofort. Das Sampling ist ein billiger <code>list.append<\/code> pro Callback, kein Lock, kein I\/O.<\/li>\n\n\n\n<li><strong>Hintergrund:<\/strong> Thorstens Test 2026-05-30 (perf_log_22, T-Lap, WDM-KS) zeigte 4 min <code>xRuns=0<\/code> bei perfektem Buffer \u2014 trotzdem h\u00f6rbare Pitch-Wackler und Vinyl-artige St\u00f6rger\u00e4usche. Der direkt anschlie\u00dfende MME-Test (perf_log_23) klang sauber. Die neuen zwei Diag-Zeilen kl\u00e4ren in einem einzigen Trace, ob Sample-Rate-Mismatch (Mechanismus a) oder Frame-Count-Schwankung (Mechanismus c) die Ursache ist.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.91 \u2014 Fade-Out-Stottern behoben, neuer logs\/-Ordner (2026-05-30)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Performance \/ Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Fade-Out vektorisiert (AR-018):<\/strong> Der Fade-Out-Block im PortAudio-Callback (<code>audio_engine.py<\/code>) enthielt eine Python-<code>for<\/code>-Schleife \u00fcber 1024 Samples pro Audio-Block. Auf schwacher Hardware (Thorstens Celeron N3450) verursachte das h\u00f6rbares Stottern beim Fade-Out, weil ~4\u201310 % der Block-Zeit nur f\u00fcr die Fade-Logik draufgingen und der GIL die ganze Schleife lang gehalten wurde. Ersetzt durch NumPy-Array-Multiplikation (1 Aufruf statt 1024 Iterationen). Faktor 100\u2013500\u00d7 Speedup, Fade-Out l\u00e4uft jetzt glatt auch auf schwacher CPU.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Logs &amp; Diagnose<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Diagnose-Center (Hilfe \u2192 Diagnose-Center\u2026):<\/strong> Neues Fenster mit eingebauten Tests, das dem Entwickler bei Aussetzer-Problemen die n\u00f6tigen Daten liefert \u2014 ohne dass du externe Tools installieren musst. Jeder Test erkl\u00e4rt vorher in Klartext was er misst und was du tun sollst. Verf\u00fcgbare Tests:<\/li>\n\n\n\n<li><strong>A \u2014 System-Snapshot:<\/strong> Eckdaten Windows\/CPU\/RAM\/Audio-Ger\u00e4te\/Backends, Callers-Caddy-Version, INI-Inhalt.<\/li>\n\n\n\n<li><strong>D \u2014 QTimer-Inventur:<\/strong> listet alle aktiven Timer im Programm \u2014 hilft beim Aufsp\u00fcren periodischer Aussetzer.<\/li>\n\n\n\n<li><strong>F \u2014 Externe-Last-Sampling (60 s):<\/strong> pr\u00fcft welche anderen Programme w\u00e4hrend der Wiedergabe CPU brauchen (Antivirus, Cloud-Sync, Treiber-Services).<\/li>\n\n\n\n<li><strong>G \u2014 Stall-Sentinel:<\/strong> zeigt Stand der dauerhaften Hintergrund-\u00dcberwachung von Main-Thread-Blockaden w\u00e4hrend der Wiedergabe.<\/li>\n\n\n\n<li><strong>H \u2014 Bundle \u201eSenden an Entwickler&#8220;:<\/strong> packt die letzten Logs in eine ZIP zum Mailen.<\/li>\n\n\n\n<li><strong>B\/C\/E \u2014 Audio-Tests (in Vorbereitung):<\/strong> Stille-Wiedergabe, Hostapi-Vergleich, Fade-Out-Stress kommen mit v0.92.<\/li>\n\n\n\n<li><strong>Zentraler logs\/-Ordner:<\/strong> Alle Logs landen jetzt in <code>&lt;app_dir&gt;\/logs\/<\/code>. Damit bleibt das Hauptverzeichnis aufger\u00e4umt, und Diagnose-Daten sind an <em>einer<\/em> Stelle:<\/li>\n\n\n\n<li><code>logs\/perf\/perf_YYYY-MM-DD_HH-MM-SS.txt<\/code> \u2014 Perflog mit Zeitstempel pro Sitzung (vorher fester Name <code>perf_log.txt<\/code>, jeder Start \u00fcberschrieb den letzten). Automatische Rotation: nur die j\u00fcngsten 20 Sitzungen werden behalten.<\/li>\n\n\n\n<li><code>logs\/crashes\/crash_*.log<\/code> \u2014 Crash-Logs (vorher im Root)<\/li>\n\n\n\n<li><code>logs\/rules.log<\/code> \u2014 Rules-Engine-Log (vorher unter <code>rules\/<\/code>, dort liegen jetzt nur noch die User-Rules-JSONs)<\/li>\n\n\n\n<li><code>logs\/system_report.txt<\/code> \u2014 Systembericht (vorher im Root)<\/li>\n\n\n\n<li><strong>Automatische Migration beim ersten Start v0.91:<\/strong> Vorhandene <code>perf_log.txt<\/code>, <code>crash_*.log<\/code>, <code>rules\/rules.log<\/code> und <code>system_report.txt<\/code> werden einmalig in die neue Struktur verschoben.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.90 \u2014 Sequenz-Editor &amp; Sequenz-Limit pro Tanzprogramm (2026-05-27)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sequenz-Editor (BL-015):<\/strong> Neues Fenster \u201eSequenzen \u2192 Sequenz-Editor\u2026&#8220; zum Erstellen und Bearbeiten von Sequenzen. Kopfbereich mit Typ (Pflichtfeld) und Schwierigkeit (vorbef\u00fcllte, editierbare Dropdowns), darunter ein Eingabefeld mit <strong>einem Call pro Zeile<\/strong>. Buttons: \u201e+ Neu&#8220;, \u201eSpeichern&#8220;, \u201eAuf Duplikate pr\u00fcfen&#8220; (warnt, wenn die Eingabe bereits existiert) und \u201eSchlie\u00dfen&#8220;. Limit von 15 Calls wird live angezeigt und beim Speichern erzwungen. Bekannte Calls werden <strong>gr\u00fcn<\/strong> markiert (gemappt oder exakter Treffer); ein <strong>Doppelklick<\/strong> auf eine nicht-gr\u00fcne Zeile \u00f6ffnet einen schlanken Zuordnungs-Dialog mit durchsuchbarer Call-Auswahl (Matcher-Vorschlag vorausgew\u00e4hlt). Exakte Treffer werden beim Speichern automatisch gemappt, damit das Level berechnet wird. Aus dem SequenzView f\u00fchrt ein \u270e-Button direkt zum Bearbeiten der angezeigten Sequenz. Nach dem Speichern wird die neue Sequenz garantiert sichtbar (Filter-Reset + Auswahl).<\/li>\n\n\n\n<li><strong>Sequenz-Limit pro Tanzprogramm (BL-132):<\/strong> Im Tanzprogramm-Manager kann pro Programm ein \u201eSequenz-Limit&#8220; hinterlegt werden \u2014 ein beliebiger Call aus der Teaching Order (inkl. Programm-Separatoren wie \u201e&#8211; Mainstream &#8211;&#8222;). Beim Programmwechsel (Lokation laden oder manuell im Player) setzt der Sequenzen-Filter automatisch auf diesen Call. Jeder Caller definiert die Grenze einmalig selbst \u2014 wer auf MS wechselt, sieht nur MS-Sequenzen, wer auf A2 wechselt nur A2. Opt-out in Einstellungen \u2192 Sequenzen \u2192 \u201eFilter automatisch auf Tanzprogramm setzen&#8220;.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.89 \u2014 Mausrad-Schutz, Feedback-Suppress, Call-Mapping Bulk-Confirm, Quality\/ERR per Kontextmenue (2026-05-27)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kontextmenue Quality\/ERR \u00b11 (BL-127):<\/strong> Songliste, Playlist und Statistik-Dock (TOP\/FLOP\/Nie) zeigen im Rechtsklick-Menue vier neue Eintraege: Qualitaet +1\/\u22121 und ERR +1\/\u22121. Jeder Eintrag zeigt den alten und neuen Wert in der Form <code>[5&gt;6]<\/code>. Am Wertebereichs-Rand (Quality 0\/10, ERR 0\/4) wird die jeweilige Aktion deaktiviert. Aenderungen werden sofort in die DB geschrieben; das Song-Daten-Dock synchronisiert sich live, wenn es denselben Song zeigt.<\/li>\n\n\n\n<li><strong>Feedback-Dialog: Session-Suppression:<\/strong> Neue Checkbox \u201eIn dieser Sitzung nicht mehr fragen&#8220; zwischen Notiz-Feld und Buttons. Bei Haken wird das Auto-Feedback-Fenster fuer den Rest der Sitzung unterdrueckt \u2014 unabhaengig davon, ob \u201eUebernehmen&#8220; oder \u201eAbbrechen&#8220; gedrueckt wird. Wirkt sowohl beim manuellen Feedback-Aufruf als auch beim automatischen Popup nach Songende. INI-Standard bleibt unangetastet und greift beim naechsten App-Start wieder.<\/li>\n\n\n\n<li><strong>Call-Mapping: Bulk-Confirm:<\/strong> Im Call-Mapping-Dialog koennen jetzt mehrere Zeilen markiert (Ctrl\/Shift+Klick, Ctrl+A) und per Button \u201eAuswahl bestaetigen&#8220; gemeinsam in die DB geschrieben werden. Quelle wird auf <code>manual<\/code> gesetzt, Tabelle wird automatisch aus der DB neu geladen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mausrad-Schutz fluechendeckend:<\/strong> Im Song-Daten-Dock, Player (inkl. Volume- und Position-Slider) und im Einstellungen-Dialog ignorieren SpinBoxes, ComboBoxes, DateEdits und Slider Mausrad-Events. Versehentliches Scrollen ueber Feldern aendert keine Werte mehr. Im Einstellungs-Dialog gilt der Schutz fenster-weit \u2014 auch zukuenftig hinzugefuegte Felder sind automatisch geschuetzt.<\/li>\n\n\n\n<li><strong>Menue \u201eAllgemeine Einstellungen&#8220;:<\/strong> Der Einstellungen-Dialog-Aufruf liegt jetzt im Menue \u201eEinstellungen&#8220; (bisher unter \u201eApp&#8220;) und heisst \u201eAllgemeine Einstellungen\u2026&#8220;. Shortcut <code>Strg+,<\/code> bleibt erhalten. Das App-Menue enthaelt nur noch \u201eBeenden&#8220;.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes \/ Diagnose<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stall-Detektor schweigt im Leerlauf:<\/strong> Der Main-Thread-Stall-Detektor (AR-F) meldet jetzt nur noch Blockaden waehrend ein Song laeuft. Bei Title-Bar-Drag oder Fenster-Resize entstehen durch Windows&#8216; modale Move-Loop scheinbare \u201eBlockaden&#8220;, die mit Audio-Aussetzern nichts zu tun haben \u2014 diese False Positives erscheinen jetzt nicht mehr im Perf-Log.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Aufgeraeumt<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Toten Translation-Key <code>menu_settings<\/code> entfernt (durch <code>menu_general_settings<\/code> ersetzt)<\/li>\n\n\n\n<li>Drei NoScroll-Subklassen im Settings-Dialog entfernt (durch fenster-weiten Event-Filter ersetzt)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.88 \u2014 Audition-Kanal + Einstellungen-Fenster + Anti-Ruckler (2026-05-26)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neues Feature: Audition-Kanal (BL-074)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Audition-Button<\/strong> im Player: schmaler Button rechts neben Play, liegt optisch \u00fcber Fade Out<\/li>\n\n\n\n<li>Song startet beim Dr\u00fccken von Audition von vorne auf dem <strong>sekund\u00e4ren Ausgang<\/strong> (exklusiv \u2014 kein zweiter Stream)<\/li>\n\n\n\n<li>Kein History-Eintrag bei Audition; Rules werden nicht gefeuert<\/li>\n\n\n\n<li>Stop \/ Play \/ Song-Ende beenden Audition und stellen automatisch den Prim\u00e4rkanal wieder her<\/li>\n\n\n\n<li><strong>Prim\u00e4rer \/ Sekund\u00e4rer Ausgang<\/strong> jetzt getrennte INI-Keys (<code>audio\/primary_device<\/code>, <code>audio\/secondary_device<\/code>) mit eigener Lautst\u00e4rke (<code>audio\/secondary_volume<\/code>, Default 80 %)<\/li>\n\n\n\n<li>Beide Ger\u00e4te-Dropdowns erscheinen im Einstellungen-Dialog (Audio-Sektion)<\/li>\n\n\n\n<li><strong>Migration:<\/strong> <code>audio\/output_device<\/code> \u2192 <code>audio\/primary_device<\/code> l\u00e4uft einmalig automatisch<\/li>\n\n\n\n<li><strong>Bugfix:<\/strong> WASAPI-Fallback-Cache in <code>AudioEngine<\/code> \u2014 wenn ein Ger\u00e4t beim Start auf System-Default zur\u00fcckf\u00e4llt, wird bei jedem Kanal-Wechsel (Audition \u2192 Prim\u00e4r) der Cache-Eintrag genutzt statt WASAPI erneut zu versuchen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Neues Feature: Einstellungen-Fenster (BL-129)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Fenster \u201eEinstellungen\u2026&#8220; im App-Men\u00fc (Shortcut <code>Strg+,<\/code>)<\/li>\n\n\n\n<li>Liest alle relevanten INI-Sektionen generisch aus und stellt sie in Tabs dar<\/li>\n\n\n\n<li>Automatische Widget-Auswahl je nach Wert-Typ: Checkbox, SpinBox, DoubleSpinBox, Pfad-Button, ComboBox, DateEdit, LineEdit<\/li>\n\n\n\n<li><code>SETTINGS_META<\/code>-Registrierungstabelle f\u00fcr bekannte Keys mit Labels, Tooltips, Wertebereichen und ComboBox-Optionen (Skin-Liste, Sprachen)<\/li>\n\n\n\n<li>Tabs: Anzeige, Pfade, Audio, Loop, Player, Playlist, Feedback, Sequenzen, Notizen, Lyrics, Debug, Rules (System)<\/li>\n\n\n\n<li>Buttons: OK \/ Abbrechen \/ \u00dcbernehmen<\/li>\n\n\n\n<li>Hinweis-Dialog wenn neustart-pflichtige Keys ge\u00e4ndert wurden (Skin, Sprache, Debug, Audio-Flags)<\/li>\n\n\n\n<li>Live-Apply wo m\u00f6glich: Zoom (Sequenzen\/Lyrics\/Notizen), Mindest-Lautst\u00e4rke, Loop-Crossfade, Statusleisten-Player, Musikpfade<\/li>\n\n\n\n<li>Ausgeschlossen: <code>[General]<\/code>, <code>[Tutorials]<\/code>, <code>[custom-filter]<\/code>, alle <code>*_dock<\/code>-Sektionen<\/li>\n\n\n\n<li>Neue <code>settings_dialog.py<\/code> \u2014 standalone, kein Aufbl\u00e4hen von main.py<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-Ruckler: Hostapi-Heuristik + Header-Latenz + Playlist-Refresh-Storm (AR-015 \/ AR-002)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>L1 \u2014 WDM-KS-first Heuristik:<\/strong> Beim Erststart (kein gespeichertes Ger\u00e4t) w\u00e4hlt die App automatisch das beste verf\u00fcgbare Audio-Backend: WDM-KS &gt; WASAPI Shared &gt; MME \u2014 DirectSound nie als Default. Hintergrund: Thorstens Hostapi-Matrix-Test 2026-05-26 (10 Sessions auf Celeron N3450) zeigt WDM-KS = 0 Ruckler, MME = 7\u201310, DirectSound = 15\u201325 pro 30-s-Session. Heuristik l\u00e4uft in <code>_setup_audio_device_combo()<\/code>, speichert das gew\u00e4hlte Ger\u00e4t sofort in INI und loggt <code>[Diag] Auto-Device-Heuristik (AR-015 L1)<\/code>.<\/li>\n\n\n\n<li><strong>L2 \u2014 Perf-Header beide Latenzen:<\/strong> <code>[Sys]<\/code>-Header zeigt jetzt <code>Audio-Output (System-Default)<\/code> UND <code>Audio-Output (konfiguriert)<\/code> (wenn verschieden). <code>generate_compact_header(configured_device_index=...)<\/code> nimmt den gespeicherten Device-Index aus INI entgegen. Verhindert die Verwechslung: MME-Default-Latenz 90 ms vs. tats\u00e4chlich aktive WDM-KS-Latenz 11 ms (Befund 5 aus Hostapi-Matrix).<\/li>\n\n\n\n<li><strong>G \u2014 Playlist-Refresh-Storm behoben (AR-002):<\/strong> Neue Methode <code>PlaylistWidget.add_entries_bulk(entries)<\/code> h\u00e4ngt alle Eintr\u00e4ge intern an und ruft <code>refresh_display()<\/code> + <code>_notify_changed()<\/code> exakt einmal auf \u2014 egal wie viele Songs. Auto-Fill nutzt jetzt Bulk-Add statt N\u00d7 <code>add_entry()<\/code>. Vorher: 24\u00d7 <code>refresh_display<\/code> + 24\u00d7 <code>_refresh_playlist_mirror<\/code>; nachher: 1\u00d7 je.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.87 \u2014 Dock-Open-Instrumentierung + Stall-Detektor 100 ms + Audio-Device-Routing-Diagnose (2026-05-25)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Erweitert die Diagnose-Werkzeuge aus 0.86 um zwei gezielte Messpunkte f\u00fcr Audio-Aussetzer-Ursachen, die wir in den Thorsten-Logs (Desktop + Laptop) gesehen aber nicht eingrenzen konnten. Hintergrund und Verdachtsf\u00e4lle dokumentiert in <code>1_Source\/docs\/anti_ruckler_backlog.md<\/code> (Aufgaben J, N).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Perf-Log: Dock-Toggle-Schritte einzeln gestempelt<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>_toggle_dock(...)<\/code> (zentraler Handler f\u00fcr alle Dock-Buttons in der Statusleiste, u. a. Planner, Lyrics, SongData) stempelt jetzt jeden Qt-Schritt einzeln: <code>setFloating(True)<\/code>, <code>show()<\/code>, <code>move()<\/code>, <code>raise_()<\/code>, <code>setFocus()<\/code>, <code>hide()<\/code>. Plus eine <code>TOTAL<\/code>-Zeile.<\/li>\n\n\n\n<li>Label enth\u00e4lt den Dock-Namen, damit Planner\/Lyrics\/etc. unterscheidbar sind.<\/li>\n\n\n\n<li><code>_on_manager_button_clicked<\/code> (Planner-Button) bekommt zus\u00e4tzlich Stempel um den <code>setCurrentIndex(sort)<\/code>-Trigger (l\u00f6st <code>_apply_filter<\/code> aus).<\/li>\n\n\n\n<li>Zielt auf die Beobachtung von Thorstens Laptop (Celeron N3450): Underflow-Burst direkt nach Planner-Klick, mit Main-Thread-Stall von ~950 ms \u2014 bisher ohne sichtbare Ursache im Log. Die bekannte Qt-Falle <code>setFloating(True) ~90 ms<\/code> (siehe CLAUDE.md) skaliert auf schwacher CPU stark.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Stall-Detektor-Schwelle gesenkt: 150 ms \u2192 100 ms<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In Thorstens Logs vom Vormittag traten Underflows teilweise auf, ohne dass der Stall-Detektor (aus 0.86) etwas meldete \u2014 vermutlich weil Blocks zwischen 100\u2013150 ms unter dem alten Cutoff lagen.<\/li>\n\n\n\n<li>Neue Schwelle 100 ms liegt sicher \u00fcber dem normalen Scheduling-Jitter (~80\u2013100 ms), f\u00e4ngt aber die Blocks zuverl\u00e4ssig, die den Python-PortAudio-Callback am GIL-Greifen hindern.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Diagnostische Konsequenz f\u00fcr AR-014<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die Underflows in Thorstens neuesten Logs (Desktop perf_log_8, Laptop perf_log_14) zeigen alle <code>BUFFER GEFUELLT<\/code> (255\u2013325 ms Vorrat). Der Feeder ist nicht das Problem \u2014 der Python-Callback ist es, weil er bei jedem Aufruf den GIL braucht. Diese Version macht den Beleg daf\u00fcr pr\u00e4ziser, indem sie auch kleinere Stalls + Dock-Schritt-Kosten messbar macht.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Audio-Device-Routing \u2014 Versuch \/ Fallback \/ Endergebnis (Nachzug am Abend)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hintergrund: in einem Nachmittags-Test zeigte das <code>[Diag] Stream gestartet<\/code> immer noch <code>hostapi=MME<\/code>, obwohl Thorsten laut Video im Combo zweifelsfrei einen WASAPI-Eintrag gew\u00e4hlt hatte. Vermutet: stiller Fallback in <code>_ensure_stream<\/code>, weil die <code>try\/except<\/code>-Kette dort bisher die Ursache verschluckt hat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Drei neue <code>[Diag]<\/code>-Zeilen rund um den Stream-Start machen den Weg vom Combo bis zum aktiven Stream nachvollziehbar:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Versuch (UI-seitig)<\/strong> \u2014 <code>_on_audio_device_changed<\/code> loggt jeden Combo-Wechsel:<br><code>[Diag] Audio-Device Wechsel angefordert: idx=\u2026, combo_label='\u2026'<\/code><\/li>\n\n\n\n<li><strong>Versuch (Engine-seitig)<\/strong> \u2014 <code>_ensure_stream<\/code> loggt vor dem ersten Stream-Open:<br><code>[Diag] Stream-Init Versuch: device=\u2026, name='\u2026', hostapi=\u2026, exclusive=\u2026<\/code><\/li>\n\n\n\n<li><strong>Fallback-Pfade<\/strong> \u2014 wenn das Open mit dem User-Device scheitert:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>[Diag] Stream-Init fehlgeschlagen mit device=\u2026 (\u2026) \u2014 Fallback 1 auf gleiches Device ohne extra_settings<\/code><\/li>\n\n\n\n<li><code>[Diag] Stream-Init Fallback 1 ebenfalls fehlgeschlagen (\u2026) \u2014 Fallback 2 auf System-Standard (\u2026). User-Auswahl device=\u2026 wird IGNORIERT!<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Das bestehende <code>[Diag] Stream gestartet<\/code>-Event zeigt weiterhin das <em>tats\u00e4chlich<\/em> aktive Device + Hostapi (also nach Fallback). Reine Diagnose, keine Verhaltens\u00e4nderung am Audio.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.86 \u2014 Anti-Ruckler-Diagnose + MMCSS-Priorit\u00e4t f\u00fcr Audio-Feeder (2026-05-24)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Erweitert die Ursachensuche f\u00fcr Audio-Aussetzer (TIC-0025-Komplex) durch zwei neue Diagnose-Werkzeuge im <code>perf_log.txt<\/code> und einen ersten L\u00f6sungsversuch auf System-Ebene. Hintergrund und Verdachtsf\u00e4lle dokumentiert in <code>1_Source\/docs\/anti_ruckler_backlog.md<\/code>, User-Anleitung in <code>1_Source\/docs\/diagnose_ruckler_user.md<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Audio-Feeder l\u00e4uft mit MMCSS &#8222;Pro Audio&#8220; Priorit\u00e4t (L\u00f6sungsversuch)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Der dedizierte <code>AudioFeeder<\/code>-Thread (seit 0.80) lief bisher mit normaler Windows-Thread-Priorit\u00e4t. PortAudio gibt seinem eigenen Callback-Thread bereits MMCSS, unser Python-Feeder hatte das nicht \u2014 der Windows-Scheduler konnte ihn dadurch hinter UI-Threads zur\u00fcckstellen, selbst wenn der GIL frei war.<\/li>\n\n\n\n<li>Neu: Als allererste Aktion im Feeder-Run-Loop wird <code>AvSetMmThreadCharacteristicsW(\"Pro Audio\")<\/code> via ctypes aufgerufen. Damit steht der Feeder im Scheduler \u00fcber allen UI-Anwendungen.<\/li>\n\n\n\n<li>Per INI abschaltbar: <code>audio\/mmcss_priority=false<\/code> falls Probleme auftreten.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Perf-Log: Wallclock-Zeitstempel auf allen Zeilen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jede Zeile im <code>perf_log.txt<\/code> (au\u00dfer <code>[Sys]<\/code>-Header) bekommt jetzt einen <code>HH:MM:SS.mmm<\/code>-Stempel vorangestellt. Damit lassen sich Ruckler-Beobachtungen mit Uhrzeit oder einer Video-Aufnahme exakt mit Log-Events korrelieren.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Perf-Log: System-Header beim Start<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim ersten \u00d6ffnen des Perf-Logs wird ein <code>[Sys]<\/code>-Block geschrieben mit: Callers-Caddy-Version, Python\/PySide6\/Qt-Versionen, OS, CPU, RAM, PortAudio-Version, Default-Audio-Output, <strong>aktiver Hostapi<\/strong> (MME\/DirectSound\/WASAPI\/WDM-KS), verf\u00fcgbare Hostapis, Audio-Engine-Konstanten (<code>FEED_AHEAD<\/code>, <code>PREPROCESS<\/code>, <code>BLOCK<\/code>). Macht Logs verschiedener Sitzungen und User vergleichbar.<\/li>\n\n\n\n<li>Kosten: ~90 ms beim Start (nur wenn <code>debug\/performance_logging=true<\/code>); ohne Subprocess-Calls.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Perf-Log: PortAudio-Underflow-Events mit Buffer-Snapshot<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bisher wurden Underflows nur als Z\u00e4hler erfasst (<code>xRuns=N<\/code>). Jetzt schreibt jeder Underflow eine eigene <code>[Diag]<\/code>-Zeile mit Zeitstempel, Buffer-Stand und Diagnose-Hinweis:<\/li>\n\n\n\n<li><code>BUFFER LEER \u2192 Feeder\/GIL-Verdacht<\/code> (unser Code konnte nicht nachf\u00fcllen)<\/li>\n\n\n\n<li><code>BUFFER GEFUELLT \u2192 Treiber\/Hostapi\/DPC-Verdacht<\/code> (PortAudio meldet trotz voller Daten \u2014 z. B. WASAPI-Shared-Glitch oder Treiber-DPC-Stall)<\/li>\n\n\n\n<li>Events werden im Callback in eine Deque gepusht (kein I\/O im Callback selbst) und vom Feeder-Loop ins Log geschrieben.<\/li>\n\n\n\n<li>Beim Stream-Start zus\u00e4tzlich <code>[Diag] Stream gestartet: '&lt;Device&gt;' hostapi=&lt;...&gt; sr=... blocksize=... latency=...<\/code>.<\/li>\n\n\n\n<li>Per INI abschaltbar: <code>audio\/log_underflows=false<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Neue User-Doku<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>1_Source\/docs\/diagnose_ruckler_user.md<\/code> beschreibt f\u00fcr betroffene User in drei Schritten, wie sie Logs sammeln (Perflog aktivieren, LatencyMon, optional Video-Sync). Kann direkt an User mit Ruckler-Berichten weitergeleitet werden.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">WASAPI Exclusive Mode als Opt-in (AR-008)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die <a href=\"docs\/anti_ruckler_backlog.md\">Recherche<\/a> hatte einen dokumentierten Glitch in Windows WASAPI Shared Mode (PortAudio Issue #303) als wahrscheinlichste Ursache f\u00fcr scheinbar zuf\u00e4llige Mini-Aussetzer identifiziert. Diese Version erlaubt User, WASAPI im Exclusive Mode zu nutzen \u2014 das umgeht den Bug komplett.<\/li>\n\n\n\n<li>Im Audio-Device-Selector wird jetzt der <strong>Hostapi pro Ger\u00e4t<\/strong> angezeigt (<code>\"Speakers (WASAPI)\"<\/code>, <code>\"UR22 mkII (ASIO)\"<\/code>). Damit sieht der User direkt, welches Backend Windows nutzt.<\/li>\n\n\n\n<li>Neue <strong>Checkbox &#8222;Exclusive&#8220;<\/strong> in der Statusleiste neben dem Device-Combo. Aktiviert WASAPI Exclusive Mode f\u00fcr das gew\u00e4hlte Ger\u00e4t; bei Init-Fehler automatisch Fallback auf Shared. Wirkt nur bei WASAPI-Ger\u00e4ten \u2014 andere Hostapis (MME, DirectSound, ASIO) ignorieren das Flag.<\/li>\n\n\n\n<li>Tooltip warnt: Exclusive Mode blockiert andere Audio-Programme systemweit (kein YouTube\/Spotify nebenbei).<\/li>\n\n\n\n<li>INI-Schl\u00fcssel: <code>audio\/wasapi_exclusive=true\/false<\/code> (Default off).<\/li>\n\n\n\n<li>Wer ein ASIO-Interface besitzt (z. B. Steinberg UR22 mkII): einfach das ASIO-Ger\u00e4t aus der Liste w\u00e4hlen \u2014 PortAudio routet automatisch \u00fcber den ASIO-Hostapi, ohne zus\u00e4tzliche Schalter.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hauptthread-Stall-Detektor im Perf-Log<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Der bestehende 50 ms <code>_update_all<\/code>-Timer misst jetzt die L\u00fccke zwischen seinen Ticks. Ist die L\u00fccke gr\u00f6\u00dfer als 150 ms, war der UI-Thread blockiert \u2014 z. B. durch eine schwere Python-Operation, die den GIL belegt.<\/li>\n\n\n\n<li>Geloggt als <code>[Diag] Main-Thread blockiert: NNNms (erwartet 50ms) (letzter [Perf]-Event vor XXXms: ...)<\/code>. \u00dcber den Wallclock-Stempel direkt korrelierbar mit Underflow-Events: war kurz vor einem <code>[Diag] PortAudio output_underflow<\/code> ein Main-Thread-Stall, ist GIL-Contention die wahrscheinliche Ursache.<\/li>\n\n\n\n<li>Der angeh\u00e4ngte &#8222;letzter [Perf]-Event&#8220;-Hinweis nennt die zuletzt instrumentierte Operation, die vor dem Stall lief \u2014 gibt sofort den Verd\u00e4chtigen, ohne im Log scrollen zu m\u00fcssen.<\/li>\n\n\n\n<li>Reines Logging, keine Verhaltens\u00e4nderung.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserte AudioBuf-Klassifikation<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Im ersten Live-Test zeigte sich, dass das bisherige <code>\u26a0 KRITISCH<\/code> h\u00e4ufig falsch alarmierte: <code>min10s=0<\/code> tritt bei jedem Tempo\/Pitch-Change auf, weil der Stretcher dabei kurz geflusht wird \u2014 der 5 s Pre-Roll f\u00e4ngt das aber ab, sodass PortAudio keinen Underflow meldet und nichts h\u00f6rbar wird.<\/li>\n\n\n\n<li>Neue Label-Stufen in der <code>[AudioBuf]<\/code>-Zeile:<\/li>\n\n\n\n<li><code>\u26a0 XRUN (+N echter Aussetzer)<\/code> \u2014 der PortAudio-xRun-Counter ist seit dem letzten Sample gestiegen, das ist ein h\u00f6rbarer Aussetzer auf Treiber-Ebene<\/li>\n\n\n\n<li><code>\u25b3 Buffer-Dip (vermutl. Stretcher-Flush, harmlos)<\/code> \u2014 <code>min10s<\/code> war kurz auf 0, aber kein neuer xRun (typisch bei Tempo\/Pitch-Wechsel)<\/li>\n\n\n\n<li><code>\u25b3 niedrig<\/code> \u2014 <code>min10s<\/code> 50\u2013120 ms (Vorwarnung)<\/li>\n\n\n\n<li>Beim Sichten eines Logs reicht damit Suche nach <code>\u26a0 XRUN<\/code> und <code>[Diag] output_underflow<\/code> \u2014 der Rest ist Rauschen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Hinweis<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Version enth\u00e4lt ausschlie\u00dflich Diagnose-Verbesserungen plus den MMCSS-Fix-Versuch. Die in der Recherche gefundenen weiteren Hebel (WASAPI-Exclusive\/ASIO-Wahl, Stall-Detektor, Numba\/CFFI) sind im Anti-Ruckler-Backlog erfasst und werden je nach Ergebnis der ersten Test-Runde priorisiert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">0.85 \u2014 Filter-Header + Kritischer Bugfix Loop-Datenverlust (2026-05-23)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Loop-Werte wurden beim Songliste-Klick fremd\u00fcberschrieben<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Symptom<\/strong>: 33 Songs hatten identische <code>loop_in=0.34<\/code> Werte mit unterschiedlichen <code>loop_out<\/code> (geclustert nach Quell-Song). Original-Loops waren verloren.<\/li>\n\n\n\n<li><strong>Ursache<\/strong>: <code>_save_current_song<\/code> lief in <code>_on_file_loaded<\/code> mit dem <strong>neuen<\/strong> <code>_current_song<\/code>, aber dem Engine-Loop-Snapshot des <strong>alten<\/strong> Songs. Beim Durchklicken durch die Songliste hat jeder neue Song die Loop-Werte des vorherigen geerbt.<\/li>\n\n\n\n<li><strong>Fix (Variante C+ \u2014 Direkt-Persistierung + Dirty-Flags)<\/strong>:<\/li>\n\n\n\n<li>Jede Loop-\u00c4nderung (Set Loop In\/Out, Beat Snap, Clear Loop) schreibt <strong>sofort<\/strong> in die DB \u2014 kein Sammel-Save beim Song-Wechsel mehr.<\/li>\n\n\n\n<li>Tempo und Pitch nutzen ein Dirty-Flag und werden beim Verlassen des Feldes (Enter \/ Fokus-Wechsel) oder vor dem n\u00e4chsten Song-Wechsel persistiert. W\u00e4hrend eines Slider-Drags <strong>kein<\/strong> DB-Write \u2014 sch\u00fctzt den Audio-Buffer.<\/li>\n\n\n\n<li>Snapshot-Mechanismus (<code>_snapshot_loop_values<\/code>, <code>_saved_loop_in\/out<\/code>, <code>on_before_load<\/code>) komplett entfernt.<\/li>\n\n\n\n<li>Neue Helper-Methode <code>_flush_player_values()<\/code> wird an allen Song-Wechsel-Punkten aufgerufen (Songliste, Playlist, Vorh\u00f6ren, Drag&amp;Drop, closeEvent).<\/li>\n\n\n\n<li><strong>DB-Cleanup<\/strong>: 33 betroffene Songs auf <code>loop_in=0, loop_out=0<\/code> zur\u00fcckgesetzt (Loops m\u00fcssen neu eingerichtet werden).<\/li>\n\n\n\n<li><strong>Backups<\/strong>: DB unter <code>2_Test\/callers_caddy.db.backup_20260522_225318<\/code>, Source unter <code>1_Source\/src\/_fallback\/*.bak_loop_fix_20260522_231059<\/code>.<\/li>\n\n\n\n<li><strong>Testplan<\/strong>: <code>5_Tickets\/loop_data_loss_testplan.md<\/code><\/li>\n\n\n\n<li><strong>Folge-Ticket<\/strong>: <a href=\"5_Tickets\/TIC-0027_audio_buffer_underrun_tempo_drag\/ticket.md\">TIC-0027<\/a> \u2014 Audio-Buffer-Underrun beim Tempo-Drag (eigenst\u00e4ndiges Performance-Thema)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: SongFilterBar \u2014 einheitlicher Filter-\/Sortierbereich (BL-101 + BL-121)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neue gemeinsame Komponente <code>SongFilterBar<\/code><\/strong> ersetzt die bisherigen separaten Filter-Bereiche in Songliste und Planner.<\/li>\n\n\n\n<li><strong>Songliste<\/strong> hat jetzt vollst\u00e4ndige Parit\u00e4t mit dem Planner:<\/li>\n\n\n\n<li><strong>Typ-Filter<\/strong>: RadioButtons Alle \/ Patter \/ Singing<\/li>\n\n\n\n<li><strong>Genre-Filter<\/strong>: ComboBox mit allen verf\u00fcgbaren Genres<\/li>\n\n\n\n<li><strong>Sortierung<\/strong>: Alphabetisch \/ Qualit\u00e4t \/ Zuletzt gespielt \/ <strong>Empfehlung<\/strong> (neu)<\/li>\n\n\n\n<li><strong>Custom-Filter<\/strong>: Button zum Laden gespeicherter Playlisten als Vorauswahl (BL-097)<\/li>\n\n\n\n<li><strong>Suchfeld<\/strong>: Live-Filter \u00fcber Titel, Label, Dateiname<\/li>\n\n\n\n<li><strong>Planner<\/strong> bleibt unver\u00e4ndert \u2014 nutzt jetzt ebenfalls <code>SongFilterBar<\/code> intern.<\/li>\n\n\n\n<li>Kein doppelter Code mehr: Filterlogik, Custom-Filter-Dialog, Persistenz und Sortierung leben an einer einzigen Stelle.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: Zuf\u00e4lliger Tiebreaker bei Gleichstand (BL-113)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bei <strong>Sortierung nach Qualit\u00e4t<\/strong> und <strong>Sortierung nach Empfehlung<\/strong> werden Songs mit identischem Score nicht mehr immer in DB-Reihenfolge angezeigt, sondern innerhalb der Gleichstands-Gruppe zuf\u00e4llig gereiht.<\/li>\n\n\n\n<li>Neue <strong>\u201eZufall&#8220;-Checkbox<\/strong> neben dem Sort-Dropdown zum Ein-\/Ausschalten \u2014 bei Alphabetisch und Zuletzt gespielt automatisch ausgegraut.<\/li>\n\n\n\n<li>Die Reihenfolge ist <strong>stabil innerhalb einer Session<\/strong> \u2014 kein Neugemischt bei jedem Tastendruck oder Filter-Wechsel.<\/li>\n\n\n\n<li>Alphabetische Sortierung und Zuletzt-gespielt-Sortierung bleiben unver\u00e4ndert deterministisch.<\/li>\n\n\n\n<li>Wirkt \u00fcberall wo <code>SongFilterBar<\/code> verwendet wird: Songliste, Planner-Pool, Auto-Fill.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: Statusleiste \u2014 Miniatur-Abspielfortschritt (BL-128)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neues Widget <code>_StatusBarPlayerBar<\/code><\/strong> in der Statusleiste zeigt dauerhaft den Wiedergabefortschritt:<\/li>\n\n\n\n<li>Fortschritts-F\u00fcllung (semi-transparent, Akzentfarbe aus Skin)<\/li>\n\n\n\n<li>Loop-In \/ Loop-Out als vertikale Linien (wie im Hauptplayer-Slider)<\/li>\n\n\n\n<li>7 gleichbreite Sektionsstreifen (Singing-Call-Farben O\/1\/2\/M\/3\/4\/C) am unteren Rand<\/li>\n\n\n\n<li>Das Widget ist <strong>skin-bewusst<\/strong> \u2014 Farben wechseln bei Skin-Wechsel automatisch.<\/li>\n\n\n\n<li>Ein-\/ausschaltbar per INI: <code>display\/statusbar_player = true<\/code> (Standard) \/ <code>false<\/code><\/li>\n\n\n\n<li>Kein Performance-Overhead: Update nur wenn sich Werte tats\u00e4chlich \u00e4ndern (<code>update_state<\/code> mit Dirty-Check).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Refactoring: Entwicklungsrichtlinie dokumentiert<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue <strong>Refactoring-Vollst\u00e4ndigkeitsregel<\/strong> in <code>1_Source\/docs\/12_erfahrungen.md<\/code>:<\/li>\n\n\n\n<li>Zweiphasen-Vorgehen: erst Aufbau (neues erstellen), dann nach Test Abbau (Altes entfernen)<\/li>\n\n\n\n<li>Pflicht-Checkliste: Aufbau-Liste + Abbau-Liste vor dem Coden<\/li>\n\n\n\n<li><code>CLAUDE.md<\/code> verweist jetzt mit Tabelle auf alle Subdokumente (wann welches lesen)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.84 \u2014 Evening Planner Transfer-Dialog + Audio-Device-Selector + Crash-Fix (2026-05-22)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: Evening Planner \u2014 Transfer-Dialog mit Best\u00e4tigung (BL-124)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u201eZur Playliste&#8220; und \u201eZu Notizen&#8220;<\/strong> zeigen jetzt immer einen Best\u00e4tigungs-Dialog \u2014 auch wenn keine Songs best\u00e4tigt sind.<\/li>\n\n\n\n<li>Der Dialog informiert \u00fcber die Anzahl best\u00e4tigter und unbest\u00e4tigter Songs und bietet drei Optionen: <strong>Alle \u00fcbertragen \/ Nur best\u00e4tigte \/ Abbrechen<\/strong>.<\/li>\n\n\n\n<li>Sind alle Songs bereits best\u00e4tigt, entf\u00e4llt die Auswahlm\u00f6glichkeit und der Transfer l\u00e4uft direkt durch.<\/li>\n\n\n\n<li>Nach dem Transfer erscheint eine R\u00fcckmeldung mit der Anzahl \u00fcbertragener Songs.<\/li>\n\n\n\n<li><strong>Bugfix:<\/strong> Wenn nichts best\u00e4tigt war, passierte beim Klick auf die Transfer-Buttons schlicht nichts \u2014 kein Dialog, keine Meldung. Behoben.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Evening Planner \u2014 falsche Reihenfolge beim Notizen-Export<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Songs erschienen nach dem Export in die Notizen in umgekehrter Reihenfolge.<\/li>\n\n\n\n<li>Ursache: das Notes-Widget f\u00fcgt neue Eintr\u00e4ge immer oben ein (<code>index=0<\/code>), wodurch beim sequenziellen Einf\u00fcgen der letzte Song oben landete.<\/li>\n\n\n\n<li>Fix: Die Export-Liste wird vor dem Einf\u00fcgen umgekehrt, sodass die Reihenfolge aus dem Evening Planner erhalten bleibt.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: P\/S-Markierung in Notizen-Shortcodes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim Export in die Notizen werden Songs jetzt als <strong>P<\/strong> (Patter) oder <strong>S<\/strong> (Singing Call) markiert: <code>[load_song title=\"...\" mode=\"P\"]<\/code>.<\/li>\n\n\n\n<li>Verhindert Verwechslungen bei Songs, die f\u00fcr beide Typen registriert sind.<\/li>\n\n\n\n<li>R\u00fcckw\u00e4rtskompatibel: Songs ohne Typ-Zuordnung verwenden weiterhin das alte Format <code>[load_song \"...\"]<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: Audio-Ausgabeger\u00e4t w\u00e4hlen (BL-126)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neue ComboBox<\/strong> dauerhaft in der rechten Statusleiste zum W\u00e4hlen des Audio-Ausgabeger\u00e4ts.<\/li>\n\n\n\n<li>Zeigt alle verf\u00fcgbaren Ausgabeger\u00e4te des Systems (gefiltert auf Ausgabe-f\u00e4hige Ger\u00e4te).<\/li>\n\n\n\n<li>Erster Eintrag: <strong>System-Standard<\/strong> (bisheriges Verhalten).<\/li>\n\n\n\n<li>Ger\u00e4tewechsel funktioniert auch w\u00e4hrend laufender Wiedergabe \u2014 der Stream wird sofort auf das neue Ger\u00e4t umgeschaltet.<\/li>\n\n\n\n<li>Auswahl wird in der INI gespeichert und beim n\u00e4chsten Start automatisch wiederhergestellt.<\/li>\n\n\n\n<li>Fallback: Ist das gespeicherte Ger\u00e4t nicht verf\u00fcgbar (z. B. USB-Soundkarte nicht angeschlossen), startet die App automatisch mit dem System-Standard.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Crash nach Audio-Device-Disconnect (TIC-0026)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Crash \u201eCannot operate on a closed database&#8220;<\/strong> trat auf wenn ein Audio-Ger\u00e4t getrennt wurde: Der Feeder stoppte die Wiedergabe, ein bereits eingereihter Timer-Callback versuchte danach noch auf die bereits geschlossene Datenbank zuzugreifen.<\/li>\n\n\n\n<li>Fix: <code>timer.stop()<\/code> wird jetzt als allererste Aktion in <code>closeEvent<\/code> ausgef\u00fchrt. Zus\u00e4tzliche <code>is_open()<\/code>-Guards in <code>_do_auto_advance<\/code> und <code>_get_current_target_duration<\/code> verhindern Zugriffe auf eine geschlossene DB.<\/li>\n\n\n\n<li><strong>Audio-Recovery:<\/strong> Wird ein Ger\u00e4t w\u00e4hrend der Wiedergabe getrennt (USB, HDMI), l\u00e4uft die Wiedergabe nach einem kurzen Ausfall automatisch auf dem n\u00e4chsten verf\u00fcgbaren Ger\u00e4t (i. d. R. interner Lautsprecher) weiter. Der Stream wird alle 2 Sekunden auf Aktivit\u00e4t gepr\u00fcft und bei Bedarf neu gestartet.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.83 \u2014 Feedback-Notizen + Lokations-Tipps + KI-Metadaten f\u00fcr Quality\/ERR (2026-05-21)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: Notizfeld im Feedback-Dialog<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neues Textfeld \u201eNotizen f\u00fcr die Zukunft&#8220;<\/strong> im Feedback-Dialog (nach den Quality- und ERR-Buttons), 3-zeilig.<\/li>\n\n\n\n<li>Wenn eine Lokation gew\u00e4hlt ist: Eintrag wird beim OK direkt als neue Notiz <strong>ans Ende der Notizliste<\/strong> der aktuellen Lokation angef\u00fcgt \u2014 ideal als Ged\u00e4chtnisst\u00fctze f\u00fcr den n\u00e4chsten Abend.<\/li>\n\n\n\n<li>Wenn keine Lokation gew\u00e4hlt: Feld deaktiviert mit erkl\u00e4rendem Hinweistext im Platzhalter (\u201eZuerst eine Lokation w\u00e4hlen&#8220;).<\/li>\n\n\n\n<li>Speicherung direkt in die DB (robust gegen lazy-init des Notes-Docks) + anschlie\u00dfender Refresh des NotesWidget.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: Geplante Anzahl Tips pro Lokation<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neues Einstellungsfeld<\/strong> im Lokations-Settings-Dialog (unter dem Tempo-Spinner): Anzahl der geplanten Tips pro Abend.<\/li>\n\n\n\n<li>SpinBox 0\u201340, 0 = keine Vorgabe (wird als \u201e\u2013 (keine Vorgabe)&#8220; angezeigt).<\/li>\n\n\n\n<li>Beim Lokationswechsel wird der Wert automatisch an zwei Stellen \u00fcbernommen:<\/li>\n\n\n\n<li><strong>Autofill-Dialog<\/strong> (Zauberstab im Planner): <code>spin_tipps<\/code> startet mit dem Lokations-Wert statt fest verdrahtetem Standardwert 8.<\/li>\n\n\n\n<li><strong>Evening Planner<\/strong>: <code>_spin_tips<\/code> wird auf den Lokations-Wert gesetzt.<\/li>\n\n\n\n<li>DB-Migration: neue Spalte <code>planned_tips INTEGER<\/code> in der <code>locations<\/code>-Tabelle.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: KI-Metadaten-Export f\u00fcr Quality und ERR (Potential-Widget)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Quality und ERR<\/strong> sind jetzt w\u00e4hlbare Felder im \u201eL\u00fccken exportieren&#8220;-Dialog.<\/li>\n\n\n\n<li>\u201eFehlend&#8220; bedeutet: <code>quality = 0<\/code> bzw. <code>err = 0<\/code>.<\/li>\n\n\n\n<li><strong>KI-Prompt<\/strong> erkl\u00e4rt Quality und ERR mit vollst\u00e4ndigen Anweisungen:<\/li>\n\n\n\n<li>Quality: Caller-Eigeneinsch\u00e4tzung (KI kann das nicht beurteilen) \u2192 KI setzt immer 6, Caller korrigiert selbst.<\/li>\n\n\n\n<li>ERR: T\u00e4nzer-Reaktion (1 = H\u00f6hepunkt bis 4 = Beruhigung) \u2192 KI sch\u00e4tzt anhand Bekanntheit, Mitgr\u00f6lfaktor, emotionaler Wirkung. Feld ist Pflicht, nie auslassen.<\/li>\n\n\n\n<li><strong>Import<\/strong> verarbeitet quality und ERR als Integer-Felder (<code>update_song_simple_field<\/code>). Wert 0 wird beim Import \u00fcbersprungen.<\/li>\n\n\n\n<li><strong>Buttons im FlowWidget<\/strong>: alle Buttons liegen jetzt nebeneinander und umbrechen automatisch in die n\u00e4chste Zeile wenn der Platz nicht reicht \u2014 wiederverwendbare <code>_FlowWidget<\/code>-Klasse f\u00fcr die gesamte App.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.82 \u2014 Feedback-Dialog + Musik- und Lyric-Varianten + Pattern\u2192Patter (2026-05-20)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: Song-Feedback nach dem Abspielen (BL-119 + BL-035)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer modaler Feedback-Dialog<\/strong> erscheint nach jedem Songende (nat\u00fcrliches Ende, Fadeout, manueller Stop), wenn <code>feedback\/enabled = true<\/code> in der INI gesetzt ist (Standard: aus).<\/li>\n\n\n\n<li><strong>Quality-Buttons 0\u201310<\/strong> mit Farbgradient von Wei\u00df (0 = nicht bewertet) \u00fcber Hellgr\u00fcn bis Waldgr\u00fcn (10 = exzellent). Aktuell eingestellter Wert ist hervorgehoben.<\/li>\n\n\n\n<li><strong>ERR-Buttons 0\/4\/3\/2\/1<\/strong> in der Reihenfolge schw\u00e4chste \u2192 st\u00e4rkste T\u00e4nzer-Reaktion, eingef\u00e4rbt mit den Evening-Planner-Farben (Grau\/Blau\/Gr\u00fcn\/Amber\/Rot). Tooltips erkl\u00e4ren die Bedeutung beim Hover.<\/li>\n\n\n\n<li><strong>Adaptive Textfarbe:<\/strong> Dunkler Text auf hellen Buttons, wei\u00dfer Text auf dunklen \u2014 automatisch via Leuchtdichte-Formel.<\/li>\n\n\n\n<li>Esc oder \u201eAbbrechen&#8220; schlie\u00dft ohne Speichern. Nur ge\u00e4nderte Felder werden in die DB geschrieben.<\/li>\n\n\n\n<li><strong>Auto-Advance wartet<\/strong> automatisch bis der Dialog geschlossen ist (modaler Dialog blockiert den Main-Thread).<\/li>\n\n\n\n<li><strong>Manueller Aufruf<\/strong> jederzeit \u00fcber den neuen \u201eFeedback&#8220;-Button im Song-Daten-Dock (neben \u201eErweiterte Daten&#8220; und \u201eSong l\u00f6schen&#8220;).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Feature: Mehrere Musik- und Lyric-Dateien pro Song (BL-XXX)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Varianten-Verwaltung<\/strong> im Dialog \u201eErweiterte Song-Daten&#8220; (neuer Tab \u201eVarianten&#8220;).<\/li>\n\n\n\n<li>\u00dcber <strong>+ Musik-Variante<\/strong> bzw. <strong>+ Lyric-Variante<\/strong> k\u00f6nnen beliebig viele Alternativdateien pro Song eingetragen werden \u2014 mit sprechendem Namen (z.B. \u201eLive-Version&#8220;) und Dateiauswahl-Dialog.<\/li>\n\n\n\n<li>Varianten werden in der <code>song_properties<\/code>-Tabelle gespeichert (<code>music_2_name<\/code>, <code>music_2_file<\/code>, etc.), keine Schema-\u00c4nderung n\u00f6tig.<\/li>\n\n\n\n<li>L\u00f6schen einer Variante mit \u2715-Button; verbleibende Varianten werden automatisch neu nummeriert.<\/li>\n\n\n\n<li>Sind Varianten vorhanden, erscheinen im <strong>Song-Daten-Dock<\/strong> direkt unterhalb des Dateinamens bzw. der Lyrics-Zeile <strong>Auswahl-Buttons<\/strong>: \u201eDefault&#8220; \/ \u201eStandard&#8220; ist immer die erste und vorausgew\u00e4hlte Option.<\/li>\n\n\n\n<li>Klick auf eine Musik-Variante l\u00e4dt sie sofort im Player (PathManager sucht wie bei Hauptdateien in allen konfigurierten Music-Slots).<\/li>\n\n\n\n<li>Klick auf eine Lyric-Variante zeigt sie sofort im Lyrics-Widget.<\/li>\n\n\n\n<li>Die aktive Lyric-Variante bleibt beim Bearbeiten von Songfeldern (Autosave) und Skin-Wechsel erhalten. Beim Wechsel auf einen anderen Song wird immer auf \u201eStandard&#8220; zur\u00fcckgesetzt.<\/li>\n\n\n\n<li>Datei-Dialoge starten standardm\u00e4\u00dfig im jeweiligen Music- bzw. Lyrics-Ordner; portabler Dateiname wird relativ gespeichert.<\/li>\n\n\n\n<li><strong>Bugfix:<\/strong> Varianten-Buttons sprangen nach jeder Player-R\u00fcckmeldung auf \u201eStandard&#8220; zur\u00fcck. Aktive Variante wird jetzt im Widget gemerkt und beim Button-Rebuild korrekt wiederhergestellt.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Umbenennung: \u201ePattern&#8220; \u2192 \u201ePatter&#8220;<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Auf Empfehlung eines amerikanischen Callers: Die gesamte UI verwendet jetzt den korrekten Begriff \u201ePatter&#8220; statt \u201ePattern&#8220; \u2014 in allen deutschen und englischen Texten (Checkbox, RadioButton, Import-Dialog, Evening-Planner, Statistik, Spalten\u00fcberschriften, Tooltips, Tutorial-Texte).<\/li>\n\n\n\n<li>Interne Code-Variablen und DB-Felder (<code>is_pattern<\/code> etc.) bleiben unver\u00e4ndert.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.81 \u2014 Bugfix: Slider-Anzeige bei Tempo-\u00c4nderung und Loop-Audition (2026-05-18)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Zeitanzeige inkonsistent bei ver\u00e4ndertem Tempo<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>label_time_current<\/code> zeigte Original-Sekunden<\/strong>, <code>label_time_total<\/code> hingegen Echtzeit-Dauer \u2014 unterschiedliche Einheiten. Beispiel bei 3-Min-Song, Tempo 1,5\u00d7, nach 1 Minute: Labels zeigten \u201e1:30 \/ 2:00&#8243; (impliziert 75 %), Slider stand korrekt bei 50 %. Jetzt zeigt auch die laufende Zeit Echtzeit: <code>pos \u00d7 dur \/ orig_dur<\/code>. Labels und Slider stimmen wieder \u00fcberein.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Slider friert bei Loop-Audition ein<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Slider blieb w\u00e4hrend der 5-Sekunden-Vorh\u00f6rphase<\/strong> (vor dem ersten Loop-Sprung) auf der <code>loop_in<\/code>-Position stehen. Ursache: <code>_estimate_playback_pos()<\/code> klemmte die Position auf <code>max(loop_in, ...)<\/code>, sobald der Feed-Pointer nach dem Feed-Ahead-Wrap bereits hinter <code>loop_in<\/code> lag \u2014 obwohl der Audio-Callback noch im Pre-Loop-Segment spielte. Fix: Bei <code>pos &lt; loop_in<\/code> wird jetzt <code>_playback_sample<\/code> als N\u00e4herung verwendet (exakt bei Tempo 1,0; leichte Abweichung bei anderen Tempos).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.80 \u2014 Audio-Architektur: Dedizierter Feeder-Thread (2026-05-15)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Audio-Aussetzer endg\u00fcltig behoben (TIC-0025)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dedizierter Audio-Feeder-Thread<\/strong> in der <code>AudioEngine<\/code>. Bisher wurde der WSOLA-Stretcher vom UI-Main-Thread aus gef\u00fcllt (alle 50 ms via QTimer aus <code>PlayerWidget.update_display<\/code>). Damit war das Audio-Feeding vollst\u00e4ndig vom UI-Thread abh\u00e4ngig: jede GIL-Blockade &gt; 500 ms (Loop-Finder-Completion, DB-Operationen, restoreState) f\u00fchrte zu h\u00f6rbaren Aussetzern. <strong>Jetzt l\u00e4uft ein eigener Daemon-Thread (<code>AudioFeeder<\/code>)<\/strong>, der den Stretcher unabh\u00e4ngig vom Main-Thread alle 20 ms nachf\u00fcllt.<\/li>\n\n\n\n<li><strong><code>FEED_AHEAD_SECONDS<\/code>: 0.5 s \u2192 5.0 s.<\/strong> Der Stretcher puffert ab sofort 5 Sekunden Audio vor. Selbst wenn der Main-Thread mehrere Sekunden blockiert, hat der Audio-Callback genug Daten zum Abspielen.<\/li>\n\n\n\n<li><strong>Thread-sichere Zustands-Updates<\/strong> via <code>threading.Lock<\/code>: <code>load()<\/code>, <code>seek()<\/code>, <code>play()<\/code> und <code>_flush_and_refeed()<\/code> halten den Lock, w\u00e4hrend sie <code>_feed_pos<\/code>, <code>audio_data<\/code> oder den <code>stretcher<\/code> \u00e4ndern. Keine Race-Conditions zwischen Feeder-Thread und Main-Thread m\u00f6glich.<\/li>\n\n\n\n<li><strong>Ergebnis:<\/strong> Ein aktiver AudioStream hat ab jetzt absolute Priorit\u00e4t \u2014 er wird nicht mehr von UI-Operationen ausgehungert.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Weitere Rule-Aktionen entkoppelt<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>dual_view_toggle<\/code> deferred<\/strong> via <code>QTimer.singleShot(0, ...)<\/code> \u2014 gleiches Muster wie <code>layout_load<\/code> in v0.79. Die Toggle-Pfade mit <code>restoreState<\/code>\/<code>restoreGeometry<\/code> blockierten bis zu 105 ms.<\/li>\n\n\n\n<li><strong><code>system_ping<\/code> asynchron<\/strong> im Daemon-Thread \u2014 <code>winsound.Beep<\/code> blockierte den Main-Thread synchron f\u00fcr die volle Tondauer (~300 ms). Trigger ist jetzt sofort durch, der Beep spielt parallel.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.79 \u2014 Performance: layout_load deferred (2026-05-15)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Audio-Aussetzer bei Layout-Wechsel durch Rules (TIC-0025)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>layout_load<\/code>-Aktion deferred<\/strong> \u2014 <code>restoreState<\/code>\/<code>restoreGeometry<\/code> blockierten ~75 ms synchron auf dem Main-Thread (GIL), genau beim <code>song_started<\/code>-Trigger. Mit <code>QTimer.singleShot(0, ...)<\/code> wird der Layout-Wechsel in den n\u00e4chsten Event-Loop-Tick verschoben, sodass der Audio-Callback zuerst l\u00e4uft. Identisches Muster wie die bereits deferred <code>play<\/code>-Aktion.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.78 \u2014 Performance: Audio-Aussetzer (2026-05-15)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Song-Aussetzer im Livebetrieb (TIC-0025)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Songliste: <code>set_last_played_map<\/code> optimiert<\/strong> \u2014 bisher wurden beim Song-Start alle 2401 Tabellenzeilen neu geschrieben (144 ms GIL-Block auf dem UI-Thread). Jetzt werden nur noch die tats\u00e4chlich ge\u00e4nderten Zeilen aktualisiert (typisch: 1 Zeile, ~0 ms). Behebt die Hauptursache f\u00fcr Audio-Aussetzer auf schw\u00e4cheren Rechnern.<\/li>\n\n\n\n<li><strong><code>_apply_filter<\/code> baut <code>_row_by_id<\/code>-Dict<\/strong> auf (song_id \u2192 Zeilenindex) f\u00fcr direkten Zugriff ohne lineare Suche.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rule Engine: Aktions-Timing im Log<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jede Rule-Aktion protokolliert jetzt ihre Ausf\u00fchrungszeit in <code>rules\/rules.log<\/code> (z.B. <code>song_list_refresh({}) [2.1ms]<\/code>). Erleichtert die Diagnose von Performance-Problemen im Livebetrieb.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.77 \u2014 Permanent Custom-Filter (2026-05-14)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Planner \u2014 Permanente Custom-Filter-Slots<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u201ePermanent&#8220;-Toggle-Button<\/strong> in jeder der 4 Custom-Filter-Slot-Zeilen (hinter dem Entfernen-Button)<\/li>\n\n\n\n<li>Ist der Button gedr\u00fcckt, wird der Dateipfad der geladenen Playlist in der INI (Sektion <code>custom-filter<\/code>) gespeichert<\/li>\n\n\n\n<li>Beim Entfernen eines Slots wird der Permanent-Status automatisch zur\u00fcckgesetzt<\/li>\n\n\n\n<li>Beim ersten \u00d6ffnen des Planners in einer Session werden permanente Eintr\u00e4ge aus der INI gelesen und die Playlisten automatisch als Custom-Filter geladen<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.76 \u2014 Planner Custom-Filter (BL-097) (2026-05-12)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Planner \u2014 Custom-Playlist-Filter<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u201eCustom&#8220;-Button<\/strong> in der Filter-Zeile (nach Alle\/Pattern\/Singing, vor Genre): \u00f6ffnet den neuen Custom-Filter-Dialog<\/li>\n\n\n\n<li><strong>Custom-Filter-Dialog<\/strong>: bis zu 4 feste Slots, je mit [Laden]- und [Entfernen]-Button; l\u00e4dt gespeicherte Playlist-TXT-Dateien (aktuelles und altes Format)<\/li>\n\n\n\n<li><strong>Vorschau-Tabelle<\/strong> im Dialog zeigt die Schnittmenge aller geladenen Slots in Echtzeit<\/li>\n\n\n\n<li><strong>Anzeigename<\/strong> per Doppelklick auf den Slot-Namen \u00e4nderbar (Playlist-Daten bleiben unver\u00e4ndert)<\/li>\n\n\n\n<li><strong>Extra-Zeile im Planner<\/strong> erscheint nach dem \u00dcbernehmen mit Checkboxen pro geladenem Slot \u2014 nur sichtbar wenn mindestens eine Playlist geladen ist<\/li>\n\n\n\n<li>Checkboxen an\/aus filtert den Song-Pool sofort auf die Schnittmenge der aktiven Playlisten<\/li>\n\n\n\n<li>Alle anderen Filter (Suche, Sortierung, Typ, Genre) bleiben weiterhin wirksam<\/li>\n\n\n\n<li>Filter ist session-only (kein Persist beim App-Ende)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.75 \u2014 Quality + ERR F\u00fcllen, Evening Planner Fixes (2026-05-11)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neues Tab im Potential-Widget: Quality + ERR F\u00fcllen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Einzel-Datensatz-Durchlauf<\/strong>: Songs mit fehlender Quality oder ERR-Bewertung werden einzeln angezeigt \u2014 kein Listenspringen mehr<\/li>\n\n\n\n<li>Doppelklick auf Loops-Spalte oeffnet Loop-Anzahl-Dialog (Playlist + Planner)\/strong&gt;: Titel (fett), darunter Typ (Pattern \/ Singing \/ Pattern + Singing), Label, aktueller Quality- und ERR-Wert<\/li>\n\n\n\n<li><strong>Quality-Buttons<\/strong> (1\u201310): nur sichtbar wenn Quality nicht gesetzt; aktueller Wert hervorgehoben<\/li>\n\n\n\n<li><strong>ERR-Buttons<\/strong> (1\u20134): in ERR-Farben (Rot \/ Orange \/ Gr\u00fcn \/ Blau); nur sichtbar wenn ERR nicht gesetzt<\/li>\n\n\n\n<li><strong>Auto-Advance<\/strong>: Sobald beide Werte gesetzt sind, springt die Anzeige automatisch zum n\u00e4chsten Song<\/li>\n\n\n\n<li><strong>\u201e\u25b6 Vorh\u00f6ren&#8220; \/ \u201e\u23f9 Stopp&#8220;<\/strong> Button neben dem Titel: l\u00e4dt den Song in den Player und startet die Wiedergabe; zweiter Klick stoppt<\/li>\n\n\n\n<li>Navigation mit \u201e\u25c0 Zur\u00fcck&#8220; \/ \u201eWeiter \u25b6&#8220; (gut lesbar) + Z\u00e4hler \u201eSong X von Y&#8220;<\/li>\n\n\n\n<li>Badge-Count im Tab-Titel<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Evening Planner Fixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ERR-Balken erschienen nie<\/strong>: Songs mit <code>err=0<\/code> (nicht bewertet) lieferten <code>patter_err=0<\/code> \u2192 <code>_draw_bar<\/code> zeichnete nichts. Fix: Songs mit <code>err=0<\/code> aber vorhandenem Slot bekommen einen <strong>grauen Balken<\/strong> auf Ziel-ERR-H\u00f6he (konsistent mit Tabellen-Verhalten)<\/li>\n\n\n\n<li><strong>Dock nicht dockbar<\/strong>: Evening Planner Dock ist jetzt nur noch schlie\u00dfbar (kein Movable\/Floatable) \u2014 bleibt auch nach <code>restoreState()<\/code> fest<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Weitere Fixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>KI-Prompt<\/strong> im Metadaten-Tab ist jetzt immer auf Englisch<\/li>\n\n\n\n<li><strong>Statistik-Texte<\/strong> nach Export\/Import\/CSV-Abgleich vollst\u00e4ndig \u00fcbersetzt (keine hardcodierten deutschen Strings mehr)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.74 \u2014 Metadaten-Werkzeuge: Song-Properties, CSV-Abgleich, Metadaten-Export\/Import (2026-05-11)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Funktion: Erweiterte Song-Daten (BL-094)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Generische <code>song_properties<\/code>-Tabelle<\/strong>: Speichert beliebige Schl\u00fcssel-Wert-Paare pro Song (initial: <code>original_artist<\/code>, <code>release_year<\/code>)<\/li>\n\n\n\n<li><strong>Button \u201eErweiterte Daten&#8220;<\/strong> im Song-Datensatz \u00f6ffnet einen generischen Editor mit bearbeitbarer Key-Value-Tabelle<\/li>\n\n\n\n<li><strong>Label-Feld<\/strong> umbenannt zu \u201eLabel + Nr.&#8220; mit Beispiel-Platzhalter \u201ez.B. SQR 123&#8243;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Neues Widget-Layout im Potential-Widget<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Umbau zu QTabWidget<\/strong>: Jede der 10 Pr\u00fcfungen bekommt einen eigenen Tab (Badge-Count im Tab-Titel)<\/li>\n\n\n\n<li>Erster Tab wird beim \u00d6ffnen automatisch geladen<\/li>\n\n\n\n<li>Tab-Scroll-Buttons verbreitert (24 px Mindestbreite)<\/li>\n\n\n\n<li><strong>Neuer Tab \u201eMetadaten f\u00fcllen&#8220;<\/strong> (BL-114) mit drei Werkzeugen:<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Metadaten-Werkzeuge (BL-114)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Abgleichen mit Music CSV<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CSV-Abgleich-Button<\/strong> (an erster Stelle): Gleicht fehlende Song-Metadaten automatisch mit einer mitgelieferten CSV-Datenbank ab<\/li>\n\n\n\n<li>Dreistufiges Matching: 1) exakter Titel, 2) Label-Code + Nummer, 3) Fuzzy (difflib, Schwelle 0.80)<\/li>\n\n\n\n<li><strong>Preview-Tabelle<\/strong> mit Checkbox pro Song, \u201eAlle \/ Keine&#8220; Auswahl<\/li>\n\n\n\n<li>Gr\u00fcne Zellen = eindeutiger Treffer, gelbe Zellen = mehrdeutig \u2192 Doppelklick \u00f6ffnet Auswahllist<\/li>\n\n\n\n<li>Unterst\u00fctzte Felder: Interpret, Label\/Nr., Genre, Original Artist, Erscheinungsjahr<\/li>\n\n\n\n<li><code>music-extended-data\/music_extended_data.csv<\/code> wird bei jedem Release automatisch mitgeliefert<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">L\u00fccken exportieren (JSON)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Feld-Auswahl-Dialog (welche leeren Felder exportieren?)<\/li>\n\n\n\n<li>Exportiert Songs mit fehlenden Daten als JSON mit <code>genres_available<\/code>-Liste<\/li>\n\n\n\n<li>Statistik nach Export (Anzahl Songs, fehlende Felder)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">KI-Prompt anzeigen<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kopierfertige Anleitung f\u00fcr KI-Assistenten, <strong>immer auf Englisch<\/strong><\/li>\n\n\n\n<li>Enth\u00e4lt alle im System vorhandenen Genres als erlaubte Werte<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Daten importieren (JSON)<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>L\u00e4dt angereicherte JSON zur\u00fcck, zeigt Preview-Tabelle mit Checkbox-Auswahl<\/li>\n\n\n\n<li>Unbekannte Genres werden markiert und \u00fcbersprungen<\/li>\n\n\n\n<li>Alle Statistik-Texte vollst\u00e4ndig \u00fcbersetzt (keine hardcodierten deutschen Strings mehr)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Playlist-Kompatibilit\u00e4t<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>V1-Playlisten<\/strong> (nur Titel, altes Format) werden wieder korrekt geladen<\/li>\n\n\n\n<li>Neue Playlisten werden mit Titel statt Dateiname gespeichert (Format V3: Typ + Loop-Count + Titel)<\/li>\n\n\n\n<li>Loader erkennt alle drei Formate automatisch (V1\/V2\/V3)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.73 \u2014 Abendplanung: Evening Planner Widget (2026-05-10)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Potential-Widget: Neue Pr\u00fcfer<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ohne ERR<\/strong> (BL-115): Listet Songs auf, bei denen der ERR-Wert noch nicht gesetzt ist (<code>err = 0<\/code>). Doppelklick navigiert direkt zum Song.<\/li>\n\n\n\n<li><strong>Ohne Genre<\/strong> (BL-116): Listet Songs ohne Genre-Zuweisung auf. Doppelklick navigiert direkt zum Song.<\/li>\n\n\n\n<li><strong>Inkompatibles Format<\/strong> (BL-117): Pr\u00fcft ob Audiodateien vom internen Decoder (soundfile\/libsndfile) gelesen werden k\u00f6nnen. Erkennt MP3s mit nicht-standardkonformen Frames, die nur ffmpeg-basierte Player lesen k\u00f6nnen. L\u00e4uft wie BPM- und Loop-Check mit Zeitsch\u00e4tzung (5 Sample-Dateien \u2192 Hochrechnung \u2192 Best\u00e4tigung \u2192 vollst\u00e4ndiger Check im Hintergrundthread). Doppelklick navigiert zum betroffenen Song; Ignorieren-Funktion vorhanden.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Import neuer Songs schl\u00e4gt fehl<\/strong> (<code>You did not supply a value for binding parameter :err<\/code>): <code>err<\/code> fehlte im <code>insert()<\/code>-Dict \u2014 die Spalte war beim Hinzuf\u00fcgen von BL-111 im SQL erg\u00e4nzt worden, aber nicht im Python-Dict. Neue Songs werden immer mit <code>err = 0<\/code> (nicht gesetzt) importiert. <code>insert()<\/code> und <code>update()<\/code> verwenden jetzt <code>dataclasses.asdict()<\/code> statt manueller Dicts \u2014 neue Felder im Song-Modell werden k\u00fcnftig automatisch ber\u00fccksichtigt.<\/li>\n\n\n\n<li><strong>Crash beim Songimport behoben<\/strong> (<code>TypeError: '&gt;' not supported between instances of 'str' and 'int'<\/code>): <code>quality<\/code>-Werte die als Text oder Kommazahl in der DB lagen (z.B. aus \u00e4lteren Migrationen) konnten die App beim Start komplett blockieren. <code>_row_to_song<\/code> konvertiert <code>quality<\/code> jetzt robust zu <code>int<\/code>; eine automatische DB-Migration bereinigt bestehende Altdaten beim ersten Start der neuen Version.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Neues Feature: Evening Planner (Abendplanung)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Dock \u201eAbendplanung&#8220;<\/strong> parallel zum bestehenden Planner (Ansicht-Men\u00fc)<\/li>\n\n\n\n<li><strong>Emotionaler Spannungsbogen<\/strong>: Bezier-Kurve mit Catmull-Rom-Interpolation als visuelles Ziel<\/li>\n\n\n\n<li><strong>S\u00e4gezahn-Bl\u00f6cke<\/strong>: CurveEngine segmentiert N Tipps automatisch in Bl\u00f6cke (konfigurierbares Min\/Max, Standard 3\u20135 Tipps), jeder Block mit ERR-Muster 3\u21924\u21922\u21921<\/li>\n\n\n\n<li><strong>ERR-Balken<\/strong>: Patter (satte Farbe) und Singer (<a href=\"https:\/\/callerscaddy.de\/farbwechsel-via-theme\/\">helle Farbe<\/a>) als separate Balken pro Tipp; H\u00f6he = emotionale Intensit\u00e4t<\/li>\n\n\n\n<li><strong>Drag-Handles<\/strong>: ERR-Ziele per Maus verschieben; Griff-Abstand konfigurierbar (pro Tipp \/ 30 \/ 45 \/ 60 \/ 90 min)<\/li>\n\n\n\n<li><strong>Pausen-Unterst\u00fctzung<\/strong>: Pausen als graue Bl\u00f6cke im Zeitstrahl, proportional zur Dauer dargestellt; harte Block-Grenzen<\/li>\n\n\n\n<li><strong>Songvorschl\u00e4ge<\/strong>: SongScorer bewertet nach <code>quality \u00d7 days_since_last_played \u00d7 err_match<\/code>; bester Vorschlag automatisch grau vorbelegt<\/li>\n\n\n\n<li><strong>Ausgleichsregel<\/strong>: Singer-ERR komplement\u00e4r zu Patter-ERR (Summe \u2248 5)<\/li>\n\n\n\n<li><strong>4 Strategien<\/strong>: Pattern+Singing abwechselnd, Singings nur Anfang\/Ende, Nur Pattern, Nur Singings<\/li>\n\n\n\n<li><strong>Detail-Liste (PlannerTable)<\/strong>: Tabellarische Ansicht aller Tipps mit Zeit, Songtitel, Label, ERR; Pausen per Drag &amp; Drop verschiebbar<\/li>\n\n\n\n<li><strong>Zoom &amp; Pan<\/strong>: Zoom-in\/out\/fit-Buttons, QScrollArea f\u00fcr horizontales Panning<\/li>\n\n\n\n<li><strong>Lokation-Integration<\/strong>: Automatische Aktualisierung der Vorschl\u00e4ge bei Lokationswechsel<\/li>\n\n\n\n<li><code>song_db.py<\/code>: Neue Methode <code>get_planner_candidates()<\/code> f\u00fcr ERR-gefiltertes Kandidaten-Query<\/li>\n\n\n\n<li><strong>Kandidaten-Dialog<\/strong>: Doppelklick auf einen Tipp-Slot \u00f6ffnet einen Dialog mit allen passenden Kandidaten (Score, ERR, Label, Dateiname); beim Pattern-Slot optionale Bonus-Spalten f\u00fcr Genre-Match und Label-Match; Doppelklick oder OK best\u00e4tigt den Song f\u00fcr diesen Slot<\/li>\n\n\n\n<li><strong>Genre-Filter<\/strong>: Checkbox + Button schr\u00e4nkt Song-Kandidaten auf ausgew\u00e4hlte Genres ein (gilt f\u00fcr Auto-Fill und Kandidaten-Dialog); Button zeigt kompakte Zusammenfassung der gew\u00e4hlten Genres<\/li>\n\n\n\n<li><strong>Planungsregeln-Dialog<\/strong>: Konfigurierbare Regeln f\u00fcr die Vorschlagsberechnung<\/li>\n\n\n\n<li><strong>Balance<\/strong>: Patter-ERR komplement\u00e4r zu Singing-ERR (Summe \u2248 5)<\/li>\n\n\n\n<li><strong>Same-Genre-Boost<\/strong> \/ <strong>Same-Label-Boost<\/strong>: multiplikativer Score-Bonus (Faktor konfigurierbar) wenn Patter und Singer aus gleichem Genre \/ Label<\/li>\n\n\n\n<li><strong>First-Tip-Soft<\/strong>: Erster Tipp bevorzugt Baseline\/Beruhigung<\/li>\n\n\n\n<li><strong>Last-Tip-Strong<\/strong>: Letzter Tipp bevorzugt H\u00f6hepunkt oder Vorbereitung<\/li>\n\n\n\n<li><strong>Export-Button<\/strong> (gr\u00fcner Haken): \u00dcbertr\u00e4gt alle best\u00e4tigten Slots als neue Playlist (nur best\u00e4tigte, keine grauen Vorschl\u00e4ge)<\/li>\n\n\n\n<li><strong>Zwei Fill-Algorithmen<\/strong>: <code>_fill_optimal<\/code> (globale Optimierung, minimiert Wiederholungen) und <code>_fill_greedy<\/code> (schneller, greedy je Slot)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.72 \u2014 Potential: Ohne MP3 \/ Ohne Qualit\u00e4t, Crash-Handler Qt-Erweiterung (2026-05-07)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Potential-Widget: Zwei neue Datenqualit\u00e4ts-Checks (BL-027)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ohne MP3<\/strong>: Zeigt Songs, deren MP3-Datei in keinem konfigurierten Musikordner gefunden wird<\/li>\n\n\n\n<li>Lazy Load: Dateicheck startet erst beim Klick auf den Button, nicht beim App-Start<\/li>\n\n\n\n<li>Fortschritts-Dialog w\u00e4hrend der Pr\u00fcfung (&#8222;Pr\u00fcfe MP3-Dateien\u2026 x\/n&#8220;)<\/li>\n\n\n\n<li>L\u00e4uft im Hintergrund-Thread (QThread), UI bleibt bedienbar, abbrechbar<\/li>\n\n\n\n<li>Doppelklick navigiert zum Song in der Songliste; Ignorieren-Funktion vorhanden<\/li>\n\n\n\n<li><strong>Ohne Qualit\u00e4t<\/strong>: Zeigt Songs mit <code>quality = 0<\/code> (Standardwert = noch nie bewertet)<\/li>\n\n\n\n<li>Doppelklick navigiert zum Song; Ignorieren-Funktion vorhanden<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Crash-Handler: Qt-Message-Handler (BL-103)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>qInstallMessageHandler<\/code> registriert: Qt-eigene Critical- und Fatal-Meldungen werden jetzt abgefangen<\/li>\n\n\n\n<li>Bei <code>QtCriticalMsg<\/code> und <code>QtFatalMsg<\/code>: sofortiges Schreiben eines Crash-Logfiles (inkl. Ring-Buffer)<\/li>\n\n\n\n<li>Sch\u00fctzt vor einer Klasse von Qt-internen Fehlern, die <code>sys.excepthook<\/code> nicht erreichen<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.71 \u2014 ERR-Feld, Planner-Suche, Auto-Fill, Button-Wrap (2026-05-07)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">ERR-Feld: Emotional Response Rate (BL-111)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Feld <code>err<\/code> in der Songdatenbank (INTEGER, 0\u20134): bewertet die emotionale Wirkung eines Songs im Tanzabend<\/li>\n\n\n\n<li>Werte: 0 = nicht bewertet, 1 = H\u00f6hepunkt, 2 = Vorbereitung, 3 = Baseline, 4 = Beruhigung<\/li>\n\n\n\n<li>ComboBox im Song-Daten-Widget; gespeichert wird nur die Zahl, keine Texte<\/li>\n\n\n\n<li>DB-Migration: neues Feld wird bestehenden Datenbanken automatisch hinzugef\u00fcgt<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Auto-Fill im Planner (BL-112)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Zauberstab-Button (3. Position in der Mittelleiste) f\u00fcllt die Playlist automatisch<\/li>\n\n\n\n<li>Dialog: Anzahl Pattern- und Singing-Tipps w\u00e4hlbar + eine von 4 Strategien:<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Zufall \u2014 Songs werden zuf\u00e4llig gezogen<\/li>\n\n\n\n<li>Selten gespielt \u2014 wenig gespielte Songs bevorzugt<\/li>\n\n\n\n<li>Qualit\u00e4t \u2014 Songs nach Qualit\u00e4tsbewertung sortiert<\/li>\n\n\n\n<li>ERR-Abfolge \u2014 Songs nach emotionaler Kurve (Vorbereitung\u2192H\u00f6hepunkt\u2192Baseline\u2192Beruhigung)<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dual-Typ-Songs (Pattern + Singing) erhalten korrekt den jeweils gew\u00e4hlten Modus<\/li>\n\n\n\n<li>Gesamtdauer der Playlist ber\u00fccksichtigt bei Loop=<a href=\"https:\/\/callerscaddy.de\/controlled-loops-patter-music\/\">\u221e die voreingestellte Pattern-Dauer des Programms<\/a>\/Clubs<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Planner-Suche (BL-106)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Suchfeld oben im Pool (linke Spalte des Planners): filtert gleichzeitig nach Titel, Label und Dateiname<\/li>\n\n\n\n<li>Mit X-Button zum Leeren; Suche wirkt zusammen mit den \u00fcbrigen Filtern (Genre, Typ usw.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Button-Leiste mit Zeilenumbruch<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Hilfsklasse <code>_WrapButtonBar<\/code>: Buttons reihen sich nebeneinander, umbrechen aber bei zu schmalen Dock-Fenstern automatisch in eine zweite Zeile<\/li>\n\n\n\n<li>Songliste und Playlist nutzen jetzt diese Leiste \u2014 keine abgeschnittenen Beschriftungen mehr<\/li>\n\n\n\n<li>Alle Buttons einer Zeile werden auf einheitliche H\u00f6he gebracht (Zeilen-Maximum)<\/li>\n\n\n\n<li>Button-Texte kompakter: \u201e\u2192 Notiz&#8220; \u2192 \u201e+Notiz&#8220;, \u201e\u2192 Playlist&#8220; \u2192 \u201e+Playlist&#8220;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sonstiges<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Standard-Tanzprogramm beim Start: Button zeigt \u201eMS&#8220; (Mainstream) statt \u201e\u2014&#8220;<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.70 \u2014 Potential-Widget: Bulk-Aktionen; UI-Bugfixes (2026-05-05)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Potential-Widget: Bulk-Aktionen (Erweiterung BL-027)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Auto-Loop f\u00fcr alle<\/strong>: Neuer Button im &#8222;Ohne Loop&#8220;-Check \u2014 setzt automatisch einen Loop f\u00fcr alle betroffenen Pattern per Loop-Finder. Bei mehr als 5 Songs wird vorab eine Zeitsch\u00e4tzung anhand von 5 Stichproben gemessen und dem Nutzer angezeigt, bevor er best\u00e4tigt.<\/li>\n\n\n\n<li><strong>Beat-Snap f\u00fcr alle<\/strong>: Neuer Button im &#8222;Ohne BeatSnap&#8220;-Check \u2014 snappt Loop-In und Loop-Out aller betroffenen Songs auf den n\u00e4chstgelegenen Beat. Gleiches Timing-Prinzip: bei &gt; 5 Songs Vorab-Sch\u00e4tzung, sonst direkt loslegen.<\/li>\n\n\n\n<li><strong>Leere Lokationen l\u00f6schen<\/strong>: Neuer Button im &#8222;Leere Lokationen&#8220;-Check \u2014 entfernt alle Lokationen ohne Abspielhistorie nach Best\u00e4tigung.<\/li>\n\n\n\n<li>Alle Bulk-Operationen laufen im Hintergrundthread (kein UI-Freeze), mit abbrechbarem Fortschrittsdialog (&#8222;Abbrechen&#8220;-Button).<\/li>\n\n\n\n<li>SQLite-Thread-Safety: Worker \u00f6ffnen eine eigene DB-Verbindung \u00fcber <code>db_path<\/code>, statt die Verbindung des Main-Threads zu teilen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Loop Finder Widget<\/strong>: Segmentleiste (7 Singing-Call-Abschnitte) wurde nach dem Player-Redesign unten abgeschnitten \u2014 H\u00f6he von 14 px auf 28 px korrigiert.<\/li>\n\n\n\n<li><strong>Loop-Widget Buttons<\/strong>: Unterl\u00e4ngen (p, g) in zweizeiligen Buttons (&#8222;Loop\\nFinder&#8220;, &#8222;Beat\\nSnap&#8220; etc.) wurden abgeschnitten \u2014 QPushButton-Padding in allen Themes von 10 px auf 5 px vertikal reduziert.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.69 \u2014 Rules: BPM-Bedingungen + Auto-Detect-Aktion; zentrale Pfadaufl\u00f6sung (2026-05-03)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Rules \u2014 neue Bedingungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>BPM Set<\/strong>: pr\u00fcft ob der aktuelle Song einen BPM-Wert gesetzt hat (<code>base_bpm &gt; 0<\/code>)<\/li>\n\n\n\n<li><strong>BPM Not Set<\/strong>: Gegenst\u00fcck \u2014 Song hat noch keinen BPM-Wert<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rules \u2014 neue Aktion<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Auto-Detect BPM<\/strong> (Gruppe &#8222;Audio&#8220;): Startet die automatische BPM-Erkennung f\u00fcr den aktuell geladenen Song im Hintergrund \u2014 identisch zum &#8222;Auto BPM&#8220;-Button im Song-Daten-Widget, aber als Regel-Aktion ausl\u00f6sbar (z. B. via Trigger &#8222;Song Changed&#8220; mit Bedingung &#8222;BPM Not Set&#8220;)<\/li>\n\n\n\n<li>Ergebnis wird in DB gespeichert und das BPM-Feld im Song-Daten-Widget sofort aktualisiert<\/li>\n\n\n\n<li>L\u00e4uft idempotent: zweiter Aufruf w\u00e4hrend laufender Erkennung wird ignoriert<\/li>\n\n\n\n<li>&#8222;<a href=\"https:\/\/callerscaddy.de\/die-bpm-des-square-dance-liedes-ermitteln\/\">BPM wird ermittelt \u2026<\/a>&#8222;-Overlay w\u00e4hrend der Erkennung (analog zum Auto-Loop-Overlay)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Zentrale Pfadaufl\u00f6sung (BL-104)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>PathManager.find_lyric_file(filename)<\/code> neu \u2014 sucht Lyrik-Datei im konfigurierten Lyrics-Ordner (Pendant zu <code>find_song_file()<\/code>)<\/li>\n\n\n\n<li><code>SongDataWidget._on_auto_bpm()<\/code>: nutzt jetzt <code>find_song_file()<\/code> statt direktem <code>music_dir<\/code>-Join \u2014 findet Songs in allen 4 Musik-Slots<\/li>\n\n\n\n<li><code>LyricsWidget._load_lyrics_file()<\/code>: nutzt jetzt <code>find_lyric_file()<\/code> statt direktem <code>lyrics_dir<\/code>-Join<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TIC-0016<\/strong>: Auto-BPM-Button reagierte nicht auf Klick \u2014 Ursache war <code>music_dir<\/code>-Join der nur Slot 1 durchsuchte; behoben durch <code>find_song_file()<\/code> (Teil der zentralen Pfadaufl\u00f6sung)<\/li>\n\n\n\n<li><strong>TIC-0023<\/strong>: Funktionen ignorierten alternative Musik-\/Lyrik-Pfade (Slots 2\u20134) \u2014 behoben durch zentrale Pfadaufl\u00f6sung (BL-104)<\/li>\n\n\n\n<li><strong>TIC-0007 \/ TIC-0022<\/strong>: Abst\u00fcrze ohne Details nicht mehr analysierbar \u2014 strukturell behoben durch Crash-Handler (BL-103): automatisches Logfile bei jedem unbehandelten Absturz<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.68 \u2014 Player-Widget Redesign (2026-05-02)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Player-Widget: Neues Layout<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Info-Streifen<\/strong> (oberste Zeile): 4 gleich breite Spalten mit Beschriftung oben und Wert darunter \u2014 Dauer \/ BPM \/ Loops \/ Programm<\/li>\n\n\n\n<li><strong>BPM-Anzeige<\/strong>: zeigt nur noch den Zahlenwert, \u201eBPM&#8220; steht als Spaltentitel dar\u00fcber<\/li>\n\n\n\n<li><strong>Loop-Count<\/strong>: zeigt nur noch \u201e3\/8&#8243; bzw. \u201e\u221e&#8220;, Spaltentitel lautet \u201eLoops&#8220;<\/li>\n\n\n\n<li><strong>Songtitel + Status<\/strong> in einer gemeinsamen Zeile: Titel linksb\u00fcndig, Status rechtsb\u00fcndig<\/li>\n\n\n\n<li><strong>Songtitel dynamisch skalierend<\/strong>: nutzt allen freien vertikalen Platz der Player-Karte, Schrift w\u00e4chst von der Theme-Basisgr\u00f6\u00dfe bis +13 px \u2014 mit Zeilenumbruch bei Platzmangel<\/li>\n\n\n\n<li><strong>Status-Text<\/strong> bleibt dauerhaft in kleiner fester Schriftgr\u00f6\u00dfe (font_size \u2212 2), skaliert nicht mit dem Titel<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sektionsleiste neu<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>7 QPushButton-Segmente statt custom paintEvent<\/li>\n\n\n\n<li>Gestalt-basierte Farbgebung: O\/M\/C (strukturelle Marker) in Rot, 1\/3 in hellem Grau, 2\/4 in dunklem Grau \u2014 Muster des Singing Calls wird sofort visuell erkennbar<\/li>\n\n\n\n<li>Farben \u00fcber neue Skin-Keys <code>sec_o<\/code>, <code>sec_1<\/code>, <code>sec_2<\/code>, <code>sec_m<\/code>, <code>sec_3<\/code>, <code>sec_4<\/code>, <code>sec_c<\/code> \u2014 in allen 4 Skins hinterlegt (default, light, win11, elegant)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Transport-Buttons: SVG-Icons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Play, Pause, Stop und Fade-Out erhalten SVG-Vektorsymbole<\/li>\n\n\n\n<li>Farbe der Icons folgt dynamisch der Theme-Einstellung <code>button_text<\/code> \u2014 keine separaten SVG-Dateien pro Theme n\u00f6tig<\/li>\n\n\n\n<li>Fade-Out-Pfeil zeigt nach rechts (\u2192)<\/li>\n\n\n\n<li>Play-Button: volle Breite, Mindesth\u00f6he 44 px, Akzentfarbe aus dem Theme<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Theme-relative Schriftgr\u00f6\u00dfen im Info-Streifen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alle Schriftgr\u00f6\u00dfen relativ zur <code>font_size<\/code>-Einstellung des Skins<\/li>\n\n\n\n<li>Beschriftungs-Labels: <code>font_size \u2212 2<\/code> px<\/li>\n\n\n\n<li>Wert-Labels (BPM, Loops): <code>font_size + 1<\/code> px<\/li>\n\n\n\n<li>Dauer-Timer: <code>font_size + 2<\/code> px, monospace fett<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Platzsparende Anpassungen (Laptop-Optimierung)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Loop-Widget<\/strong>: Button-H\u00f6hen von 52 px auf 38 px reduziert, NEU-Button von 38 auf 32 px, Spacing von 6 auf 4 px, <code>addStretch()<\/code> am unteren Rand entfernt, Bottom-Margin auf 4 px gek\u00fcrzt \u2014 spart ~100\u2013120 px Gesamth\u00f6he<\/li>\n\n\n\n<li><strong>Programm-Button<\/strong> im Info-Streifen: H\u00f6he auf max. 24 px begrenzt, internes Padding reduziert<\/li>\n\n\n\n<li><strong>Songtitel-Bereich<\/strong>: maximale H\u00f6he auf 52 px gedeckelt (verhindert \u00fcberm\u00e4\u00dfigen Leerraum zwischen Titel und Spielzeit)<\/li>\n\n\n\n<li><strong>Mindesth\u00f6he Player-Widget<\/strong>: 380 px (zuvor 420 px)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.67 \u2014 Crash-Handler, Media-Tasten, Bugfixes (2026-05-01)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neu: Crash-Handler (BL-103)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Modul <code>crash_handler.py<\/code>: f\u00e4ngt unbehandelte Python-Exceptions automatisch ab<\/li>\n\n\n\n<li>Bei jedem Absturz wird <code>crash_YYYYMMDD_HHMMSS.log<\/code> im App-Verzeichnis gespeichert<\/li>\n\n\n\n<li>Log enth\u00e4lt: Zeitstempel, Song, Lokation, vollst\u00e4ndiger Stacktrace, die letzten 25 Benutzeraktionen (Ring-Buffer)<\/li>\n\n\n\n<li>Beim n\u00e4chsten App-Start erscheint ein Hinweis-Dialog mit \u201eProtokoll anzeigen&#8220;-Button (\u00f6ffnet Texteditor)<\/li>\n\n\n\n<li>Geloggte Aktionen: Song aus Liste geladen, Song aus Playlist geladen, Play gestartet, Lokation gewechselt, Planner Confirm<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Media- und Fn-Tasten als Rule-Trigger<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Volume+, Volume\u2212, Mute, Media Play\/Pause, Media Stop, Media Next, Media Previous, Brightness+, Brightness\u2212 sind jetzt als Trigger in der Rule Engine verf\u00fcgbar<\/li>\n\n\n\n<li>Abfang per App-weitem EventFilter (analog zu F13\u2013F24) \u2014 funktioniert wenn das OS die Tasten nicht systemweit schluckt<\/li>\n\n\n\n<li>Neues Diagnoseskript <code>2_Test\/key_monitor.py<\/code> (+ <code>.bat<\/code>): zeigt f\u00fcr jede gedr\u00fcckte Taste Key-Code, Trigger-Name und ob Callers Caddy sie verarbeiten w\u00fcrde \u2014 hilfreich beim Einrichten von Stream Deck \/ Funk-Fernbedienungen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Statistik-Dock: Kontextmen\u00fc (BL-102)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rechtsklick auf einen Song in den Listen TOP \/ FLOP \/ Nie gespielt \u00f6ffnet ein Kontextmen\u00fc<\/li>\n\n\n\n<li><strong>\u201eZur Playlist hinzuf\u00fcgen&#8220;<\/strong> \u2192 Song landet direkt in der aktuellen Playlist<\/li>\n\n\n\n<li><strong>\u201eZu Notizen hinzuf\u00fcgen&#8220;<\/strong> \u2192 f\u00fcgt einen <code>[load_song \"Titel\"]<\/code>-Shortcode als neue Notiz ein<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TIC-0019<\/strong> Planner: Loop-Daten wurden nach Rule-Ausf\u00fchrung nicht aktualisiert \u2014 Loop-Anzahl-Dialog liest Daten jetzt frisch aus der DB<\/li>\n\n\n\n<li><strong>TIC-0020<\/strong> Tanzprogramme verwalten: Spaltenheader \u201eZiel-Dauer (min)&#8220; wurde abgeschnitten \u2014 Spalte passt sich jetzt automatisch an den Header-Text an<\/li>\n\n\n\n<li><strong>TIC-0021<\/strong> Statistik-Dock: alternierende Zeilenfarben hatten zu wenig Kontrast \u2014 <code>alternate-background-color<\/code> jetzt f\u00fcr alle 4 Skins definiert<\/li>\n\n\n\n<li>Statistik-Dock \u2192 \u201eZu Notizen hinzuf\u00fcgen&#8220; crashte wenn das Notizen-Dock noch nie ge\u00f6ffnet war (<code>notes_widget<\/code> noch nicht lazy-initialisiert) \u2014 Fix: synchrone Init vor dem Zugriff (vom Crash-Handler in der eigenen Sitzung gefunden)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.66 \u2014 Bugfixes (TIC-0015, TIC-0017, TIC-0018) (2026-04-30)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TIC-0015<\/strong> Lyrics-Zoom-Stufe wird jetzt beim App-Start korrekt wiederhergestellt \u2014 Zoom-Wert und Auto-Size-Zustand werden in der INI gespeichert und beim n\u00e4chsten Start sofort angewendet<\/li>\n\n\n\n<li><strong>TIC-0017<\/strong> Loop-Count-Dialog im Planner findet Songs jetzt auch in Musikordnern Slot 2\u20134 \u2014 Funktion <code>show_loop_count_dialog<\/code> nutzt jetzt <code>find_song_file()<\/code> statt nur Slot 1<\/li>\n\n\n\n<li><strong>TIC-0018<\/strong> Rule-Aktion \u201eLoad Layout&#8220;: Dropdown zeigt jetzt alle gespeicherten Layouts aus dem <code>skins\/<\/code>-Ordner \u2014 <code>layout_names_provider<\/code> angebunden, TODO-Stub ersetzt<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.65 \u2014 Statistik-Dock (BL-019) (2026-04-29)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neues Dock: Statistik<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues andockbares, lazy geladenes Fenster \u201eStatistik&#8220; im Ansicht-Men\u00fc (tabbiert mit Reports)<\/li>\n\n\n\n<li><strong>Filter<\/strong> (oben): Lokation (Alle oder einzelne), Typ (Beide \/ Pattern \/ Singing), Zeitraum (Alle Zeit \/ 5 Jahre \/ 1 Jahr \/ 3 Monate \/ 1 Monat)<\/li>\n\n\n\n<li><strong>Drei Spalten<\/strong> (scrollbar, alle Songs ohne Limit):<\/li>\n\n\n\n<li><strong>TOP<\/strong> \u2014 alle gespielten Songs, meistgespielt zuerst, mit Abspielanzahl<\/li>\n\n\n\n<li><strong>FLOP<\/strong> \u2014 alle gespielten Songs, wenigstgespielt zuerst, mit Abspielanzahl<\/li>\n\n\n\n<li><strong>Nie gespielt<\/strong> \u2014 alle Songs ohne Play in den aktuellen Filtern, alphabetisch<\/li>\n\n\n\n<li><strong>Doppelklick<\/strong> auf einen Song springt direkt zur Songliste<\/li>\n\n\n\n<li><strong>Histogramm<\/strong> (volle Breite): Verteilung aller Songs nach Abspielanzahl<\/li>\n\n\n\n<li>Bin 0 ist immer fest f\u00fcr \u201enie gespielt&#8220;, danach 9 logarithmisch verteilte Bins<\/li>\n\n\n\n<li>Farbgradient von Blau (kalt = selten) bis Orange-Rot (hei\u00df = oft gespielt), unabh\u00e4ngig vom Skin<\/li>\n\n\n\n<li>Tooltip auf jedem Balken zeigt Bin-Bereich, Anzahl Songs und bis zu 5 Beispiel-Titel<\/li>\n\n\n\n<li>\u00dcbersetzungen DE + EN vollst\u00e4ndig vorhanden<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.64 \u2014 First-Steps-Paket, Tutorial-\u00dcberholung, Playlist-Verbesserungen (2026-04-28)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Beispielprojekt f\u00fcr Neueinsteiger (first-steps\/)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>first-steps\/-Ordner<\/strong> wird in jeder Neuinstallation mitgeliefert<\/li>\n\n\n\n<li>Enth\u00e4lt \u201eYRR 049 &#8211; Electro Blues.mp3&#8243; von Jon Hansell Nilsson (freundlicherweise zur Verf\u00fcgung gestellt) und das passende Lyricsheet \u201eYRR 049 &#8211; Electro Blues.htm&#8220;. <a href=\"https:\/\/hansellnilsson.wixsite.com\/yellowrockrecords\" target=\"_blank\" rel=\"noreferrer noopener\">Yellow Rock Records<\/a> bietet kostenlose Pattern-Musik an. Unbedingt ausprobieren.<\/li>\n\n\n\n<li>Das Lyricsheet thematisiert auf witzige Weise die Funktionen von Callers Caddy<\/li>\n\n\n\n<li><code>build.py<\/code>: Schritt 3 kopiert <code>1_Source\/first-steps\/<\/code> automatisch in den App-Ordner<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tutorial: New Songs Tour (komplett \u00fcberarbeitet)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Umbenannt<\/strong> von \u201eLoop-Tour&#8220; zu \u201eNew Songs Tour&#8220;<\/li>\n\n\n\n<li><strong>Men\u00fcreihenfolge<\/strong>: New Songs Tour jetzt direkt nach Player-Tour (Prio 97), <a href=\"https:\/\/callerscaddy.de\/loop-finder\/\">Loop Finder direkt darunter<\/a> (Prio 96), Beat Snap danach<\/li>\n\n\n\n<li><strong>Step 1<\/strong> (Import-Button): Expliziter Handlungsaufruf mit Schritt-f\u00fcr-Schritt-Anleitung durch die drei Import-Dialoge \u2014 Songtyp \u201eBeides&#8220;, Kopieren, Einzeldateien aus first-steps\/<\/li>\n\n\n\n<li><strong>Step 2<\/strong> (Auto-Loop): Loop Finder als zweiter Schritt statt manuellem In\/Out-Setzen \u2014 manuelle Buttons und Beat Snap aus dem Tutorial entfernt<\/li>\n\n\n\n<li><strong>Song-Daten-Tutorial<\/strong> um Step 4 erweitert: \u201eLyricsheet verkn\u00fcpfen&#8220; mit Hinweis auf first-steps-HTM<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Songliste: Song zur Playlist hinzuf\u00fcgen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u2192 Playlist-Button<\/strong> unterhalb der Songliste (neben \u201eListe aktualisieren&#8220; und \u201e\u2192 Notiz&#8220;)<\/li>\n\n\n\n<li><strong>Rechtsklick-Kontextmen\u00fc<\/strong> der Songliste: neuer Eintrag \u201eZur Playlist hinzuf\u00fcgen&#8220;<\/li>\n\n\n\n<li>\u201e\u2192 Notiz&#8220;-Button von der Suchzeile nach unten in die Button-Leiste verschoben<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Playlist: Songs entfernen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u2715-Button<\/strong> neben den Pfeiltasten \u25b2 \u25bc entfernt den markierten Song sofort<\/li>\n\n\n\n<li><strong>Rechtsklick-Kontextmen\u00fc<\/strong>: \u201eAus Playlist entfernen&#8220; ganz oben (vor Separator)<\/li>\n\n\n\n<li><strong>Entf-Taste<\/strong>: QShortcut mit <code>WidgetWithChildrenShortcut<\/code>-Kontext \u2014 funktioniert unabh\u00e4ngig davon, welches Kind-Widget Fokus hat<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.63 \u2014 LoopFinder Lazy Init, Mapping Export\/Import, Sequenzen Export (2026-04-27)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">LoopFinder: Lazy Initialisierung<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>LoopFinderWidget<\/code> wird nicht mehr beim Start erstellt, sondern erst beim ersten \u00d6ffnen des Fensters<\/li>\n\n\n\n<li>Spart ~100ms Startzeit auf schwacher Hardware (Notebook: addDockWidget war 106ms)<\/li>\n\n\n\n<li>Waveform + Sprungbereiche werden beim \u00d6ffnen sofort angezeigt (kein manuelles \u201eAnalysieren&#8220; n\u00f6tig f\u00fcr die Vorschau)<\/li>\n\n\n\n<li>Song-Info wird nachgereicht falls beim \u00d6ffnen bereits ein Song geladen ist<\/li>\n\n\n\n<li><code>setFloating<\/code> und <code>restoreGeometry<\/code> des Dock-Fensters ebenfalls per <code>QTimer.singleShot<\/code> nach <code>show()<\/code> verschoben<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Mapping Export\/Import (Sequenzen-Men\u00fc)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mapping exportieren\u2026<\/strong>: Speichert alle <code>call_text_mappings<\/code> als JSON-Datei (<code>call_text<\/code>, <code>entity_id<\/code>, <code>mapped_by<\/code>)<\/li>\n\n\n\n<li><strong>Mapping importieren\u2026<\/strong>: Liest JSON, f\u00fcgt neue Eintr\u00e4ge ein (<code>INSERT OR IGNORE<\/code>), \u00fcberspringt bereits vorhandene<\/li>\n\n\n\n<li>R\u00fcckmeldung: \u201eX neue Mappings importiert, Y bereits vorhanden (\u00fcbersprungen)&#8220;<\/li>\n\n\n\n<li>Bei neuen Eintr\u00e4gen wird automatisch Remapping angesto\u00dfen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sequenzen exportieren (JSON)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Men\u00fcpunkt <strong>Sequenzen exportieren (JSON)\u2026<\/strong> nach den drei Import-Punkten<\/li>\n\n\n\n<li>Exportiert alle Sequenzen im exakt gleichen Format wie der JSON-Import erwartet (<code>id<\/code>, <code>calls<\/code>, <code>level<\/code>, <code>seq_type<\/code>, <code>difficulty<\/code>)<\/li>\n\n\n\n<li>Exportierte Datei kann direkt wieder per \u201eSequenzen importieren (JSON)&#8220; eingelesen werden<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">UI-Detail<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pfeil-Buttons (\u25c0 \u25b6) und Note-Button im Sequence-Detail-Fenster haben jetzt einheitliche H\u00f6he (40px) \u2014 bessere Treffsicherheit am Laptop<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Projektdokumentation<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CLAUDE.md<\/code>: <code>setFloating(True)<\/code> auf Windows kostet ~90ms (einmalig pro Floating-Dock-Kontext) \u2014 wandert nur zwischen Buckets wenn man es defer&#8217;t, spart keine Gesamtzeit<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.62 \u2014 CallMatcher &amp; Sequenz-UI-Verbesserungen (2026-04-27)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Call-Mapping: Intelligenter Auto-Vorschlag (CallMatcher)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Drei-Stufen-Matching vollst\u00e4ndig in <code>sequence_mapper.py<\/code> ausgelagert \u2014 keine API-Kosten, l\u00e4uft lokal in Millisekunden<\/li>\n\n\n\n<li><strong>Stufe 1<\/strong>: Exakter Vergleich nach Normalisierung (Pr\u00e4fixe\/Suffixe entfernt) \u2192 Score 1.0<\/li>\n\n\n\n<li><strong>Stufe 2<\/strong>: Bidirektionaler Token-Overlap (geometrisches Mittel aus Precision \u00d7 Recall) \u2192 Score bis 0.92<\/li>\n\n\n\n<li><strong>Stufe 3<\/strong>: <code>difflib.SequenceMatcher<\/code> als Fallback (nur wenn Token-Score \u2265 0.30) \u2192 Score bis 0.85<\/li>\n\n\n\n<li><strong>Farbcodierung<\/strong> der Call-Text-Zeilen im Mapping-Dialog:<\/li>\n\n\n\n<li>\ud83d\udfe2 Gr\u00fcn (Score \u2265 0.85): sicherer Vorschlag<\/li>\n\n\n\n<li>\ud83d\udfe1 Gelb (Score 0.50\u20130.84): unsicherer Vorschlag, manuelle Pr\u00fcfung empfohlen<\/li>\n\n\n\n<li>\ud83d\udd34 Rot (Score &lt; 0.50): kein brauchbarer Vorschlag<\/li>\n\n\n\n<li>Gr\u00fcn auch f\u00fcr bereits gemappte Eintr\u00e4ge<\/li>\n\n\n\n<li>Altes <code>_normalize_call_text<\/code>\/<code>_norm_index<\/code>-System in <code>main.py<\/code> durch <code>CallMatcher<\/code>-Import ersetzt<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sequenz-Tabelle: UX-Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Level-, Type- und Difficulty-Spalten <strong>ausgeblendet<\/strong> (<code>setColumnHidden<\/code>) \u2014 Sequenz f\u00fcllt die volle Tabellenbreite<\/li>\n\n\n\n<li>Type-Filter-Dropdown startet mit <strong>\u201eSinger (Corner progression)&#8220;<\/strong> als Standardwert (h\u00e4ufigster Typ)<\/li>\n\n\n\n<li>Bugfix: <code>ResizeToContents<\/code> bei Type-Spalte lie\u00df die Sequenz-Spalte schrumpfen wenn viele Zeilen denselben langen Typ hatten<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance-Logging<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Messpunkte: <code>SequencesWidget<\/code> und <code>SequenceViewWidget<\/code> getrennt gemessen<\/li>\n\n\n\n<li>Neuer Messpunkt: <code>_build_menu<\/code> (war bisher in <code>song_list.refresh<\/code> versteckt)<\/li>\n\n\n\n<li>Neuer Messpunkt: <code>_init_sequences<\/code> intern aufgeteilt (<code>load_sequences<\/code> + <code>sequence_view prefill<\/code>)<\/li>\n\n\n\n<li>Bugfix: LoopFinder-Split zeigte f\u00e4lschlicherweise Notizen-Zeit mit an (<code>_td10<\/code> \u2192 <code>_td10b<\/code>)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.61 \u2014 Sequenzen Import &amp; Call-Mapping (2026-04-26)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Sequenz-Tabelle erweitert<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Spalten <code>type<\/code> und <code>difficulty<\/code> in der <code>sequences<\/code>-Tabelle (Migration idempotent)<\/li>\n\n\n\n<li><code>insert_sequence()<\/code> nimmt jetzt <code>seq_type<\/code> und <code>difficulty<\/code> entgegen<\/li>\n\n\n\n<li>Neue DB-Methoden: <code>get_sequence_type_values()<\/code>, <code>get_sequence_difficulty_values()<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sequenz-UI erweitert<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tabelle: von 3 auf 4 Spalten \u2014 <strong>Sequenz<\/strong> (Stretch, sofort sichtbar), Level, Typ, Schwierigkeit<\/li>\n\n\n\n<li>Zweite Filter-Zeile mit <strong>Typ<\/strong>&#8211; und <strong>Schwierigkeit<\/strong>-Dropdown<\/li>\n\n\n\n<li>Alle Filter (Contains, Limit, Typ, Difficulty) greifen konsistent in Tabelle, Navigation und Shortcodes<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Import-Formate im Men\u00fc \u201eSequenzen&#8220;<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>JSON-Import<\/strong> (<code>import_from_json<\/code>): l\u00e4dt eine oder mehrere JSON-Dateien, h\u00e4ngt Sequenzen an<\/li>\n\n\n\n<li><strong>CSDS-Import<\/strong> (<code>import_from_csds<\/code>): l\u00e4dt Vic Ceder&#8217;s <code>.in<\/code>\/<code>.csds<\/code>-Exportformat; parst <code>#EASY#<\/code>\/<code>#REC=<\/code>\/<code>#SEQTYPE=<\/code>-Metadaten und bereinigt <code>&lt;C ALT=\"...\"&gt;text&lt;\/C&gt;<\/code>-Markup automatisch<\/li>\n\n\n\n<li>Deduplizierung \u00fcber Ceder-Record-ID beim Mehrfach-Import<\/li>\n\n\n\n<li>Letztes Import-Verzeichnis wird in den Settings gemerkt<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Call-Mapping-Dialog<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Men\u00fcpunkt <strong>\u201eCall-Mapping\u2026&#8220;<\/strong> im Sequenzen-Men\u00fc<\/li>\n\n\n\n<li>Tabelle aller ungemappten Call-Texte, sortiert nach <strong>H\u00e4ufigkeit<\/strong> (h\u00e4ufigste zuerst \u2014 ein Eintrag kann viele Sequenzen auf einmal heilen)<\/li>\n\n\n\n<li>Rechte Spalte: editierbare ComboBox mit Contains-Autocomplete \u2014 \u00f6ffnet sich erst beim Klick (Delegate, kein Voraus-Rendering)<\/li>\n\n\n\n<li><strong>Lazy Loading<\/strong>: nur 20 Zeilen initial, weitere beim Scrollen ans Ende<\/li>\n\n\n\n<li>Gelbe Markierung f\u00fcr Texte ohne Auto-Vorschlag<\/li>\n\n\n\n<li><strong>Auto-Vorschlag<\/strong> durch normalisierten Textvergleich: Pr\u00e4fixe (Heads\/Sides\/Centers\/Boys\/Girls\u2026) und Suffixe (Zahlen, Br\u00fcche, Klammern) werden abgeschnitten<\/li>\n\n\n\n<li>Sonderoption <strong>\u201e\u2192 An Komma aufteilen&#8220;<\/strong>: Calls wie <code>\"Flutter Wheel, Sweep 1\/4\"<\/code> werden direkt in den Sequenzen gesplittet \u2014 nachfolgende Felder r\u00fccken automatisch nach rechts<\/li>\n\n\n\n<li>Sondereintrag <strong>\u201eFiller Words&#8220;<\/strong> (TO=0.001) f\u00fcr F\u00fcllphrosen die kein echtes Level haben \u2014 verhindert NULL bei der Levelberechnung ohne das Ergebnis zu verf\u00e4lschen<\/li>\n\n\n\n<li>Nach dem Speichern wird automatisch <code>recompute_sequence_max_to()<\/code> angesto\u00dfen<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.60 \u2014 F13\u2013F24 Tasten-Trigger (2026-04-25)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Erweiterte F-Tasten-Unterst\u00fctzung<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>F13\u2013F24<\/strong> sind jetzt vollwertige Rule-Trigger \u2014 erscheinen im Trigger-Dropdown des Rule-Editors<\/li>\n\n\n\n<li>Capture-Dialog erkennt F13\u2013F24 beim Dr\u00fccken korrekt und zeigt sie als \u201eF13&#8243; etc. an<\/li>\n\n\n\n<li>Abfang \u00fcber den App-weiten EventFilter (zuverl\u00e4ssiger als QKeySequence-Strings, die Qt f\u00fcr F13+ nicht parst)<\/li>\n\n\n\n<li>N\u00fctzlich f\u00fcr USB-Fernbedienungen und Makro-Pads, die erweiterte F-Tasten senden<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.59 \u2014 Shortcodes in Notizen &amp; Rule-Editor Gruppen (2026-04-24)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Shortcodes in Notizen (BL-093)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Shortcode-Syntax<\/strong> in Notizen: <code>[load_song \"Titel\"]<\/code> l\u00e4dt ein Lied; <code>[sequence_view id=42]<\/code> \/ <code>[sequence_view contains=\"Swing Thru\" limit=\"MS\"]<\/code> \u00f6ffnet die Sequenzansicht mit optionalem Filter<\/li>\n\n\n\n<li>Shortcodes werden ausgel\u00f6st beim <strong>manuellen Abhaken<\/strong> einer Notiz sowie via <code>notes_tick_top<\/code>-Regel<\/li>\n\n\n\n<li>Neues Modul <code>shortcode_parser.py<\/code> mit robustem Regex-Parser (positionale und benannte Parameter, Integer-Erkennung)<\/li>\n\n\n\n<li><strong>\u2192 Notiz Button<\/strong> in Songliste, Playlist, Sequenz-\u00dcbersicht und Sequenz-Detail: f\u00fcgt den aktuellen Eintrag als Shortcode in die Notizliste ein<\/li>\n\n\n\n<li><strong>\u2192 Filter Button<\/strong> in Sequenz-\u00dcbersicht: f\u00fcgt die aktiven Contains\/Limit-Filter als <code>[sequence_view]<\/code>-Shortcode ein<\/li>\n\n\n\n<li><strong>Rechtsklick-Men\u00fc<\/strong> (Context-Menu) in Songliste, Playlist und Sequenz-Tabelle: \u201eZu Notizen hinzuf\u00fcgen&#8220;<\/li>\n\n\n\n<li>Warnung wenn keine Lokation gew\u00e4hlt und Notiz eingef\u00fcgt werden soll<\/li>\n\n\n\n<li>Songtitel wird ohne Anzeige-Suffixe (Typ, Label, Qualit\u00e4t) in den Shortcode \u00fcbernommen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rule-Editor: Aktionen gruppiert<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die 43 Regelaktionen sind jetzt in <strong>10 Kategorien<\/strong> gegliedert: Transport \u00b7 Audio \u00b7 Layout &amp; Docks \u00b7 Lyrics &amp; Scroll \u00b7 Sequence View \u00b7 Notes \u00b7 Workflow \u00b7 Photo \u00b7 Genre \u00b7 Info &amp; Warnings<\/li>\n\n\n\n<li>Nicht-ausw\u00e4hlbare Gruppenheader im Aktions-Dropdown f\u00fcr bessere \u00dcbersicht<\/li>\n\n\n\n<li>Reihenfolge der Aktionen innerhalb der Gruppen logisch sortiert<\/li>\n\n\n\n<li>Bestehende Rules bleiben vollst\u00e4ndig kompatibel \u2014 nur die Anzeige \u00e4ndert sich<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.58 \u2014 Sequence Detail als echtes Dock (2026-04-24)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Sequence Detail als QDockWidget (BL-092)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>dock_sequence_view<\/code><\/strong> ist jetzt ein vollwertiges Dock-Widget \u2014 kein tempor\u00e4rer Popup-Dialog mehr<\/li>\n\n\n\n<li>Kann wie alle anderen Docks behandelt werden: <code>dock_open<\/code>, <code>dock_close<\/code>, <code>dock_fullsize<\/code>, <code>dock_focus<\/code>, <code>dual_view<\/code>, Layout-Save\/Restore<\/li>\n\n\n\n<li>Klick auf eine Zeile in der Sequenz\u00fcbersicht aktualisiert das Detail-Dock und bringt es in den Vordergrund<\/li>\n\n\n\n<li>Im Regel-Editor unter dem Kurzname <strong><code>sequence_view<\/code><\/strong> verf\u00fcgbar (z.B. <code>dual_view<\/code> mit <code>dock_left=sequences<\/code> + <code>dock_right=sequence_view<\/code>)<\/li>\n\n\n\n<li><code>sequenceview_maximize<\/code> \u00f6ffnet das Dock als schwebendes 90 %-Fenster \u2014 kein Konflikt mehr mit dem Dual-View<\/li>\n\n\n\n<li>Navigation (\u25c0\/\u25b6, Tastatur \u2190 \u2192) bleibt erhalten; <code>sequenceview_prev<\/code>\/<code>sequenceview_next<\/code>-Regelaktionen steuern das Dock direkt<\/li>\n\n\n\n<li>Alle Regel-Aktionsnamen durchgehend Englisch: <code>sequenceview_*<\/code> (statt <code>sequenzview_*<\/code>)<\/li>\n\n\n\n<li><strong>Filter-Sync<\/strong>: \u00c4ndert der Nutzer den Contains- oder Limit-Filter in der Sequenz\u00fcbersicht, springt das Detail-Dock automatisch auf die erste Sequenz der neuen Ergebnisliste (nur wenn das Dock sichtbar ist)<\/li>\n\n\n\n<li><strong>Startup-Vorbef\u00fcllung<\/strong>: Beim App-Start wird das Detail-Dock sofort mit Sequenz 1 gef\u00fcllt \u2014 kein leeres Fenster beim ersten \u00d6ffnen<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.57 \u2014 SequenzView Navigation &amp; Vollbild (2026-04-24)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">SequenzView \u2014 Navigation ohne Dialog zu schlie\u00dfen (BL-089)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u2039 \/ \u203a Buttons<\/strong> in der Sequenzansicht: bl\u00e4ttert durch die aktuell gefilterte Liste<\/li>\n\n\n\n<li><strong>Positions-Anzeige<\/strong> \u201e3 \/ 12&#8243; zwischen den Buttons \u2014 Caller sieht sofort wo er in der Liste steht<\/li>\n\n\n\n<li><strong>Tastatur-Support<\/strong>: \u2190 \/ \u2192 Pfeiltasten navigieren ebenfalls (ideal f\u00fcr freihandigen Betrieb)<\/li>\n\n\n\n<li>Buttons werden am Anfang bzw. Ende der Liste automatisch deaktiviert<\/li>\n\n\n\n<li>Navigation bezieht sich immer auf die vollst\u00e4ndige gefilterte Liste (nicht nur geladene Zeilen)<\/li>\n\n\n\n<li>Neue DB-Methode <code>get_filtered_sequence_ids()<\/code> liefert alle passenden IDs f\u00fcr die Navigation<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">SequenzView \u2014 Auto-Zoom &amp; freie Fenstergr\u00f6\u00dfe (BL-090)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Frei vergr\u00f6\u00dferbar<\/strong>: Dock kann beliebig gro\u00df gezogen werden<\/li>\n\n\n\n<li><strong>Mitwachsende Schrift<\/strong>: Schriftgr\u00f6\u00dfe der Calls passt sich automatisch an die verf\u00fcgbare Fensterh\u00f6he an \u2014 Sequenz f\u00fcllt das Fenster optimal aus<\/li>\n\n\n\n<li><strong>\u25c0 \/ \u25b6 Buttons<\/strong> in einheitlicher Gr\u00f6\u00dfe (font-size 16px)<\/li>\n\n\n\n<li><strong>Position-Label<\/strong> \u201eX \/ N&#8220; verwendet die Schriftfarbe des aktiven Themes<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">SequenzView \u2014 Rule-Aktionen (BL-091)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>sequenzview_open<\/code><\/strong>: zeigt das Detail-Dock mit der aktuellen Tabellenauswahl<\/li>\n\n\n\n<li><strong><code>sequenzview_close<\/code><\/strong>: versteckt das Detail-Dock<\/li>\n\n\n\n<li><strong><code>sequenzview_prev<\/code> \/ <code>sequenzview_next<\/code><\/strong>: bl\u00e4ttert per Rule\/<a href=\"https:\/\/callerscaddy.de\/press-any-key\/\">Tastenk\u00fcrzel zur vorherigen<\/a>\/n\u00e4chsten Sequenz<\/li>\n\n\n\n<li><strong><code>sequenzview_focus<\/code><\/strong>: bringt das Detail-Dock in den Vordergrund<\/li>\n\n\n\n<li><strong><code>sequenzview_maximize<\/code><\/strong>: macht das Detail-Dock als schwebendes 90%-Fenster<\/li>\n\n\n\n<li><strong>Auto-Zoom bidirektional<\/strong>: Schriftgr\u00f6\u00dfe wird auch nach oben korrigiert wenn der erste Sch\u00e4tzwert zu konservativ war<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.56 \u2014 Dual-View &amp; Songlisten-Schnellnavigation (2026-04-23)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Dual-View: zwei Widgets nebeneinander (BL-077)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neue Regel-Aktion <code>dual_view<\/code><\/strong>: \u00d6ffnet zwei beliebige Docks als schwebende Fenster nebeneinander \u2014 zusammen 90 % Bildschirmbreite und -h\u00f6he, zentriert mit 4 px Abstand<\/li>\n\n\n\n<li><strong>Flexibles Breitenverh\u00e4ltnis<\/strong>: Auswahl aus <code>50:50<\/code>, <code>33:67<\/code> oder <code>67:33<\/code> direkt im Regel-Editor<\/li>\n\n\n\n<li><strong>Neue Aktion <code>dual_view_close<\/code><\/strong>: Schlie\u00dft beide Dual-View-Fenster und dockt sie zur\u00fcck<\/li>\n\n\n\n<li><strong>Neue Aktion <code>dual_view_toggle<\/code><\/strong>: <a href=\"https:\/\/callerscaddy.de\/dual-view\/\">Ein Tastendruck \u00f6ffnet den Dual-View<\/a> (Layout wird automatisch gesichert), ein zweiter Tastendruck stellt das urspr\u00fcngliche Layout exakt wieder her \u2014 ideal als Keyboard-Shortcut<\/li>\n\n\n\n<li>Alle drei Aktionen erscheinen mit englischen Display-Namen im Regel-Editor; Parameter <code>dock_left<\/code>, <code>dock_right<\/code> und <code>split<\/code> als gewohnte Dropdowns<\/li>\n\n\n\n<li>H\u00e4ufigste Kombination: Lyrics links + Sequenzen rechts, 50:50<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.55 \u2014 Planner-Loop-Dialog &amp; Doppelklick-Fix (2026-04-22)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Planner: Loop-Dialog mit Ziel-Patternl\u00e4nge vorbelegt (BL-085)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Loop-Count-Dialog<\/strong> im Planner und im Playlist-Widget \u00fcbernimmt jetzt automatisch die Ziel-Patternl\u00e4nge des aktiven Tanzprogramms als Voreinstellung (statt fest 7 min)<\/li>\n\n\n\n<li>Ist kein Tanzprogramm gesetzt, bleibt der Standardwert 7 min<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Playlist-Widget: Doppelklick auf Loops-Spalte (BL-085)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Doppelklick auf die Loops-Spalte<\/strong> im Playlist-Dock \u00f6ffnet jetzt denselben Loop-Count-Dialog wie im Planner \u2014 Anzahl und Zeitvorgabe direkt editierbar<\/li>\n\n\n\n<li>Zuverl\u00e4ssige Ausl\u00f6sung \u00fcber <code>mouseDoubleClickEvent<\/code>-Override in <code>_PlaylistTable<\/code>, der einen bekannten Qt-6-Timing-Konflikt zwischen DragDrop-Modus und <code>cellDoubleClicked<\/code>-Signal umgeht<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">0.54 \u2014 Tanzprogramm-System &amp; Lokations-Erweiterungen (2026-04-22)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Tanzprogramm-Anzeige im Player (BL-083)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Button <code>btn_program<\/code><\/strong> in der Player-Info-Zeile (neben BPM): zeigt das aktuell eingestellte Tanzprogramm-K\u00fcrzel an (z.B. <code>MS<\/code>, <code>A1 Class<\/code>)<\/li>\n\n\n\n<li><strong>Schnellauswahl-Dialog<\/strong>: Klick auf den Button \u00f6ffnet ein Grid aller konfigurierten Programme als Schaltfl\u00e4chen \u2014 Button-Breite passt sich automatisch an den l\u00e4ngsten Text an<\/li>\n\n\n\n<li><strong>14 Default-Programme<\/strong>: MS, MS Class, PL, PL Class, A1, A1 Class, A2, A2 Class, C1, C1 Class, C2, C2 Class, C3A, C3A Class \u2014 je mit konfigurierbarer Ziel-Patternl\u00e4nge (Standard 7 min)<\/li>\n\n\n\n<li><strong>Verwaltungsdialog<\/strong> \u00fcber Men\u00fc <em>Datenbank \u2192 Tanzprogramme verwalten<\/em>: Programme anlegen, umbenennen, Reihenfolge und Ziel-Patternl\u00e4nge anpassen, l\u00f6schen<\/li>\n\n\n\n<li>Neue DB-Tabelle <code>dance_programs<\/code>; bestehende Installationen erhalten die Default-Programme automatisch beim n\u00e4chsten Start (INSERT OR IGNORE)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Lokations-Einstellungen: Tanzprogramm &amp; tempor\u00e4res Tempo (BL-084 + BL-086)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer \u201eEinstellungen&#8220;-Button<\/strong> im Lokations-Dialog: \u00f6ffnet einen Einstellungs-Dialog f\u00fcr die gew\u00e4hlte Lokation<\/li>\n\n\n\n<li><strong>Tanzprogramm-Zuweisung pro Lokation<\/strong>: Beim W\u00e4hlen einer Lokation wird das gespeicherte Tanzprogramm automatisch im Player eingestellt<\/li>\n\n\n\n<li><strong>Tempor\u00e4res Tempo pro Lokation<\/strong>: SpinBox (50\u2013150 %, Standard 100 % = kein Einfluss). Bei Lokationswechsel wird der gespeicherte Wert automatisch in das Feld \u201eTempor\u00e4res Tempo&#8220; \u00fcbernommen \u2014 praktisch f\u00fcr Classes und Anf\u00e4nger-Gruppen mit fester Tempobremse<\/li>\n\n\n\n<li>Neue DB-Spalten <code>dance_program_id<\/code> und <code>temp_tempo<\/code> in der <code>locations<\/code>-Tabelle (Migration f\u00fcr Bestandsinstallationen)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.53 \u2014 Class Designer: Pr\u00fcfen &amp; Optimieren, Notizen-Feinschliff (2026-04-20)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Class Designer \u2014 Pr\u00fcfen &amp; Optimieren (neu)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u201ePr\u00fcfen&#8220;-Button<\/strong> in Spalte 3: l\u00f6st explizit \u00dcberlast\/Unterlast-F\u00e4rbung der Tagesheader und Abstandregel-Check aus<\/li>\n\n\n\n<li><strong>Orange Markierung<\/strong> f\u00fcr Teaches, die Prereq-Delay-Regeln verletzen (vorher rot) \u2014 klar abgegrenzt vom roten \u00dcberlast-Tagesheader<\/li>\n\n\n\n<li><strong>\u201eOptimieren&#8220;-Button<\/strong>: iterative Local Search (Best-Improvement Hill Climbing) auf dem bestehenden Plan \u2014 ersetzt keine Generator-Neubelegung, sondern r\u00e4umt Verst\u00f6\u00dfe und Lastungleichheiten nachtr\u00e4glich auf<\/li>\n\n\n\n<li>Zielfunktion: <code>Verst\u00f6\u00dfe \u00d7 10 000 + \u03a3(Last \u2212 \u00d8)\u00b2<\/code> \u2014 Constraint-Verst\u00f6\u00dfe dominieren hart, Lastvarianz wird darunter feinabgestimmt<\/li>\n\n\n\n<li>Respektiert manuelle Drag-\u00c4nderungen in Spalte 3<\/li>\n\n\n\n<li>Harte Constraints werden pro Move gepr\u00fcft: Prereq-Delay, Nachfolger-Delay, Repeat nach Teach, keine doppelten Repeats am selben Tag<\/li>\n\n\n\n<li>Konvergiert deterministisch (max. 200 Iterationen); typisch deutlich schneller<\/li>\n\n\n\n<li>Algorithmus-Einordnung (RCPSP \/ Sprint-Rebalancing) dokumentiert in <code>docs\/16_class_designer.md<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Class Designer \u2014 UX-Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Effort-Felder als Button-Reihe<\/strong> statt ComboBox: alle Fibonacci-Werte (1, 2, 3, 5, 8, 13 bzw. 0\u201313 bei Info) als Toggle-Buttons direkt sichtbar \u2014 ein Klick statt Dropdown \u00f6ffnen<\/li>\n\n\n\n<li><strong>Neue Eintr\u00e4ge hinter markiertem Element<\/strong>: Bei \u201e+ Call&#8220; und \u201e+ Info&#8220; wird das neue Element hinter dem aktuell selektierten eingef\u00fcgt (statt ans Ende) und automatisch markiert \u2014 kettenweises Einf\u00fcgen flie\u00dft nat\u00fcrlich<\/li>\n\n\n\n<li><strong>Effort-Filter in Spalte 2<\/strong>: Toggle-Button-Reihe <code>0 | 1 | 2 | 3 | 5 | 8 | 13<\/code> zwischen Toolbar und Planungstabelle. Standardm\u00e4\u00dfig alle aktiv \u2014 erm\u00f6glicht auf einen Blick zu pr\u00fcfen, ob Calls mit gleichem Aufwand auch \u00e4hnlich aufwendig sind<\/li>\n\n\n\n<li><code>n_evenings<\/code> wird im Col3-Widget gespeichert, damit Optimieren auch nach manuellen \u00c4nderungen mit dem richtigen Rahmen arbeitet<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Notizen-Widget \u2014 Darstellung &amp; Bearbeitung<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Oberste offene Notiz 4\u00d7 vergr\u00f6\u00dfert<\/strong> (BL-079): Die aktuell wichtigste Notiz wird prominent als gro\u00dfe, fette \u00dcberschrift angezeigt \u2014 Vergr\u00f6\u00dferungsfaktor in INI konfigurierbar (<code>notes\/first_note_factor<\/code>, Default 4.0)<\/li>\n\n\n\n<li><strong>Kompakter Zeilenabstand<\/strong> bei langem Mehrzeilen-Text: Das Label rendert Wort-Umbr\u00fcche jetzt selbst (statt \u00fcber Qt&#8217;s Standard-Lineheight) und nutzt ca. 90 % der Schriftgr\u00f6\u00dfe als Zeilenvorschub \u2014 spart bei der gro\u00dfen ersten Zeile erheblich Platz, ohne Descender abzuschneiden<\/li>\n\n\n\n<li><strong>Wortumbruch<\/strong> f\u00fcr sehr lange Notizen: Text umbricht sauber innerhalb der Zeile, Zeilenh\u00f6he w\u00e4chst mit<\/li>\n\n\n\n<li><strong>Doppelklick zum Bearbeiten<\/strong>: Linker Doppelklick auf eine Notizzeile \u00f6ffnet einen Edit-Dialog mit mehrzeiligem Textfeld \u2014 Theme-konform gestylt, Sprache folgt UI-Einstellung (DE\/EN), <code>Ctrl+Enter<\/code> best\u00e4tigt<\/li>\n\n\n\n<li><strong>Zoom-Buttons +\/\u2212<\/strong> weiterhin aktiv \u2014 die neue Rendering-Logik respektiert die Zoom-Stufe<\/li>\n\n\n\n<li>Neue DB-Methode <code>update_note_text(note_id, text)<\/code> in <code>song_db<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Regel-System<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neue Aktion <code>notes_tick_top<\/code><\/strong> (BL-080): Hakt die oberste offene Notiz der aktiven Lokation ab \u2014 n\u00fctzlich z.B. f\u00fcr Keyboard-Shortcuts oder Timer-Events. Bei leerer Liste stumm ignoriert (keine Fehlermeldung)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Interne Aufr\u00e4umarbeiten<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Helper-Widget <code>_ValueButtonRow<\/code> f\u00fcr exklusive Wert-Auswahl (wiederverwendbar f\u00fcr weitere diskrete Auswahlen)<\/li>\n\n\n\n<li>Helper <code>_insert_after_selected()<\/code> in Col2 \u2014 zentralisiert Einf\u00fcge-Logik<\/li>\n\n\n\n<li>Neue QLabel-Subklasse <code>_TightLabel<\/code> mit eigenem <code>paintEvent<\/code> + manuellem Wortumbruch f\u00fcr pr\u00e4zise Zeilenabstandskontrolle<\/li>\n\n\n\n<li>Neuer modaler Dialog <code>_NoteEditDialog<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.52 \u2014 Class Designer (Prototyp) &amp; Tracking-Fix (2026-04-17)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Class Designer \u2014 Erster Prototyp<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hinweis<\/strong>: Dies ist der <strong>erste Prototyp<\/strong> des Class Designers \u2014 weiterer Feinschliff ist definitiv n\u00f6tig<\/li>\n\n\n\n<li><strong>Gleichm\u00e4\u00dfigere Punkteverteilung pro Tag<\/strong>: Umstellung auf Greedy-Bin-Filling. Jeder Tag wird bis zum Zielbudget (Gesamt-Punkte \/ Anzahl Tage) aufgef\u00fcllt, bevor der n\u00e4chste Tag bef\u00fcllt wird<\/li>\n\n\n\n<li><strong>Repeat-Constraints respektiert<\/strong>: Wiederholungen derselben Figur halten weiterhin mind. 1 Tag Abstand; Prereq-Delays bleiben erhalten<\/li>\n\n\n\n<li><strong>Unterf\u00fcllte Tage vermieden<\/strong>: Wenn ein Repeat wegen <code>earliest<\/code>-Constraint vorspringt, bleibt der Tag-Zeiger zur\u00fcck \u2014 nachfolgende Teaches f\u00fcllen den freigebliebenen Tag auf, statt ihn leer zu lassen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Loop Finder \u2014 Zeit-Anzeige unter Suchbereichen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Spielzeiten unter den Prozent-Feldern<\/strong>: Unter jedem der 4 Prozent-Felder (Loop-In Start\/Ende, Loop-Out Start\/Ende) wird jetzt die konkrete Spielzeit des geladenen Songs im Format <code>m:ss<\/code> angezeigt (z.B. <code>0:53<\/code>). So sieht der Caller auf einen Blick, wo im Song der Suchbereich liegt<\/li>\n\n\n\n<li>Anzeige aktualisiert sich live bei Eingabe der Prozentwerte und beim Ziehen der Waveform-Handles<\/li>\n\n\n\n<li>Einheitliche Zeilenh\u00f6he: Preset-ComboBox und Load\/Save-Buttons nutzen jetzt dieselbe H\u00f6he wie die Prozent-SpinBoxen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix \u2014 Abspielhistorie<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tracking nur bei echtem Play<\/strong>: Bisher wurde die &#8222;Zuletzt gespielt&#8220;-Spalte bereits beim reinen Selektieren\/Laden einer Datei aktualisiert. Jetzt wird der Zeitstempel ausschlie\u00dflich beim tats\u00e4chlichen Dr\u00fccken von Play gesetzt. Der Song muss nicht vollst\u00e4ndig durchlaufen<\/li>\n\n\n\n<li>Der DB-Eintrag in <code>play_history<\/code> war bereits korrekt, nur die UI-Spalte lief voraus<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.51 \u2014 Notizen-Widget Verbesserungen (2026-04-15)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Notizen-Widget \u2014 \u00dcberarbeitung &amp; neue Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Export-Ordner <code>notes\/<\/code><\/strong>: Neuer Unterordner wird automatisch angelegt; ist Default-Ort f\u00fcr Laden\/Speichern von JSON-Dateien<\/li>\n\n\n\n<li><strong>Hintergrundfarbe<\/strong>: &#8222;Erledigt&#8220;-Liste hat jetzt dieselbe Hintergrundfarbe wie &#8222;Offen&#8220;-Liste \u2014 einheitliches Erscheinungsbild<\/li>\n\n\n\n<li><strong>Export-Markierung<\/strong>: Auswahl-Checkbox ersetzt durch <code>_SelectToggle<\/code> (\u25cb \/ \u2713) \u2014 kein Qt-QSS-Problem mehr mit unsichtbarem Haken<\/li>\n\n\n\n<li><strong>Drag-Highlight<\/strong>: Gezogene Zeile erh\u00e4lt w\u00e4hrend des Verschiebens farbigen Hintergrund + linken Rand (Akzentfarbe)<\/li>\n\n\n\n<li><strong>Alle markieren \/ Alle abw\u00e4hlen<\/strong>: Zwei neue Buttons <code>Alle \u2713<\/code> und <code>Alle \u25cb<\/code> f\u00fcr schnelle Export-Selektion<\/li>\n\n\n\n<li><strong>Zoom-Controls<\/strong>: <code>\u2212<\/code> \/ <code>100%<\/code> \/ <code>+<\/code> oben rechts \u2014 \u00e4ndert nur die Schriftgr\u00f6\u00dfe der Listeneintr\u00e4ge; Icons aus dem aktiven Skin<\/li>\n\n\n\n<li><strong>Zoom-Persistenz<\/strong>: Zoom-Einstellung wird in INI gespeichert (<code>notes\/zoom_pct<\/code>) und beim n\u00e4chsten Start wiederhergestellt<\/li>\n\n\n\n<li><strong>Zeitstempel bei Erledigt<\/strong>: Abschluss-Zeitpunkt wird im Format <code>[TT.MM.JJ HH:MM]<\/code> hinter dem Text angezeigt<\/li>\n\n\n\n<li><strong>Import-Reihenfolge<\/strong>: Aus JSON geladene Notizen werden in korrekter Reihenfolge oben eingef\u00fcgt<\/li>\n\n\n\n<li><strong>Done-Toggle<\/strong>: \u2610 (offen) \/ \u2611 (erledigt) \u2014 Stift-Experiment r\u00fcckg\u00e4ngig gemacht<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Loop Active Checkbox \u2014 Barrierefreiheit<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sichtbarer Haken<\/strong>: Alle 4 Skin-QSS-Dateien erweitert \u2014 <code>QCheckBox::indicator:checked<\/code> zeigt jetzt wei\u00dfes H\u00e4kchen (check.svg) auf farbigem Hintergrund<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sequenzen-Widget<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zoom-Persistenz<\/strong>: Zoom-Einstellung wird in INI gespeichert (<code>sequences\/zoom_pct<\/code>) und beim Start wiederhergestellt<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Notizen-Dock lazy<\/strong>: Widget wird erst beim ersten \u00d6ffnen erstellt (wie Reports, Potential, Photo) \u2014 kein Startup-Overhead<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.50 \u2014 Frei belegbare Tasten-Trigger (2026-04-09)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Tasten-Trigger selbst erzeugen (BL-064)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Neuer Button \u201e+ Taste&#8220;<\/strong> im Rules-Dialog neben der Trigger-Auswahl<\/li>\n\n\n\n<li>Klick \u00f6ffnet Mini-Dialog: User dr\u00fcckt eine beliebige Taste \u2014 der Trigger-Name wird automatisch ermittelt<\/li>\n\n\n\n<li>Unterst\u00fctzte Tasten: A\u2013Z, 0\u20139, F1\u2013F12, Space, Return, Delete, Tab, Escape, Insert, Backspace, Home, End, PageUp, PageDown<\/li>\n\n\n\n<li>Nach dem Erstellen taucht der neue Trigger sofort in der Trigger-Liste auf und kann einer Rule zugewiesen werden<\/li>\n\n\n\n<li><strong>Persistierung<\/strong>: Neue Trigger werden automatisch beim App-Start wiederhergestellt, sofern mindestens eine Rule damit verkn\u00fcpft ist<\/li>\n\n\n\n<li><strong>Fokus-Sicherheit<\/strong>: Tasten-Trigger feuern nicht, wenn ein Textfeld oder eine Suche aktiv ist \u2014 diese haben immer Priorit\u00e4t. Gilt automatisch f\u00fcr alle zuk\u00fcnftigen Trigger.<\/li>\n\n\n\n<li><strong>Dynamischer eventFilter<\/strong>: Nicht mehr hardcodiert \u2014 alle registrierten <code>key_*<\/code>-Trigger werden automatisch erkannt und weitergeleitet<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.49 \u2014 Label-Erkennung (bidirektional), Lyrics-Co-Import (2026-04-08)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Label-Erkennung \u2014 bidirektionale Dateibenennung<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Format 1 (Titel-Label)<\/strong>: <code>Ring Of Fire-RYL818.mp3<\/code> \u2192 Titel: &#8222;Ring Of Fire&#8220;, Label: &#8222;RYL818&#8220;<\/li>\n\n\n\n<li><strong>Format 2 (Label-Titel)<\/strong>: <code>RYL818-Ring Of Fire.mp3<\/code> \u2192 Titel: &#8222;Ring Of Fire&#8220;, Label: &#8222;RYL818&#8220;<\/li>\n\n\n\n<li><strong>Mit Leerzeichen im Label<\/strong>: <code>YRR 043a-Dunderklumpen.mp3<\/code> oder <code>Dunderklumpen-YRR 043a.mp3<\/code><\/li>\n\n\n\n<li>Regex-Pattern: Buchstaben + optionales Leerzeichen + Ziffern + optionaler Suffix (a\/b\/+)<\/li>\n\n\n\n<li>Unterst\u00fctzte Label-Formate: <code>BVR113<\/code>, <code>RYL818+<\/code>, <code>YRR 043a<\/code>, <code>RBS 1326<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Lyrics-Co-Import<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim MP3-Import wird automatisch eine gleichnamige Lyrics-Datei gesucht (ohne Extension-Suffix)<\/li>\n\n\n\n<li><strong>Quellordner (Import-Ordner)<\/strong>: RTF\/HTML\/TXT-Datei wird in <code>lyrics\/<\/code>-Ordner kopiert<\/li>\n\n\n\n<li><strong>Lyrics-Ordner<\/strong>: Bereits vorhanden \u2192 wird direkt verkn\u00fcpft<\/li>\n\n\n\n<li>Unterst\u00fctzte Lyrik-Formate: <code>.rtf<\/code>, <code>.htm<\/code>, <code>.html<\/code>, <code>.txt<\/code><\/li>\n\n\n\n<li>Log-Ausgabe: <code>[Import] Lyrics verkn\u00fcpft: &lt;dateiname&gt;<\/code> bei erfolgreicher Zuordnung<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.48 \u2014 SqView-Migration, Blind-Import, Theme-Fix (2026-04-08)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">SqView-Migration (BL-011)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ordner-Auswahl<\/strong>: User w\u00e4hlt den SqView-Ordner direkt per Explorer \u2014 <code>sqview.db<\/code>, <code>MP3\/<\/code> und <code>text\/<\/code> werden automatisch erkannt<\/li>\n\n\n\n<li><strong>Blind-Import<\/strong>: Songs werden auch ohne vorhandene MP3-Dateien vollst\u00e4ndig in die DB eingetragen (Dateiname als Platzhalter). MP3s k\u00f6nnen sp\u00e4ter per normalem Datei-Import nachgeliefert werden \u2014 bestehende Eintr\u00e4ge werden automatisch aktiviert statt als Duplikat \u00fcbersprungen<\/li>\n\n\n\n<li><strong>Vollst\u00e4ndige Song-Erkennung<\/strong>: Liest alle ~200 Songs aus <code>markext1\/2\/3<\/code> + <code>track<\/code>-Tabelle (nicht nur die ~10 mit expliziten Einstellungen in der <code>music<\/code>-Tabelle)<\/li>\n\n\n\n<li><strong>Rekursiver MP3-Index<\/strong>: Durchsucht alle Unterordner (<code>patter\/<\/code>, <code>singer\/<\/code>, <code>Karaoke\/<\/code> etc.)<\/li>\n\n\n\n<li><strong>Lyrics-Matching<\/strong>: 4-stufige Regex-Strategie \u2014 exakter Titel, Label-Strip (<code>- RBS 1234<\/code>), Normalisierung (alphanumerisch), Kombination<\/li>\n\n\n\n<li><strong>Loop- und Pitch-\u00dcbernahme<\/strong>: Werte aus der SqView-<code>music<\/code>-Tabelle werden \u00fcbernommen<\/li>\n\n\n\n<li><strong>Abspielhistorie<\/strong>: Aus <code>track<\/code>-Tabelle mit Datum\/Zeit und Lokations-Zuordnung<\/li>\n\n\n\n<li>Musik-Ordner ist optional (Blind-Import l\u00e4uft auch ohne)<\/li>\n\n\n\n<li>MP3-Z\u00e4hlung in der Statusanzeige jetzt rekursiv<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Blind-Import aktivieren (Datei-Import)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim normalen MP3-Import: Existiert bereits ein DB-Eintrag zum Dateinamen, aber die Datei fehlt noch im <code>music\/<\/code>-Ordner \u2192 Datei wird kopiert und der Song aktiviert (statt als Duplikat \u00fcbersprungen)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Song Data \u2014 heller Hintergrund im Default-Theme<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>QScrollArea<\/code>-Viewport und dessen Inhalt erhielten keinen dunklen Hintergrund (Qt-Stylesheet-Vererbung greift nicht durch Viewport-Grenzen)<\/li>\n\n\n\n<li>Fix in allen 4 Themes (default, win11, elegant, light)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.47 \u2014 Loop Finder Presets, CrossFade Beat Snap (2026-04-07)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Loop Finder: Parameter-Presets (BL-046)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Preset-ComboBox<\/strong> ersetzt den alten Reset-Button: zeigt alle gespeicherten Presets, &#8222;Standard&#8220; ist nicht \u00fcberschreibbar<\/li>\n\n\n\n<li><strong>Laden<\/strong>-Button: Wendet das gew\u00e4hlte Preset auf Suchbereiche, Vergleichsfenster und Strategie an<\/li>\n\n\n\n<li><strong>Speichern<\/strong>-Button: Immer aktiv \u2014 bei &#8222;Standard&#8220; erscheint Eingabedialog f\u00fcr neuen Namen, bei User-Presets direktes \u00dcberschreiben<\/li>\n\n\n\n<li>Presets als JSON-Dateien im Ordner <code>loop_presets\/<\/code> \u2014 portabel und editierbar<\/li>\n\n\n\n<li><strong>Strategie-ComboBox<\/strong> in der Analyse-Zeile: zeigt alle verf\u00fcgbaren Auswahlstrategien (aktuell: <em>&#8222;Bestes Vielfaches von 64 Beats&#8220;<\/em>), wird mit dem Preset gespeichert und geladen; weitere Strategien jederzeit nachr\u00fcstbar<\/li>\n\n\n\n<li><strong>Rules-Aktion &#8222;Auto-Set Best Loop&#8220;<\/strong> hat jetzt Parameter <code>preset<\/code> (Dropdown aller gespeicherten Presets)<\/li>\n\n\n\n<li>L\u00e4dt Suchbereiche, Vergleichsfenster und Strategie vollst\u00e4ndig aus dem gew\u00e4hlten Preset<\/li>\n\n\n\n<li>Neuer <code>preset_choice<\/code>-Parametertyp in rule_widget.py mit <code>preset_names_provider<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">CrossFade im Beat Snap (BL-067)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Toggle-Button <strong>CrossFade<\/strong> zwischen Snap und Vorh\u00f6ren<\/li>\n\n\n\n<li>Wenn aktiv: Vorh\u00f6ren des Loop-Sprungs mit demselben Crossfade wie im Normalbetrieb<\/li>\n\n\n\n<li>Wird bei jedem Laden und jeder Waveform-\u00c4nderung automatisch deaktiviert<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Taskleisten-Icon Laptop-Fix<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>cc-logo.png<\/code> wird beim Build ins App-Root kopiert (war bisher nur auf Build-Rechner vorhanden)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.46 \u2014 Live-Volume (BL-070), UI-Gleichraster Player (2026-04-07)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Live-Volume \/ Mindest-Lautst\u00e4rke (BL-070)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer <strong>Live-Vol-Slider<\/strong> im Player (4. Spalte neben Heutiges Tempo \/ Song-Tempo \/ Pitch)<\/li>\n\n\n\n<li>Artefaktfreie Lautst\u00e4rke\u00e4nderung via Windows WASAPI (pycaw) \u2014 au\u00dferhalb des Audio-Streams, keine Knackser bei schnellen Bewegungen<\/li>\n\n\n\n<li>Reset auf 100% bei jedem Song-Wechsel (nicht persistent)<\/li>\n\n\n\n<li>INI-Einstellung <code>audio\/min_volume<\/code> (Default <code>0.0<\/code>): Slider kann nicht unter diesen Wert gesenkt werden<\/li>\n\n\n\n<li>Wird beim App-Start automatisch in INI geschrieben falls fehlend<\/li>\n\n\n\n<li>Graceful Degradation: ohne pycaw (kein Windows-Ger\u00e4t) bleibt Funktion stumm, App l\u00e4uft normal weiter<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rules-Aktion: Live-Volume \u00e4ndern<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Aktion <strong>&#8222;Change Live-Volume (\u00b1)&#8220;<\/strong> mit einstellbarem <code>delta<\/code> in Prozentpunkten (\u2212100 bis +100, Default \u221210)<\/li>\n\n\n\n<li>Respektiert automatisch die <code>min_volume<\/code>-Grenze aus der INI<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">UI: Player-Zeilen im gleichm\u00e4\u00dfigen 4er-Raster<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zeile &#8222;Heutiges Tempo \/ Song-Tempo \/ Pitch \/ Live-Vol&#8220;: <code>QGridLayout<\/code> mit <code>columnStretch=1<\/code> + <code>QSizePolicy.Ignored<\/code> \u2192 exakt gleichbreite Spalten<\/li>\n\n\n\n<li>Zeile &#8222;Lokation \/ Planner \/ Lyrics \/ Loop aktiv&#8220;: ebenfalls ins 4er-Raster \u00fcberf\u00fchrt, b\u00fcndig mit Zeile dar\u00fcber<\/li>\n\n\n\n<li>Labels mit <code>setWordWrap(True)<\/code> \u2014 kein Text bl\u00e4ht seine Spalte auf<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.45 \u2014 Genre-System, Rules Drag&amp;Drop, Bugfixes (2026-04-06)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Reports und Potential Dock-Absturz beim ersten \u00d6ffnen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>setFloating(True)<\/code> im <code>visibilityChanged<\/code>-Handler loeste re-entranten Signal-Aufruf aus \u2192 Absturz<\/li>\n\n\n\n<li>Fix: Signal sofort trennen + Initialisierung per <code>QTimer.singleShot(0, ...)<\/code> zurueckstellen<\/li>\n\n\n\n<li>Betrifft <code>_on_reports_visibility<\/code> und <code>_on_potential_visibility<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Genre \/ Tags (BL-063)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Songs koennen mehrere Genres\/Tags erhalten (Many-to-Many)<\/li>\n\n\n\n<li><strong>65 Default-Genres<\/strong> aus Square Dance Labels + musicforcallers.com (Dekaden, Stile, Kuenstler, Themen, <a href=\"https:\/\/callerscaddy.de\/new-music-for-callers-how-to-find-them\/\">Square Dance spezifisch<\/a>, NEW)<\/li>\n\n\n\n<li><code>seed_default_genres()<\/code> ist idempotent \u2014 fuegt nur fehlende Genres ein, bestehende bleiben erhalten<\/li>\n\n\n\n<li><strong>Genre-Verwaltung<\/strong> (Menue Datenbank \u2192 &#8222;Genres verwalten\u2026&#8220;):<\/li>\n\n\n\n<li>Liste aller Genres mit Song-Zaehler<\/li>\n\n\n\n<li>Anlegen, Umbenennen, Loeschen<\/li>\n\n\n\n<li>Beim Loeschen mit zugeordneten Songs: Wahlmoeglichkeit &#8222;Auf anderes Genre umbiegen&#8220; oder &#8222;Einfach entfernen&#8220;<\/li>\n\n\n\n<li><strong>Song-Datensatz<\/strong>: Genre-Tags als klickbare Anzeige + &#8222;\u2026&#8220;-Button oeffnet Checkbox-Dialog<\/li>\n\n\n\n<li>Neues Genre direkt im Dialog anlegen moeglich<\/li>\n\n\n\n<li>Aenderungen werden sofort gespeichert<\/li>\n\n\n\n<li><strong>Import-Keyword-Matching<\/strong>: Beim Import werden Genres automatisch aus dem Dateinamen vorgeschlagen (z.B. &#8222;Christmas&#8220; aus &#8222;Xmas Song.mp3&#8220;)<\/li>\n\n\n\n<li><strong>Rules-Aktionen<\/strong>: &#8222;Add Genre to Song&#8220; und &#8222;Remove Genre from Song&#8220;<\/li>\n\n\n\n<li>Parameter als Dropdown aller vorhandenen Genres (kein Freitext \u2192 keine Duplikate)<\/li>\n\n\n\n<li>Neuer <code>genre_choice<\/code>-Parametertyp in rule_widget.py mit <code>genre_names_provider<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rules: Aktionen per Drag&amp;Drop umordnen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jede Aktion-Zeile hat links ein <strong>\u2261<\/strong>-Handle (Cursor \u2195)<\/li>\n\n\n\n<li>Ziehen verschiebt die Zeile live an die neue Position<\/li>\n\n\n\n<li>Reihenfolge der Aktionen ist sofort gespeichert<\/li>\n\n\n\n<li>Bugfix: <code>_on_action_type_changed<\/code> hatte falschen Index nach Handle-Einfuegung (combo wurde statt Params entfernt)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.44 \u2014 Multi-Musikpfade, Import Kopieren\/Belassen (2026-04-05)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Mehrere Musik-Verzeichnisse (bis zu 4)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bis zu 4 Musikpfade konfigurierbar (Slot 1 = Hauptordner, Slots 2\u20134 optional)<\/li>\n\n\n\n<li><code>find_song_file()<\/code> sucht in Reihenfolge Slot 1 \u2192 2 \u2192 3 \u2192 4, gibt ersten Treffer zurueck<\/li>\n\n\n\n<li>Neuer Dialog &#8222;Musikpfade verwalten&#8220; (Menue Pfade) mit Browse + Leeren pro Slot<\/li>\n\n\n\n<li>Menuetext: &#8222;Musik-Verzeichnis aendern&#8220; \u2192 &#8222;Musikpfade verwalten&#8220;<\/li>\n\n\n\n<li>Migration: Alter INI-Key <code>paths\/music_dir<\/code> wird automatisch nach <code>paths\/music_dir_1<\/code> uebertragen<\/li>\n\n\n\n<li>Gut fuer Caller mit Programmdaten auf einem und Musikdateien auf einem anderen Laufwerk<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Import: Kopieren oder am Ort belassen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Zwischendialog nach Songtyp-Auswahl: &#8222;Dateien kopieren?&#8220; oder &#8222;Am Ort belassen&#8220;<\/li>\n\n\n\n<li>Kopieren: bisheriges Verhalten \u2014 Dateien gehen ins music\/-Hauptverzeichnis<\/li>\n\n\n\n<li>Belassen: Dateien bleiben wo sie sind, nur DB-Eintrag wird angelegt<\/li>\n\n\n\n<li>Bei Belassen: wenn Quellordner noch nicht als Musikpfad eingetragen, Nachfrage ob er als freier Slot ergaenzt werden soll<\/li>\n\n\n\n<li>Wenn alle 4 Slots belegt: Hinweismeldung mit Verweis auf den Verwaltungs-Dialog<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Single-Instance-Lock robuster (Race Condition bei Doppelklick)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ersetzt QLocalServer\/QLocalSocket durch atomaren QLockFile<\/li>\n\n\n\n<li>Doppelklick auf run_test.bat oder EXE startet keine zweite Instanz mehr<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Mindestbreite Player- und Loop-Dock<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Player-Dock: min. 340px \u2014 verhindert unleshares Zusammenquetschen<\/li>\n\n\n\n<li>Loop-Dock: min. 400px \u2014 alle 4 Buttons bleiben nebeneinander lesbar<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance-Optimierung Startup (\u221222% auf Laptop)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Reports-Dock: <code>setFloating(True)<\/code> wird nicht mehr beim Start gesetzt, sondern erst beim ersten Oeffnen (lazy) \u2192 \u2212318ms auf Laptop<\/li>\n\n\n\n<li>Potential-Dock: gleiche Optimierung \u2192 \u2212137ms auf Laptop<\/li>\n\n\n\n<li>Gesamtersparnis Laptop: ~526ms (2415ms \u2192 1889ms)<\/li>\n\n\n\n<li><strong>Hinweis fuer Kunden<\/strong>: Beim ersten Start nach einem Update kann die App einige Sekunden laenger brauchen \u2014 Windows Defender scannt die neuen Dateien. Ab dem zweiten Start ist alles normal.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.43 \u2014 UI-Mindesthoehen, Song-Data-Scroll, Erststart-Sprachabfrage, Quickwin-Bundle (2026-04-04)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Rule-Aktion: Song-Tempo aendern (persistent)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>song_tempo_change<\/code> ergaenzt zur bisherigen <code>tempo_change<\/code><\/li>\n\n\n\n<li><strong>tempo_change<\/strong> (umbenannt zu &#8222;Change Today&#8217;s Tempo (\u00b1%)&#8220;): heutiges Tempo, nicht persistent<\/li>\n\n\n\n<li><strong>song_tempo_change<\/strong> (&#8222;Change Song Tempo (\u00b1%, persistent)&#8220;): aendert das Song-Tempo und speichert den Wert ueber die bestehende Auto-Save-Kette am Song in der Datenbank<\/li>\n\n\n\n<li>Parameter: <code>delta<\/code> als Integer-Prozent, Clamp 50-150%<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Import\/Migration fehlertolerant (BL-065)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Manueller Import: Pro-Datei-try\/except \u2014 defekte\/unlesbare Dateien werden uebersprungen, Session laeuft weiter<\/li>\n\n\n\n<li>CC1-Migration: <code>shutil.copy2<\/code> pro MP3 gekapselt, Fehler protokolliert, Report am Ende<\/li>\n\n\n\n<li>SqView-Migration: gleiche Fehlerresilienz<\/li>\n\n\n\n<li>Auch <code>player._load_file()<\/code> am Ende des Imports fehlertolerant \u2014 eine defekte letzte Datei bricht die Summary nicht mehr ab<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Ordner-Import mit Unterordnern (BL-032)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Zwischendialog &#8222;Importquelle&#8220;: Einzelne Dateien oder Ordner (inkl. Unterordner)<\/li>\n\n\n\n<li>Bei Ordner-Auswahl wird rekursiv nach .mp3\/.wav\/.flac\/.ogg\/.aiff\/.aif gesucht<\/li>\n\n\n\n<li>Thorstens Langzeit-Feature-Request erfuellt<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Aktiver Tab besser erkennbar (BL-060)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>QTabBar::tab:selected<\/code> in allen Themes mit <code>font-weight: bold<\/code><\/li>\n\n\n\n<li>Win11: Border von 2px auf 3px, expliziter <code>widget_bg<\/code>-Hintergrund<\/li>\n\n\n\n<li>Default: zusaetzliche 2px Top-Border in Selection-Farbe<\/li>\n\n\n\n<li>Light: Bold ergaenzt, elegant war bereits bold<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Import-Hinweis: wo die Songs landen (BL-062)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nach erfolgreichem Import wird das Song-List-Dock automatisch in den Vordergrund geholt<\/li>\n\n\n\n<li>Import-Zusammenfassung enthaelt neuen Hinweis: &#8222;Die neuen Songs wurden der Songliste hinzugefuegt.&#8220;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">TIC-0014: Player-Mindesthoehe beim App-Resize<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>MainWindow.setMinimumSize()<\/code> von (1100, 650) auf (1100, 720) erhoeht<\/li>\n\n\n\n<li>Summe aus Player (350) + Loop (240) + Titelleisten + Menu + Statusbar passt jetzt in die Mindesthoehe<\/li>\n\n\n\n<li>Untere Button-Zeile (Lokation, Planner, Lyrics) wird beim Verkleinern des Hauptfensters nicht mehr abgeschnitten<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Erststart-Sprachabfrage (BL-058)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim allerersten Start (keine Sprache in INI) erscheint ein Dialog: &#8222;Start in English&#8220; \/ &#8222;In Deutsch starten&#8220;<\/li>\n\n\n\n<li>Sprache wird danach in der INI gespeichert, Dialog erscheint nur einmal<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">UI: Mindesthoehen gegen Quetschen (TIC-0008, TIC-0013)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Player-Buttons (Play, Pause, Stop, Fade Out, Lokation, Planner, Lyrics): Mindesthoehe 34px<\/li>\n\n\n\n<li>Player-SpinBoxen (Tempo, Pitch): Mindesthoehe 24px mit Labels 16px<\/li>\n\n\n\n<li>Player-Widget gesamt: Mindesthoehe 350px, wird nach Layout-Restore erneut erzwungen<\/li>\n\n\n\n<li>Loop-Widget (&#8222;New Songs&#8220;): Mindesthoehe 240px, Buttons 52px, festes Spacing 6px<\/li>\n\n\n\n<li>Verhindert unleserliche UI auf kleinen Bildschirmen oder bei hoher DPI-Skalierung (z.B. 1.8x)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Song Data: ScrollArea (TIC-0012)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Song-Data-Widget hat jetzt eine vertikale Scrollleiste statt Quetschen bei kleinem Dock<\/li>\n\n\n\n<li>Alle Felder bleiben lesbar unabhaengig von der Widget-Hoehe<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: &#8222;Titel&#8220;-Spalte nicht uebersetzt (TIC-0009)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spalte &#8222;Titel&#8220; in Playlist und Planner wird jetzt korrekt ueber das Uebersetzungssystem ausgegeben (&#8222;Title&#8220; auf Englisch)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix: Show\/Hide-Buttons sind jetzt echtes Toggle (TIC-0010, TIC-0011)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>_toggle_dock()<\/code> war bisher nur Show + raise \u2014 zweiter Klick blendete nicht aus<\/li>\n\n\n\n<li>Planner- und Lyrics-Button blenden das jeweilige Dock jetzt beim zweiten Klick wieder aus<\/li>\n\n\n\n<li>Sonderfall hinterer Tab im Stapel: Dock wird nur nach vorne geholt, nicht versteckt<\/li>\n\n\n\n<li>Sortier-Preselect im Planner laeuft nur noch beim Oeffnen, nicht beim Schliessen<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.42 \u2014 Rules-Erweiterungen, Planner-Loeschen, App-Menu &amp; Song-Anzeige ohne Datei (2026-03-28)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Neue Rule-Aktionen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Go To Position<\/strong> (BL-044): Springt zu Start, Loop-In, Loop-Out oder Ende des Songs. Position ueber Dropdown waehlbar, nutzt Crossfade-Parameter fuer sanften Uebergang<\/li>\n\n\n\n<li><strong>Toggle Loop Active<\/strong> (BL-045): Schaltet die Loop-Checkbox an\/aus \u2014 per Tastenkuerzel oder Regel steuerbar<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Planner: Playlist komplett loeschen (BL-049)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer roter \u2716-Button ueber dem Bestaetigungs-Button im Planner<\/li>\n\n\n\n<li>Loescht die gesamte Playlist nach Rueckfrage-Dialog<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Song-Daten ohne Audiodatei (BL-051)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Song-Daten und Lyrics werden jetzt auch angezeigt, wenn keine MP3\/Audio-Datei vorhanden ist<\/li>\n\n\n\n<li>Dateiname-Feld wird rot hinterlegt als visueller Hinweis<\/li>\n\n\n\n<li>Warnung nur noch in der Statusbar (kein blockierendes Popup mehr)<\/li>\n\n\n\n<li>Ermoeglicht manuelles Verlinken einer Datei oder Einsicht in Migrationsdaten<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">App-Menu (BL-052)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer erster Menueeintrag &#8222;App&#8220; mit &#8222;Beenden&#8220; \u2014 sauberes Schliessen ueber das Menu statt nur ueber das X<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rules-Widget<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Parametertyp &#8222;choice&#8220; fuer Dropdown-Auswahl in Rule-Aktionen (z.B. GoTo-Position)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.41 \u2014 Song-Verwaltung, Foto-Widget, RTF-Bereinigung &amp; MDB-Erweiterungstabellen (2026-03-27)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Song loeschen (BL-039)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Songs koennen einzeln aus der Datenbank geloescht werden<\/li>\n\n\n\n<li>Sicherheitsabfrage mit Option, Historiendaten (play_history, song_location_stats) mitzuloeschen<\/li>\n\n\n\n<li>Auch per Entf-Taste in der Songliste aufrufbar<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Multi-File-Import mit Typ-Auswahl<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim Importieren neuer Songs wird vorher der Songtyp abgefragt (Pattern \/ Singing \/ Beides)<\/li>\n\n\n\n<li>Mehrere Dateien gleichzeitig auswaehlbar (Multi-File-Dialog)<\/li>\n\n\n\n<li>Gewaehlter Typ wird auf alle importierten Songs angewendet<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Foto-Widget (BL-041)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Dock-Widget mit Kamera-Vorschau (QtMultimedia: QCamera + QMediaCaptureSession)<\/li>\n\n\n\n<li>RAM-only: Fotos werden nur im Speicher gehalten, kein Dateisystem, keine DB<\/li>\n\n\n\n<li>Lazy-Init: Kamera wird erst bei erster Sichtbarkeit des Docks initialisiert<\/li>\n\n\n\n<li>QStackedWidget fuer Umschaltung zwischen Kamera-Preview und aufgenommenem Foto<\/li>\n\n\n\n<li>Rules-Aktionen: photo_capture (Kamera starten + Timer) und photo_show (90% Screen)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">RTF-Bereinigung (BL-043)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lyrics-Import: Word-Muell aus RTF-Dateien wird automatisch entfernt (datastore, themedata, colorschememapping, xmlnstbl, latentstyles etc.)<\/li>\n\n\n\n<li>Whitelist-Ansatz: Nur bekannte RTF-Gruppen (fonttbl, colortbl, stylesheet) werden behalten<\/li>\n\n\n\n<li>Bei betroffenen Dateien bis zu 48% Dateigroesse eingespart<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">MDB-Migration: Erweiterte Tabellen (BL-047)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>access-parser Monkey-Patches fuer erweiterte CC1-Tabellen (Off-by-One, Row-Count, Primary-Key)<\/li>\n\n\n\n<li>History-Based Reconstruction: Wenn normale Song-Felder unlesbar, werden Songs aus der Historie rekonstruiert<\/li>\n\n\n\n<li>Case-insensitiver Fallback fuer Tabellen- und Spaltennamen (access-parser liefert inkonsistente Gross-\/Kleinschreibung)<\/li>\n\n\n\n<li>Windows-Console: Unicode-sichere Log-Ausgaben (ASCII statt Sonderzeichen)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SqView-Migration bereit fuer groessere Testdaten<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.40 \u2014 Loop-Anzahl, Performance-Optimierung &amp; Mehrfachstart-Schutz (2026-03-26)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Loop-Anzahl \/ Zeitgesteuerter Loop (BL-042)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Funktion: Caller legt gewuenschte Pattern-Dauer fest, Callers Caddy berechnet die noetige Anzahl Loops<\/li>\n\n\n\n<li>Zwei Optionen (ein Loop mehr \/ ein Loop weniger) mit resultierender Gesamtdauer<\/li>\n\n\n\n<li>Loop-Anzahl wird im Player angezeigt (Loop X\/N bzw. Loop unendlich)<\/li>\n\n\n\n<li>Singing Calls zeigen &#8222;1&#8220; statt Unendlich-Zeichen in der Loops-Spalte<\/li>\n\n\n\n<li>Loop-Anzahl pro Playlist-Eintrag (nicht pro Song), persistiert in Playlist-Dateien<\/li>\n\n\n\n<li>Rueckwaertskompatibles Playlist-Format: Erkennt altes und neues Format automatisch<\/li>\n\n\n\n<li>Doppelklick auf Loops-Spalte oeffnet Loop-Anzahl-Dialog (Playlist + Planner)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Player-Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Song-Titel in eigener Zeile (16px fett), Info-Zeile darunter mit Timer + Loop-Count + BPM<\/li>\n\n\n\n<li>Loop-Marken (Loop-In \/ Loop-Out) werden als vertikale Linien auf dem Position-Slider angezeigt<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Playlist + Planner<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Spalte &#8222;Dauer&#8220; mit berechneter Laufzeit pro Song (beruecksichtigt Loop-Anzahl)<\/li>\n\n\n\n<li>Gesamtdauer-Summe unter der Playlist \u2014 Caller kann den ganzen Abend verplanen<\/li>\n\n\n\n<li>Planner: Linker und rechter Bereich per QSplitter in der Groesse verschiebbar<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance-Optimierung (Startup \u221255%)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>App-Start: 1724ms \u2192 780ms durch Lazy-Init von Reports, Potential und Planner<\/li>\n\n\n\n<li>Songliste: set_last_played_map aktualisiert nur noch Datumsspalte statt Table-Rebuild<\/li>\n\n\n\n<li>Playlist-Dauer: Negative Cache + Inline-Summe (250 Songs: 367ms \u2192 5ms)<\/li>\n\n\n\n<li>Performance-Logging-System: <code>perf_start()<\/code> \/ <code>perf_log()<\/code> \/ <code>perf_split()<\/code><\/li>\n\n\n\n<li>Aktivierbar via INI-Schalter <code>debug\/performance_logging = true<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Mehrfachstart-Schutz<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Doppelter App-Start wird verhindert (QLocalServer\/QLocalSocket)<\/li>\n\n\n\n<li>Fehlermeldung wenn Callers Caddy bereits laeuft<\/li>\n\n\n\n<li>Wait-Cursor (Sanduhr) waehrend des App-Starts<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Uebersetzungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Schluessel: header_duration, playlist_total, loop_count_per_loop, loop_count_before, loop_count_after, already_running<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.39 \u2014 SqView-Migration, Song-Volume &amp; Verbesserungen (2026-03-26)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">SqView-Migration (Beta)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Migrations-Pfad: SqView \u2192 Callers Caddy 2.0<\/li>\n\n\n\n<li>Liest sqview.db: Songs (Tempo, Pitch, Volume, Loops), Abspielhistorie, Lyrics-Zuordnungen<\/li>\n\n\n\n<li>Auto-Detect: Musik- und Lyrics-Ordner werden aus SqView-INI erkannt<\/li>\n\n\n\n<li>Ausfuehrliches Log pro Song: MP3-Status, Lyrics, Loop-Punkte, Pitch, Volume<\/li>\n\n\n\n<li>Nacharbeit-Bericht am Ende: fehlende MP3s und Lyrics aufgelistet<\/li>\n\n\n\n<li>Beta-Warnung: &#8222;Noch im Test-Stadium. Benutzung auf eigene Gefahr!&#8220;<\/li>\n\n\n\n<li>Dateiname-Parsing: &#8222;Title-Label.mp3&#8220; wird automatisch in Titel + Label zerlegt<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Song-Volume<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Volume-Feld in Song-Daten wird jetzt auf die Audio-Engine angewandt (multiplikativ)<\/li>\n\n\n\n<li>Smooth-Rampe bei Volume-Aenderung (~50ms), kein Knistern oder Knacksen<\/li>\n\n\n\n<li>Debounced DB-Save: nur Volume-Spalte, kein Lyrics-Reload bei Aenderung<\/li>\n\n\n\n<li>Range begrenzt auf 0.0\u20131.0 (0%\u2013100%)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Rules-Aktionen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Aktion: &#8222;Change Pitch&#8220; (\u00b1Halbtoene, konfigurierbare Schrittweite)<\/li>\n\n\n\n<li>Neue Aktion: &#8222;Change Volume&#8220; (\u00b1Faktor, konfigurierbare Schrittweite)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tutorial-Menu<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neuer Menuepunkt &#8222;Alle Tutorials beenden&#8220; (Gegenstueck zu &#8222;Alle zuruecksetzen&#8220;)<\/li>\n\n\n\n<li>Beendet laufendes Tutorial und markiert alle als abgeschlossen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Potential-Widget<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FlowLayout fuer Check-Buttons: Buttons haben volle Textbreite, umbrechen automatisch bei schmalem Dock<\/li>\n\n\n\n<li>Doppelklick auf &#8222;Leere Lokation&#8220; oeffnet Lokation-Dialog mit der betroffenen Lokation vorselektiert<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfix<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tasten P und L funktionieren jetzt in Songliste\/Playlist fuer Type-to-Search<br>(wurden vorher vom app-weiten EventFilter geschluckt, auch bei deaktivierten Regeln)<\/li>\n\n\n\n<li>Tempo\/Pitch-Aenderung verursacht kein Audio-Knistern mehr (Debounced Save ohne Lyrics-Reload)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.38 \u2014 Lyrics-Redesign, Tutorials &amp; Bugfixes (2026-03-25)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Lyrics-Widget: As-Is-Rendering (Architektur-Vereinfachung)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lyrics werden jetzt 1:1 original dargestellt \u2014 wie im Browser oder Word<\/li>\n\n\n\n<li>Weisser Hintergrund, unabhaengig vom gewaehlten Theme<\/li>\n\n\n\n<li>Alle Farben (Textfarbe, Hintergrundfarbe, Highlights) bleiben original erhalten<\/li>\n\n\n\n<li>Sanitizer radikal vereinfacht: nur noch CSS-Link-Aufloesung + font-size-Entfernung<\/li>\n\n\n\n<li>Externe CSS-Dateien (z.B. cuesheet2.css) werden automatisch inlined<\/li>\n\n\n\n<li>RTF-Konverter: Unterstuetzung fuer \\highlight (Hintergrundfarben)<\/li>\n\n\n\n<li>RTF-Konverter: Korrekte Behandlung von *\\background und weiteren Header-Gruppen<\/li>\n\n\n\n<li>Neuer Button &#8222;Auto-Breite&#8220;: Skaliert Schrift so, dass Text in die Fensterbreite passt<\/li>\n\n\n\n<li>Auto-Breite auch als Rules-Aktion verfuegbar (&#8222;Lyrics Auto-Width&#8220;)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tutorials<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Tutorial: Loop Finder (6 Schritte: Wellenform, Suchbereich, Suchfenster, Analyse, Ergebnisse, Uebernehmen)<\/li>\n\n\n\n<li>Neues Tutorial: Rules (7 Schritte: Regelliste, Neue Regel, Name\/Aktiv\/Once, Trigger, Bedingungen, Aktionen, Import\/Export)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Song-Restart<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Play-Button bei laufendem Song = Neustart von vorne (seek 0)<\/li>\n\n\n\n<li>Kein Stop+Start mehr noetig, auch per F5-Rule nutzbar<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>HTML-Lyrics mit externem CSS werden jetzt korrekt dargestellt (TIC-0001)<\/li>\n\n\n\n<li>RTF-Lyrics mit Farben und Highlights werden originalgetreu angezeigt (TIC-0002)<\/li>\n\n\n\n<li>App-Icon in Titelleiste und Windows-Taskleiste (TIC-0004)<\/li>\n\n\n\n<li>CP1252-Encoding-Fallback beim Laden von Playlists (utf-8 Fehler)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Ticket-System<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Ticket-System unter 5_Tickets\/ fuer Fehlermeldungen und Fragen<\/li>\n\n\n\n<li>TICKETS.md als Uebersicht, ein Ordner pro Ticket mit Anhaengen<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.37 \u2014 Regel-Engine &amp; Automatisierung (2026-03-24)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Regel-Engine (neues System)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Komplett neues Automatisierungssystem: Trigger \u2192 Bedingungen \u2192 Aktionen<\/li>\n\n\n\n<li><strong>26 Trigger<\/strong>: App-Lifecycle (Start, Song gestartet\/pausiert\/gestoppt\/resumed\/gewechselt), periodischer Timer, Tastatur (F1\u2013F12, Space, L, P), Manager geschlossen<\/li>\n\n\n\n<li><strong>9 Bedingungen<\/strong>: Songtyp (Singing\/Patter), Lyrics vorhanden\/nicht, Loop gesetzt\/nicht, Location gewaehlt\/nicht, Spielzeit ueber Schwellwert<\/li>\n\n\n\n<li><strong>25 Aktionen<\/strong>: Dock oeffnen\/schliessen\/Vollbild\/Fokus, Layout laden, Play\/Pause\/Stop\/Fade-Out\/Toggle, Auto-Advance, Auto-Scroll Start\/Stop, Tempo aendern, Statusbar-Nachricht, Log-Nachricht, System-Ping, Warn-Hintergrund (Ampel), Location-Dialog, Manager-Toggle, Auto-Loop-Finder<\/li>\n\n\n\n<li>Bedingungslogik: Flexible UND\/ODER-Gruppen (z.B. \u201eSinging UND Lyrics vorhanden ODER Patter UND Loop gesetzt&#8220;)<\/li>\n\n\n\n<li>\u201eEinmal pro Song&#8220;-Option: Regel feuert maximal einmal pro Song<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Regel-Editor (neues Widget)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dockbares Editor-Widget mit zweigeteiltem Layout (Regelliste links, Editor rechts)<\/li>\n\n\n\n<li>Suchfeld zum Filtern nach Name oder Trigger<\/li>\n\n\n\n<li>Sortierbare Tabelle: Aktiv-Checkbox, Name, Trigger, Quelle (System\/User)<\/li>\n\n\n\n<li>Dynamische Parameter-Eingabefelder je nach Aktions-\/Bedingungstyp<\/li>\n\n\n\n<li>Buttons: Hinzufuegen, Duplizieren, Loeschen, Hoch\/Runter, Export, Import<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">System- vs. User-Regeln<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>13 vorinstallierte System-Regeln<\/strong> (nur Aktiv-Toggle aenderbar, nicht editierbar):<\/li>\n\n\n\n<li>Singing Call \u2192 Lyrics Vollbild mit Auto-Scroll (Start + Resume)<\/li>\n\n\n\n<li>Singing Call Stop\/Pause \u2192 Default Layout zurueck<\/li>\n\n\n\n<li>Song Stop \u2192 Auto-Advance<\/li>\n\n\n\n<li>Manager geschlossen \u2192 Playlist fokussieren<\/li>\n\n\n\n<li>Tastatur-Shortcuts: F5=Play, F6=Pause, F7=Stop, F8=Fade-Out, Space=Play\/Pause, L=Location, P=Manager<\/li>\n\n\n\n<li><strong>User-Regeln<\/strong>: Voll editierbar, Import\/Export als JSON, frei sortierbar<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Regel-Logging<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eigene Log-Datei <code>rules\/rules.log<\/code> mit Kategorien: TRIGGER, MATCH, NO_MATCH, ACTION, ERROR, BLOCKED<\/li>\n\n\n\n<li>Automatische Rotation bei 1 MB (beh\u00e4lt 500 Zeilen)<\/li>\n\n\n\n<li>Hilft bei Diagnose, warum Regeln feuern oder nicht<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Auto-Loop-Finder (Regel-Aktion)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neue Aktion <code>auto_set_best_loop<\/code>: Analysiert den Song automatisch und setzt den besten 64-Beat-Loop<\/li>\n\n\n\n<li>Bevorzugt 64-Beat-Loops, Fallback auf hoechsten Score<\/li>\n\n\n\n<li>&#8222;Bitte warten&#8220;-Overlay waehrend der Analyse (halbtransparent, verschwindet automatisch)<\/li>\n\n\n\n<li>Kann per Regel z.B. bei Song-Start automatisch ausgeloest werden<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance-Optimierung<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lazy Waveform<\/strong>: Loop-Finder-Waveform wird erst bei Sichtbarkeit geladen (spart ~100-400ms beim Songwechsel)<\/li>\n\n\n\n<li><strong>Gezieltes Song-Update<\/strong>: Nach Abspielen wird nur die Last-Played-Spalte aktualisiert statt die gesamte Songliste neu aufgebaut (~4-22ms statt ~400-1200ms)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Loop-Widget: Neues Button-Layout<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alle 4 Buttons (Set In, Clear, Set Out, Test Loop) in einer flachen Zeile<\/li>\n\n\n\n<li>Buttons schrumpfen bei Platzmangel mit automatischem Textumbruch<\/li>\n\n\n\n<li>Player-Spalte laesst sich jetzt deutlich schmaler ziehen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Dock-Widget-Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Features-Persistenz<\/strong>: Dock-Faehigkeiten (Verschieben\/Andocken\/Schliessen) bleiben nach Layout-Wiederherstellung erhalten (Qt-Bug behoben)<\/li>\n\n\n\n<li><strong>Kleinere Fenstergroessen<\/strong>: Docks lassen sich jetzt auch andocken, wenn die App nicht im Vollbild laeuft (minimumSize-Fix)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Loop-Guard<\/strong>: Snapshot-Werte von 0.0 werden korrekt als ungueltig erkannt \u2014 verhindert Ueberschreiben guter Loop-Werte beim Schliessen<\/li>\n\n\n\n<li><strong>Audition\/Beat Snap<\/strong>: Abspielen im Loop Finder und Beat Snap wird nicht mehr in der Play-Historie geloggt<\/li>\n\n\n\n<li><strong>Loop Finder schliessen<\/strong>: Stoppt laufende Wiedergabe automatisch<\/li>\n\n\n\n<li><strong>Resume-Regel<\/strong>: Funktioniert wieder zuverlaessig nach Layout-Wechsel (Focus-Restore nach restoreState)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.36 \u2014 Loop Finder &amp; UI-Reorganisation (2026-03-21)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Loop Finder (neues Widget)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues dockbares Fenster &#8222;Loop Finder&#8220; \u2014 sucht automatisch passende Loop-Punkte<\/li>\n\n\n\n<li>Aehnlichkeitsbasierte Analyse: Vergleicht Phrasen im vorderen und hinteren Songbereich<\/li>\n\n\n\n<li>8-Beat-Nummerierung: Alle Beats werden 1-8 durchgezaehlt, Spruenge nur zwischen gleichen Beat-Positionen<\/li>\n\n\n\n<li>Downbeat-Erkennung: Bevorzugt Kandidaten auf geschaetztem Beat 1 (Kick-Energie-Heuristik)<\/li>\n\n\n\n<li>Chroma-basierter Harmonie-Score (FFT \u2192 12 Halbtoene, rein mit scipy\/numpy)<\/li>\n\n\n\n<li>Einstellbares Vergleichsfenster: 4, 8, 16, 32 oder 64 Beats per ComboBox<\/li>\n\n\n\n<li>Einstellbare Suchbereiche: 4 Prozentfelder (Default 7%\/21%\/64%\/79%) mit Reset-Button<\/li>\n\n\n\n<li>Waveform-Uebersicht mit farbigen Suchbereichen (gruen = Loop-In, orange = Loop-Out)<\/li>\n\n\n\n<li>4 verschiebbare Handles (beide Seiten pro Region per Maus anpassbar)<\/li>\n\n\n\n<li>7 Singing-Call-Segmente ueber der Waveform (Opener, 1-4, Middle Break, Closer)<\/li>\n\n\n\n<li>Weisse gestrichelte Marken zeigen den selektierten Vorschlag in der Waveform<\/li>\n\n\n\n<li>Sortierbare Ergebnistabelle: Klick auf Spaltenueberschrift sortiert nach Score, Beat, Zeit<\/li>\n\n\n\n<li>Audition-Funktion: Startet 5 Sekunden vor Loop-Out, springt, stoppt 2 Sekunden nach Loop-In<\/li>\n\n\n\n<li>Budget-basierter Loop-Mechanismus: Callback zaehlt Output-Samples, kein Stretcher-Zugriff aus UI-Threadchlag als Loop-In\/Loop-Out in den Player<\/li>\n\n\n\n<li>Analyse laeuft in QThread (nicht blockierend)<\/li>\n\n\n\n<li>Keine neuen Abhaengigkeiten \u2014 alles mit scipy + numpy<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">UI-Reorganisation (Loop-Widget)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Loop Active \u2192 Player<\/strong>: Checkbox aus dem Loop-Widget in die Player-Toolbar verschoben (rechts neben Lyrics)<\/li>\n\n\n\n<li><strong>3-Spalten-Layout<\/strong>: Loop-In-Zeit und Loop-Out-Zeit stehen zentriert ueber ihren Buttons<\/li>\n\n\n\n<li><strong>Button-Reihe<\/strong>: Set Loop-In | Set Loop-Out | Test Loop nebeneinander<\/li>\n\n\n\n<li><strong>Neue Button-Reihe<\/strong>: Loop Finder | Beat Snap nebeneinander<\/li>\n\n\n\n<li>Fixe Zeilenhoehe im 3-Spalten-Grid (dehnt sich nicht bei groesserem Widget)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Loop Finder Dock<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eigenes Dock-Widget, darf nicht mit anderen Widgets andocken (Qt.NoDockWidgetArea)<\/li>\n\n\n\n<li>Oeffnet sich ueber den neuen &#8222;Loop Finder&#8220;-Button im Loop-Widget<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.35 \u2014 Guided Tutorials &amp; Verbesserter Loop-Guard (2026-03-20)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/callerscaddy.de\/tutorials\/\" data-type=\"post\" data-id=\"220\">Tutorial-System<\/a> (13 Tutorials)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues gef\u00fchrtes Tutorial-System mit Tooltip-Overlays und Highlight-Rahmen<\/li>\n\n\n\n<li>11 Widget-Tutorials: Player, Layout, Songliste, Song-Daten, Planner, Playlist, Loop, Lyrics, Sequenzen, Reports, Potential<\/li>\n\n\n\n<li>2 Dialog-Tutorials: Lokationen, Beat Snap<\/li>\n\n\n\n<li>Prioritaetsbasierte Reihenfolge: Player \u2192 Lokationen \u2192 Layout \u2192 Songliste \u2192 \u2026 \u2192 Potential<\/li>\n\n\n\n<li>Automatisches Chaining: Nach Abschluss eines Tutorials wird das naechste angeboten<\/li>\n\n\n\n<li>Tutorial-Angebot ablehnbar: &#8222;Nicht jetzt&#8220; pausiert Tutorials fuer die Sitzung<\/li>\n\n\n\n<li>Schritt-Navigation: Weiter, Zurueck, Ueberspringen + Schritt-Anzeige (z.B. &#8222;3 \/ 5&#8220;)<\/li>\n\n\n\n<li>Enter = Weiter, Escape = Ueberspringen<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tutorial-Menu<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Untermenu &#8222;Tutorials&#8220; mit allen Tutorials in Prioritaetsreihenfolge<\/li>\n\n\n\n<li>Haekchen (\u2713) vor bereits abgeschlossenen Tutorials<\/li>\n\n\n\n<li>&#8222;Alle Tutorials zuruecksetzen&#8220; setzt den Fortschritt komplett zurueck<\/li>\n\n\n\n<li>Menu-Auswahl hat Vorrang ueber automatisches &#8222;naechstes Tutorial&#8220;<\/li>\n\n\n\n<li>Einzelne Tutorials koennen jederzeit ueber das Menu neu gestartet werden<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tutorial-Architektur<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Drei-Komponenten-System: Transparentes Overlay (Klick-Faenger) + Highlight-Rahmen + Tooltip-Popup<\/li>\n\n\n\n<li>Highlight und Tooltip als eigenstaendige Tool-Fenster (liegen ueber QDockWidgets)<\/li>\n\n\n\n<li>Multi-Element-Highlighting: Mehrere Elemente gleichzeitig rahmen (z.B. BPM-Feld + Auto-Button)<\/li>\n\n\n\n<li>Dialog-Tutorials: Eigene leichtgewichtige Engine fuer modale Dialoge (LocationDialog, BeatSnapDialog)<\/li>\n\n\n\n<li>Spezial-Pfade: <code>_menu_bar<\/code>, <code>_dock_XXX_title<\/code> fuer Menu und Dock-Titelleisten<\/li>\n\n\n\n<li>Floating-Dock-Management: Lose Docks werden waehrend Tutorials versteckt und danach wiederhergestellt<\/li>\n\n\n\n<li>Tooltip-Box mit eigenem paintEvent (opaker Hintergrund trotz transparentem Overlay)<\/li>\n\n\n\n<li>Dedizierte Skin-Farben: <code>tutorial_box_bg<\/code>, <code>tutorial_box_text<\/code>, <code>tutorial_highlight<\/code> in allen 4 Themes<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Beat Snap: &#8222;Adjust&#8220; \u2192 &#8222;Snap&#8220;<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Button-Beschriftung von &#8222;Adjust&#8220; zu &#8222;Snap&#8220; umbenannt (inklusive Tooltip und Status-Text)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Verbesserter Loop-Guard (Datenbank)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Erweiterter Schutz gegen versehentliches Ueberschreiben von Loop-Werten<\/li>\n\n\n\n<li>Neuer Guard 2: Erkennt das Engine-Reset-Muster (loop_in=0 + loop_out=Songdauer) und schuetzt gespeicherte Werte<\/li>\n\n\n\n<li>Bisheriger Guard schuetzte nur gegen 0.0, nicht gegen die Songdauer als loop_out<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Win11 Theme<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zoom-SVG-Icons: Strichfarbe von dunkel (#1b1b1b) auf weiss (#ffffff) geaendert (bessere Sichtbarkeit auf blauem Hintergrund)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.34 \u2014 Keyboard-Shortcuts &amp; Elegant Gold Theme (2026-03-19)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Keyboard-Shortcuts (App-weit)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>L-Taste<\/strong>: Oeffnet Lokations-Auswahl-Dialog (mit Fokus auf Lokationsliste)<\/li>\n\n\n\n<li><strong>P-Taste<\/strong>: Oeffnet\/schliesst Planner (mit Fokus auf Pool-Tabelle)<\/li>\n\n\n\n<li>App-weiter EventFilter statt QShortcut (funktioniert auch bei fokussierten Tabellen\/Listen)<\/li>\n\n\n\n<li>Modale Dialoge blockieren Shortcuts automatisch<\/li>\n\n\n\n<li>Textfelder\/SpinBoxen werden erkannt und nicht abgefangen<\/li>\n\n\n\n<li>Planner-Sortierung wird automatisch vorausgewaehlt (Empfehlung bei Lokation, Qualitaet sonst)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Elegant Gold Theme<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues Theme &#8222;Elegant Gold&#8220;: Anthrazit-Basis mit strahlendem Gold (#d4a017)<\/li>\n\n\n\n<li>Goldene Titelleisten, Buttons, aktive Tabs, Header-Trennlinien und Tooltips<\/li>\n\n\n\n<li>Deaktivierte Elemente in mittlerem Goldton (#7a6a2e)<\/li>\n\n\n\n<li>Eingabefelder und Listenbereiche mit leichtem Goldfarbton (#2e2a1f)<\/li>\n\n\n\n<li>SVG-Icons: Pfeile und Dock-Buttons schwarz (#000000), Lupen\/Zahnrad dunkelbraun (#2a2518)<\/li>\n\n\n\n<li>Section-Bar-Segmente (Singing Call 1\/2\/3\/5) in mittlerem Goldton<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Fokus-Management<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Startup-Fokus auf Songliste (verhindert Shortcut-Blockade durch SpinBox)<\/li>\n\n\n\n<li>Floating-Dock-Aktivierung: <code>activateWindow()<\/code> vor <code>setFocus()<\/code> fuer Keyboard-Input<\/li>\n\n\n\n<li>Lokations-Dialog: Fokus auf Liste bei vorhandenen Eintraegen, auf Hinzufuegen-Button bei leerer Liste<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tooltip-Verbesserungen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lokations- und Planner-Buttons zeigen Shortcut-Hinweis im Tooltip (L) \/ (P)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.33 \u2014 Potential-Widget &amp; Menu-Umbau (2026-03-18)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/callerscaddy.de\/clean-up-your-song-database\/\" target=\"_blank\" data-type=\"post\" data-id=\"183\" rel=\"noreferrer noopener\">Potential-Widget (Datenqualitaet)<\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues dockbares Fenster &#8222;Potential&#8220; \u2014 zeigt Optimierungspotential in der Songdatenbank<\/li>\n\n\n\n<li>5 Checks mit Badge-Counter auf den Buttons:<\/li>\n\n\n\n<li>Singing Calls ohne Lyrics<\/li>\n\n\n\n<li>Pattern ohne Loop-Marken<\/li>\n\n\n\n<li>Loops ohne BeatSnap-Optimierung<\/li>\n\n\n\n<li>Lokationen ohne Abspielhistorie<\/li>\n\n\n\n<li>Verwaiste Historieneintraege (geloeschte Lokationen)<\/li>\n\n\n\n<li>Doppelklick navigiert zum betroffenen Objekt (Song-Daten, Beat Snap, Lokation)<\/li>\n\n\n\n<li>&#8222;Ignorieren&#8220;-Button: Einzelne Eintraege als bewusst akzeptiert markieren<\/li>\n\n\n\n<li>&#8222;Alle bereinigen&#8220;: Verwaiste History-Eintraege per Batch loeschen<\/li>\n\n\n\n<li>Lazy Loading: Daten werden erst beim Einblenden geladen<\/li>\n\n\n\n<li>DB: Neue Tabelle <code>potential_ignored<\/code> (check_type + entity_id)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Lokation loeschen<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Loesch-Funktion funktioniert jetzt korrekt (vorher durch Foreign Key blockiert)<\/li>\n\n\n\n<li>Checkbox &#8222;Historiendaten ebenfalls loeschen&#8220; im Bestaetigungsdialog<\/li>\n\n\n\n<li>Ohne Checkbox: Historie bleibt als verwaiste Eintraege erhalten (im Potential sichtbar)<\/li>\n\n\n\n<li>Mit Checkbox: Historie und Stats werden komplett geloescht<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Menu-Umbau<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8222;Design&#8220; umbenannt zu &#8222;Einstellungen&#8220; \/ &#8222;Settings&#8220;<\/li>\n\n\n\n<li>Datumsformat-Einstellung von Ansicht nach Einstellungen verschoben<\/li>\n\n\n\n<li>Sprach-Einstellung von Info nach Einstellungen verschoben<\/li>\n\n\n\n<li>&#8222;Skin&#8220; umbenannt zu &#8222;Theme&#8220; (Menue, Dialoge)<\/li>\n\n\n\n<li>Datumsformat-Label: &#8222;DE&#8220; geaendert zu &#8222;EU&#8220; (europaweit gueltig)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Default-Layout (3-spaltig)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues 3-Spalten-Layout als Standard bei Erstinstallation und Layout-Reset<\/li>\n\n\n\n<li>Spalte 1: Player oben, Loop\/Neu unten<\/li>\n\n\n\n<li>Spalte 2: Songliste und Playlist als Tabs (Songliste aktiv)<\/li>\n\n\n\n<li>Spalte 3: Lyrics, Song-Daten und Sequenzen als Tabs (Lyrics aktiv)<\/li>\n\n\n\n<li>Planner, Reports, Potential versteckt (ueber Menu oeffenbar)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technisch<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Layout-Version 3 (neues Dock erfordert Layout-Reset)<\/li>\n\n\n\n<li>Dock-Aufbau-Reihenfolge: Zuerst 3 Spalten horizontal, dann Spalte 1 vertikal teilen<br>(verhindert dass Player ueber volle Breite spannt)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.32 \u2014 Keyboard, Datei-Auswahl &amp; Loop-Verbesserungen (2026-03-18)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Keyboard &amp; Datei-Auswahl<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ENTER-Taste: Song in Songliste laden, Song im Planner-Pool zur Playlist hinzufuegen, Song in Playlist entfernen<\/li>\n\n\n\n<li>F-Tasten (F5-F8, Space) funktionieren jetzt auch bei abgedockten Fenstern (ApplicationShortcut)<\/li>\n\n\n\n<li>Datei-Auswahl-Button (&#8222;\u2026&#8220;) in Song-Daten: Audio-Datei nachtraeglich aendern<\/li>\n\n\n\n<li>Bei bereits vergebener Datei: Kopie-Dialog mit automatischer Kopie-Erstellung<\/li>\n\n\n\n<li>Erweiterte Audio-Format-Unterstuetzung: WAV, FLAC, OGG, AIFF neben MP3<\/li>\n\n\n\n<li>Audio-Format-Filter auch im Import-Dialog erweitert<\/li>\n\n\n\n<li>Neue DB-Methode <code>update_filename()<\/code> mit UNIQUE-Constraint-Pruefung<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/callerscaddy.de\/perfect-loops-with-mp3\/\" target=\"_blank\" data-type=\"post\" data-id=\"170\" rel=\"noreferrer noopener\">Loop-Crossfade<\/a><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nahtloser Loop-Uebergang durch Crossfade statt hartem Schnitt<\/li>\n\n\n\n<li>Crossfade-Dauer konfigurierbar via INI <code>loop\/crossfade_ms<\/code> (Default 46ms)<\/li>\n\n\n\n<li>Eliminiert WSOLA-Einschwing-Artefakte am Loop-Punkt (kein flush\/warmup noetig)<\/li>\n\n\n\n<li>Budget-basierter Loop-Mechanismus: Callback zaehlt Output-Samples, kein Stretcher-Zugriff aus UI-Thread<\/li>\n\n\n\n<li>Fallback-Sicherung: Feed-Level Loop-Back falls UI-Timer den Seek verpasst<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/callerscaddy.de\/perfect-loops-with-mp3\/\" target=\"_blank\" data-type=\"post\" data-id=\"170\" rel=\"noreferrer noopener\">Loop-Offset<\/a> (pro Song)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automatische Offset-Messung via FFT-basierter Kreuzkorrelation (Tiefpass &lt;200Hz)<\/li>\n\n\n\n<li>Findet optimalen Versatz zwischen Loop-Ende und Loop-Anfang im Bass-Bereich<\/li>\n\n\n\n<li>Suchbereich \u00b12 Sekunden, waehlt den kleinsten Offset mit guter Korrelation (&gt;= 0.1)<\/li>\n\n\n\n<li>Offset wird pro Song in der DB gespeichert (<code>loop_offset_ms<\/code>)<\/li>\n\n\n\n<li>Manuelle Feinkorrektur ueber SpinBox in Song-Daten (\u00b13000ms, 0.5ms Schritte)<\/li>\n\n\n\n<li>Auto-Messung bei Beat Snap und Loop-Test, Ergebnis in DB + SpinBox<\/li>\n\n\n\n<li>DB-Migration: Neue Spalte <code>loop_offset_ms<\/code> wird automatisch angelegt<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bugfixes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Playposition-Anzeige (Uhrzeit + Slider) klemmt nicht mehr bei Pattern-Start mit Loop<\/li>\n\n\n\n<li>Loop-Marken werden beim Dateiwechsel nicht mehr auf 0 zurueckgesetzt<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.31 \u2014 <a href=\"https:\/\/callerscaddy.de\/beat-snap-loop-adjust\/\" target=\"_blank\" data-type=\"post\" data-id=\"145\" rel=\"noreferrer noopener\">Beat Snap Audition<\/a> (2026-03-16)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beat Snap Dialog: Vorhoeren des Loop-Sprungs mit Waveform-Visualisierung<\/li>\n\n\n\n<li>Doppelte Waveform-Anzeige (Loop-Out oben, Loop-In unten) mit Cursor-Synchronisation<\/li>\n\n\n\n<li>Playback-Sample-Counter (<code>_playback_sample<\/code>) in Audio-Engine fuer praezise Positionsbestimmung<\/li>\n\n\n\n<li>Engine-Loop wird waehrend Audition deaktiviert (verhindert Doppel-Sprung durch Feed-Ahead)<\/li>\n\n\n\n<li>Layout-Versionierung: <code>_LAYOUT_VERSION<\/code> verhindert korrupte Dock-States bei Aenderungen<\/li>\n\n\n\n<li>Versioned <code>saveState()<\/code>\/<code>restoreState()<\/code> \u2014 alter State wird automatisch verworfen<\/li>\n\n\n\n<li>Bugfix: Dock-Widgets liessen sich nicht mehr einrasten nach P30\u2192P31 Dock-Aenderung<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.30 \u2014 BPM-Detection, Reports, Lyrics-Kontrast (2026-03-14)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Auto-BPM-Erkennung via Comb-Filter-Bank (scipy\/numpy, keine neuen Pakete)<\/li>\n\n\n\n<li>Sub-Harmonik-Korrektur: Integer-Vielfache pruefen, hoehere Tempi bevorzugen<\/li>\n\n\n\n<li>BPM-Detection laeuft in QThread (nicht blockierend)<\/li>\n\n\n\n<li>Reports-Widget: Setlist\/Musikfolgeliste fuer GEMA mit TXT-Export<\/li>\n\n\n\n<li>Bidirektionale ComboBox-Filterung (Lokation \u2194 Datum)<\/li>\n\n\n\n<li><a href=\"https:\/\/callerscaddy.de\/farbwechsel-via-skins\/\" target=\"_blank\" data-type=\"post\" data-id=\"71\" rel=\"noreferrer noopener\">Lyrics-Kontrast: WCAG-basierte Farberkennung fuer Word-HTML (bgcolor, background, color)<\/a><\/li>\n\n\n\n<li>Sanitizer entfernt Block-Hintergruende, behaelt Inline-Highlights, ersetzt schlechte Textfarben<\/li>\n\n\n\n<li>Default-Stylesheet wird bei jedem Skin-Wechsel und setHtml() aktualisiert<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.29 \u2014 Release-Vorbereitung (2026-03-12)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Internationalisierung: i18n-Modul mit JSON-Translations (Deutsch\/Englisch)<\/li>\n\n\n\n<li>5-Stufen-Ordnerstruktur: 1_Source, 2_Test, 3_Build, 4_Release, _archive<\/li>\n\n\n\n<li>Build-Pipeline: PyInstaller-Spec + build.py (Vollpaket, Update, Source-ZIP)<\/li>\n\n\n\n<li>Clean-DB-Skript: Entfernt User-Daten, behaelt Referenzdaten (Sequenzen, <a href=\"https:\/\/callerscaddy.de\/tutorials\/\">Teaching Order<\/a>)<\/li>\n\n\n\n<li>Migration-EXE: Separater Access-Import-Prozess<\/li>\n\n\n\n<li>Portable Pfade: App-Verzeichnis neben EXE statt Prototypen-Ordner<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.28 \u2014 Sequenzen-Fenster + Design-Menu + Audio-Fix (2026-03-11)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Neues dockbares Fenster &#8222;Sequenzen&#8220; (Dock 9, getabbt mit Lyrics)<\/li>\n\n\n\n<li>Import von 885 Singing-Call-Sequenzen aus Access-MDB (caller.mdb)<\/li>\n\n\n\n<li>Cached Live-Mapping gegen Burleson-Vocabulary (Teaching Order)<\/li>\n\n\n\n<li>Contains-Filter: Autocomplete-Suche nach enthaltenen Calls<\/li>\n\n\n\n<li>Limit-Filter: Nur Sequenzen bis zu einem bestimmten Programm-Level<\/li>\n\n\n\n<li>Lazy Loading (50er-Bloecke) fuer schnelles Scrollen<\/li>\n\n\n\n<li>Detail-Dialog mit allen Calls und Programm-Tags<\/li>\n\n\n\n<li>Remapping-Button (Zahnrad) fuer Teaching-Order-Neuberechnung<\/li>\n\n\n\n<li>Zoom [-\/+] mit Prozentanzeige (wie Lyrics-Widget)<\/li>\n\n\n\n<li>Neues Modul: sequence_mapper.py (Burleson-Mapping-Logik)<\/li>\n\n\n\n<li>DB-Erweiterung: sequences + sequence_calls Tabellen mit Indizes<\/li>\n\n\n\n<li>Design-Menu: Layout laden\/speichern\/wiederherstellen + Skin-Wechsel zur Laufzeit<\/li>\n\n\n\n<li>Benannte Layouts: Caller koennen &#8222;Live.ini&#8220;, &#8222;Workshop.ini&#8220; etc. speichern<\/li>\n\n\n\n<li>Playlist-Manager umbenannt zu &#8222;Planner&#8220; (kuerzer, ueberall umbenannt)<\/li>\n\n\n\n<li>Caller-Workflow-Guidance: Lokation \u2192 Planner-Button rot \u2192 Planner bestaetigt \u2192 Playlist fokus<\/li>\n\n\n\n<li>Audio-Fix: Persistenter Stream (kein Knacken\/Brummen bei Song-Start)<\/li>\n\n\n\n<li>WSOLA-Warmup: 200ms Einschwingphase wird als Stille ausgegeben<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.27 \u2014 <a href=\"https:\/\/callerscaddy.de\/performance-callers-caddy\/\" target=\"_blank\" data-type=\"post\" data-id=\"65\" rel=\"noreferrer noopener\">Performance-Optimierung<\/a> (2026-03-11)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Performance-Messframework mit Phase A (Baseline) und Phase B (Stresstest mit 10k Songs)<\/li>\n\n\n\n<li>Testmethodik: 10 Wiederholungen, Statistik (Mean\/StdDev\/Min\/Max), CSV-Export<\/li>\n\n\n\n<li>Pool-Tabelle im Playlist-Manager: <strong>40% schneller<\/strong> durch optimiertes Tabellen-Pattern<\/li>\n\n\n\n<li>Songliste: <strong>7% schneller<\/strong> durch gleiche Optimierung<\/li>\n\n\n\n<li>Erkenntnis: QTableWidget-Rebuild ist der Flaschenhals, nicht DB oder Sortierung<\/li>\n\n\n\n<li>Optimiertes Pattern: <code>setRowCount(0)<\/code> + <code>setRowCount(n)<\/code> + <code>setItem()<\/code> statt <code>insertRow()<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.26 \u2014 Lyrics-Anzeige (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lyrics-Widget als dockbares Fenster (getabbt mit Song-Daten)<\/li>\n\n\n\n<li>Unterstuetzte Formate: HTML\/HTM, RTF, TXT<\/li>\n\n\n\n<li>Auto-Fit: Schriftgroesse wird automatisch angepasst wenn Text auf eine Seite passt<\/li>\n\n\n\n<li>Auto-Scroll: Proportional zum Song-Fortschritt<\/li>\n\n\n\n<li>Smarte Farb-Bereinigung: Hintergruende entfernt, Sektionsfarben beibehalten<\/li>\n\n\n\n<li>Toolbar mit Auto-Scroll\/Auto-Size Toggle und Zoom +\/-<\/li>\n\n\n\n<li><a href=\"https:\/\/callerscaddy.de\/farbwechsel-via-skins\/\" target=\"_blank\" data-type=\"post\" data-id=\"71\" rel=\"noreferrer noopener\">Light Blue Skin: Zweites Farbschema (helle Oberflaeche, blaue Akzente)<\/a><\/li>\n\n\n\n<li>Muted- und Indicator-Farben fuer besseren Kontrast in beiden Skins<\/li>\n\n\n\n<li>Loop-Save-Bugfix: Snapshot-Mechanismus sichert Loop-Werte vor Song-Wechsel<\/li>\n\n\n\n<li>Gemeinsame Datenordner (music\/, lyrics\/, playlists\/) sparen Plattenplatz<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.21 \u2014 Playlist und Playlist-Manager (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PlaylistWidget: Schlank, getabbt neben Songliste, Laden\/Speichern als .txt<\/li>\n\n\n\n<li>PlaylistManagerWidget: Zwei-Panel-Ansicht mit Song-Pool und Playlist-Spiegel<\/li>\n\n\n\n<li>Song-Transfer: Doppelklick, Pfeil-Buttons, Drag &amp; Drop<\/li>\n\n\n\n<li>4 Sortierungen: Alphabetisch, Qualitaet, Zuletzt gespielt, Empfehlung<\/li>\n\n\n\n<li>Filter: Alle \/ nur Pattern \/ nur Singing<\/li>\n\n\n\n<li>Auto-Advance: Naechster Song bei Song-Ende, Stop oder Fade-Out<\/li>\n\n\n\n<li>Fade-Out: Konfigurierbarer linearer Volume-Ramp (Default 3s)<\/li>\n\n\n\n<li>Empfehlungssystem integriert (urspr. P25)<\/li>\n\n\n\n<li>Playlist-Builder integriert (urspr. P24)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.20 \u2014 Abspielhistorie (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Drei-Schichten-Architektur: play_history, song_location_stats, On-the-Fly-Berechnung<\/li>\n\n\n\n<li>&#8222;Zuletzt gespielt&#8220;-Spalte in der Songliste<\/li>\n\n\n\n<li>Lokations-bezogene Statistik (wann wurde welcher Song wo gespielt)<\/li>\n\n\n\n<li>Umbenennung: &#8222;Club&#8220; wird zu &#8222;Lokation&#8220; (generalisiert fuer Club + Special)<\/li>\n\n\n\n<li>INI-Setting fuer Datumsformat (deutsch\/amerikanisch)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.19 \u2014 Lokationen (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Club- und Special-Verwaltung als auswaehlbare Kontexte<\/li>\n\n\n\n<li>Lokationsauswahl beeinflusst Songempfehlung und Historie<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.18 \u2014 Pattern\/Singing-Modus (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Songs als Pattern, Singing oder beides markierbar<\/li>\n\n\n\n<li>Typ-Kuerzel (P\/S\/PS) in Songliste und Pool-Anzeige<\/li>\n\n\n\n<li>Filter im Playlist-Manager nach Modus<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.17 \u2014 Heutiges Tempo (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gespeichertes Tempo pro Song fuer den heutigen Abend<\/li>\n\n\n\n<li>Tempo wird beim Laden eines Songs automatisch wiederhergestellt<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.16 \u2014 Songliste mit Suche (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Songliste als QTableWidget mit Echtzeit-Suchfilter<\/li>\n\n\n\n<li>Suche ueber Titel, Label und Dateiname<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.15 \u2014 Portable Pfade (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Relative Pfade fuer Songs und Daten<\/li>\n\n\n\n<li>Anwendung kann auf USB-Stick oder zwischen Rechnern verschoben werden<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.14 \u2014 Auto-Save (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automatisches Speichern aller Aenderungen (Song-Daten, Einstellungen)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.13 \u2014 Song-Datenmodell (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SQLite-Datenbank fuer Songs, Lokationen, Historie<\/li>\n\n\n\n<li>Song-Felder: Titel, Dateiname, Label, Qualitaet, Pattern\/Singing, Tempo<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.07 \u2014 Dock-Fenstersystem (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>QDockWidget-basiertes Fenstersystem mit freier Anordnung<\/li>\n\n\n\n<li>Fenster verschieben, andocken, stapeln, Groesse aendern<\/li>\n\n\n\n<li>Layout wird gespeichert und beim Neustart wiederhergestellt<\/li>\n\n\n\n<li>Resize-Regeln pro Fenstertyp<\/li>\n\n\n\n<li>Integriert: P8 (Ein-\/Ausblenden), P9 (Verschieben), P10 (Resize-Regeln), P11 (Docking), P12 (Layout-Persistenz)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.06 \u2014 Loop mit Tempoanpassung (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Loop-Region bleibt bei Tempowechsel stabil<\/li>\n\n\n\n<li>Eigener Streaming-WSOLA-Algorithmus (kein Rubber Band\/SoundTouch)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.05 \u2014 Loop-In \/ Loop-Out (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Markierbare Loop-Region mit Start- und Endpunkt<\/li>\n\n\n\n<li>Nahtloser Loop waehrend der Wiedergabe<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.04 \u2014 Tempo und Pitch gleichzeitig (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unabhaengige gleichzeitige Tempo- und Pitch-Steuerung<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.03 \u2014 Pitch-Steuerung (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tonhoehe stufenlos aendern, unabhaengig vom Tempo<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.02 \u2014 Tempo-Steuerung (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wiedergabegeschwindigkeit stufenlos aendern<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.01 \u2014 MP3-Wiedergabe (2026-03)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MP3-Dateien laden und stabil abspielen<\/li>\n\n\n\n<li>Grundlegende Transportsteuerung (Play, Pause, Stop)<\/li>\n\n\n\n<li>Positionsanzeige und Seek-Slider<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Versionierung: 0.XX = Prototyp-Phase (XX = Prototyp-Nummer).Ab offiziellem Launch wird auf 2.0 umgestellt.Die Versionen 1.xx bleiben f\u00fcr die alte Version offen 0.162 \u2014 Loop Finder mit Zeitfenstern, Doppelklick in der Playlist &amp; ausgeblendete Sequenzen beim Start (2026-10-15) Verbesserungen Bugfixes 0.161 \u2014 Audio-Ausgang per Klick umschalten, Song-Typ \u201eSonstiges\u201c &amp; In-Lesebalken Countdown (2026-10-10) Verbesserungen Bugfixes 0.160 \u2014 &#8230; <a title=\"Release Notes \u2013 Callers Caddy\" class=\"read-more\" href=\"https:\/\/callerscaddy.de\/en\/release-notes\/\" aria-label=\"Read more about Release Notes \u2013 Callers Caddy\">Read more<\/a><\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-130","page","type-page","status-publish"],"_links":{"self":[{"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/pages\/130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/comments?post=130"}],"version-history":[{"count":9,"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/pages\/130\/revisions"}],"predecessor-version":[{"id":973,"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/pages\/130\/revisions\/973"}],"wp:attachment":[{"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/media?parent=130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}