{"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-05-03T11:00:11","modified_gmt":"2026-05-03T09:00:11","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><\/p>\n\n\n\n<p>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.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 > 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;BPM wird ermittelt \u2026&#8220;-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), Loop Finder direkt darunter (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\/Tastenk\u00fcrzel zur vorherigen\/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>: Ein Tastendruck \u00f6ffnet den Dual-View (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, Square Dance spezifisch, 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>Apply-Button: Uebernimmt den Vorschlag 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, Teaching Order)<\/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><\/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.69 \u2014 Rules: BPM-Bedingungen + Auto-Detect-Aktion; zentrale Pfadaufl\u00f6sung (2026-05-03) Rules \u2014 neue Bedingungen Rules \u2014 neue Aktion Zentrale Pfadaufl\u00f6sung (BL-104) Bugfixes 0.68 \u2014 Player-Widget Redesign (2026-05-02) Player-Widget: Neues Layout Sektionsleiste neu Transport-Buttons: SVG-Icons Theme-relative &#8230; <a title=\"Release Notes &#8211; Callers Caddy\" class=\"read-more\" href=\"https:\/\/callerscaddy.de\/en\/release-notes\/\" aria-label=\"Read more about Release Notes &#8211; 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":10,"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/pages\/130\/revisions"}],"predecessor-version":[{"id":444,"href":"https:\/\/callerscaddy.de\/en\/wp-json\/wp\/v2\/pages\/130\/revisions\/444"}],"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}]}}