Release Notes – Callers Caddy

Versionierung: 0.XX = Prototyp-Phase (XX = Prototyp-Nummer).
Ab offiziellem Launch wird auf 2.0 umgestellt.
Die Versionen 1.xx bleiben für die alte Version offen


0.66 — Bugfixes (TIC-0015, TIC-0017, TIC-0018) (2026-04-30)

Bugfixes

  • TIC-0015 Lyrics-Zoom-Stufe wird jetzt beim App-Start korrekt wiederhergestellt — Zoom-Wert und Auto-Size-Zustand werden in der INI gespeichert und beim nächsten Start sofort angewendet
  • TIC-0017 Loop-Count-Dialog im Planner findet Songs jetzt auch in Musikordnern Slot 2–4 — Funktion show_loop_count_dialog nutzt jetzt find_song_file() statt nur Slot 1
  • TIC-0018 Rule-Aktion „Load Layout“: Dropdown zeigt jetzt alle gespeicherten Layouts aus dem skins/-Ordner — layout_names_provider angebunden, TODO-Stub ersetzt

0.65 — Statistik-Dock (BL-019) (2026-04-29)

Neues Dock: Statistik

  • Neues andockbares, lazy geladenes Fenster „Statistik“ im Ansicht-Menü (tabbiert mit Reports)
  • Filter (oben): Lokation (Alle oder einzelne), Typ (Beide / Pattern / Singing), Zeitraum (Alle Zeit / 5 Jahre / 1 Jahr / 3 Monate / 1 Monat)
  • Drei Spalten (scrollbar, alle Songs ohne Limit):
  • TOP — alle gespielten Songs, meistgespielt zuerst, mit Abspielanzahl
  • FLOP — alle gespielten Songs, wenigstgespielt zuerst, mit Abspielanzahl
  • Nie gespielt — alle Songs ohne Play in den aktuellen Filtern, alphabetisch
  • Doppelklick auf einen Song springt direkt zur Songliste
  • Histogramm (volle Breite): Verteilung aller Songs nach Abspielanzahl
  • Bin 0 ist immer fest für „nie gespielt“, danach 9 logarithmisch verteilte Bins
  • Farbgradient von Blau (kalt = selten) bis Orange-Rot (heiß = oft gespielt), unabhängig vom Skin
  • Tooltip auf jedem Balken zeigt Bin-Bereich, Anzahl Songs und bis zu 5 Beispiel-Titel
  • Übersetzungen DE + EN vollständig vorhanden

0.64 — First-Steps-Paket, Tutorial-Überholung, Playlist-Verbesserungen (2026-04-28)

Beispielprojekt für Neueinsteiger (first-steps/)

  • first-steps/-Ordner wird in jeder Neuinstallation mitgeliefert
  • Enthält „YRR 049 – Electro Blues.mp3″ von Jon Hansell Nilsson (freundlicherweise zur Verfügung gestellt) und das passende Lyricsheet „YRR 049 – Electro Blues.htm“. Yellow Rock Records bietet kostenlose Pattern-Musik an. Unbedingt ausprobieren.
  • Das Lyricsheet thematisiert auf witzige Weise die Funktionen von Callers Caddy
  • build.py: Schritt 3 kopiert 1_Source/first-steps/ automatisch in den App-Ordner

Tutorial: New Songs Tour (komplett überarbeitet)

  • Umbenannt von „Loop-Tour“ zu „New Songs Tour“
  • Menüreihenfolge: New Songs Tour jetzt direkt nach Player-Tour (Prio 97), Loop Finder direkt darunter (Prio 96), Beat Snap danach
  • Step 1 (Import-Button): Expliziter Handlungsaufruf mit Schritt-für-Schritt-Anleitung durch die drei Import-Dialoge — Songtyp „Beides“, Kopieren, Einzeldateien aus first-steps/
  • Step 2 (Auto-Loop): Loop Finder als zweiter Schritt statt manuellem In/Out-Setzen — manuelle Buttons und Beat Snap aus dem Tutorial entfernt
  • Song-Daten-Tutorial um Step 4 erweitert: „Lyricsheet verknüpfen“ mit Hinweis auf first-steps-HTM

Songliste: Song zur Playlist hinzufügen

  • → Playlist-Button unterhalb der Songliste (neben „Liste aktualisieren“ und „→ Notiz“)
  • Rechtsklick-Kontextmenü der Songliste: neuer Eintrag „Zur Playlist hinzufügen“
  • „→ Notiz“-Button von der Suchzeile nach unten in die Button-Leiste verschoben

Playlist: Songs entfernen

  • ✕-Button neben den Pfeiltasten ▲ ▼ entfernt den markierten Song sofort
  • Rechtsklick-Kontextmenü: „Aus Playlist entfernen“ ganz oben (vor Separator)
  • Entf-Taste: QShortcut mit WidgetWithChildrenShortcut-Kontext — funktioniert unabhängig davon, welches Kind-Widget Fokus hat

0.63 — LoopFinder Lazy Init, Mapping Export/Import, Sequenzen Export (2026-04-27)

LoopFinder: Lazy Initialisierung

  • LoopFinderWidget wird nicht mehr beim Start erstellt, sondern erst beim ersten Öffnen des Fensters
  • Spart ~100ms Startzeit auf schwacher Hardware (Notebook: addDockWidget war 106ms)
  • Waveform + Sprungbereiche werden beim Öffnen sofort angezeigt (kein manuelles „Analysieren“ nötig für die Vorschau)
  • Song-Info wird nachgereicht falls beim Öffnen bereits ein Song geladen ist
  • setFloating und restoreGeometry des Dock-Fensters ebenfalls per QTimer.singleShot nach show() verschoben

Mapping Export/Import (Sequenzen-Menü)

  • Mapping exportieren…: Speichert alle call_text_mappings als JSON-Datei (call_text, entity_id, mapped_by)
  • Mapping importieren…: Liest JSON, fügt neue Einträge ein (INSERT OR IGNORE), überspringt bereits vorhandene
  • Rückmeldung: „X neue Mappings importiert, Y bereits vorhanden (übersprungen)“
  • Bei neuen Einträgen wird automatisch Remapping angestoßen

Sequenzen exportieren (JSON)

  • Neuer Menüpunkt Sequenzen exportieren (JSON)… nach den drei Import-Punkten
  • Exportiert alle Sequenzen im exakt gleichen Format wie der JSON-Import erwartet (id, calls, level, seq_type, difficulty)
  • Exportierte Datei kann direkt wieder per „Sequenzen importieren (JSON)“ eingelesen werden

UI-Detail

  • Pfeil-Buttons (◀ ▶) und Note-Button im Sequence-Detail-Fenster haben jetzt einheitliche Höhe (40px) — bessere Treffsicherheit am Laptop

Projektdokumentation

  • CLAUDE.md: setFloating(True) auf Windows kostet ~90ms (einmalig pro Floating-Dock-Kontext) — wandert nur zwischen Buckets wenn man es defer’t, spart keine Gesamtzeit

0.62 — CallMatcher & Sequenz-UI-Verbesserungen (2026-04-27)

Call-Mapping: Intelligenter Auto-Vorschlag (CallMatcher)

  • Drei-Stufen-Matching vollständig in sequence_mapper.py ausgelagert — keine API-Kosten, läuft lokal in Millisekunden
  • Stufe 1: Exakter Vergleich nach Normalisierung (Präfixe/Suffixe entfernt) → Score 1.0
  • Stufe 2: Bidirektionaler Token-Overlap (geometrisches Mittel aus Precision × Recall) → Score bis 0.92
  • Stufe 3: difflib.SequenceMatcher als Fallback (nur wenn Token-Score ≥ 0.30) → Score bis 0.85
  • Farbcodierung der Call-Text-Zeilen im Mapping-Dialog:
  • 🟢 Grün (Score ≥ 0.85): sicherer Vorschlag
  • 🟡 Gelb (Score 0.50–0.84): unsicherer Vorschlag, manuelle Prüfung empfohlen
  • 🔴 Rot (Score < 0.50): kein brauchbarer Vorschlag
  • Grün auch für bereits gemappte Einträge
  • Altes _normalize_call_text/_norm_index-System in main.py durch CallMatcher-Import ersetzt

Sequenz-Tabelle: UX-Verbesserungen

  • Level-, Type- und Difficulty-Spalten ausgeblendet (setColumnHidden) — Sequenz füllt die volle Tabellenbreite
  • Type-Filter-Dropdown startet mit „Singer (Corner progression)“ als Standardwert (häufigster Typ)
  • Bugfix: ResizeToContents bei Type-Spalte ließ die Sequenz-Spalte schrumpfen wenn viele Zeilen denselben langen Typ hatten

Performance-Logging

  • Neue Messpunkte: SequencesWidget und SequenceViewWidget getrennt gemessen
  • Neuer Messpunkt: _build_menu (war bisher in song_list.refresh versteckt)
  • Neuer Messpunkt: _init_sequences intern aufgeteilt (load_sequences + sequence_view prefill)
  • Bugfix: LoopFinder-Split zeigte fälschlicherweise Notizen-Zeit mit an (_td10_td10b)

0.61 — Sequenzen Import & Call-Mapping (2026-04-26)

Sequenz-Tabelle erweitert

  • Neue Spalten type und difficulty in der sequences-Tabelle (Migration idempotent)
  • insert_sequence() nimmt jetzt seq_type und difficulty entgegen
  • Neue DB-Methoden: get_sequence_type_values(), get_sequence_difficulty_values()

Sequenz-UI erweitert

  • Tabelle: von 3 auf 4 Spalten — Sequenz (Stretch, sofort sichtbar), Level, Typ, Schwierigkeit
  • Zweite Filter-Zeile mit Typ– und Schwierigkeit-Dropdown
  • Alle Filter (Contains, Limit, Typ, Difficulty) greifen konsistent in Tabelle, Navigation und Shortcodes

Neue Import-Formate im Menü „Sequenzen“

  • JSON-Import (import_from_json): lädt eine oder mehrere JSON-Dateien, hängt Sequenzen an
  • CSDS-Import (import_from_csds): lädt Vic Ceder’s .in/.csds-Exportformat; parst #EASY#/#REC=/#SEQTYPE=-Metadaten und bereinigt <C ALT="...">text</C>-Markup automatisch
  • Deduplizierung über Ceder-Record-ID beim Mehrfach-Import
  • Letztes Import-Verzeichnis wird in den Settings gemerkt

Call-Mapping-Dialog

  • Neuer Menüpunkt „Call-Mapping…“ im Sequenzen-Menü
  • Tabelle aller ungemappten Call-Texte, sortiert nach Häufigkeit (häufigste zuerst — ein Eintrag kann viele Sequenzen auf einmal heilen)
  • Rechte Spalte: editierbare ComboBox mit Contains-Autocomplete — öffnet sich erst beim Klick (Delegate, kein Voraus-Rendering)
  • Lazy Loading: nur 20 Zeilen initial, weitere beim Scrollen ans Ende
  • Gelbe Markierung für Texte ohne Auto-Vorschlag
  • Auto-Vorschlag durch normalisierten Textvergleich: Präfixe (Heads/Sides/Centers/Boys/Girls…) und Suffixe (Zahlen, Brüche, Klammern) werden abgeschnitten
  • Sonderoption „→ An Komma aufteilen“: Calls wie "Flutter Wheel, Sweep 1/4" werden direkt in den Sequenzen gesplittet — nachfolgende Felder rücken automatisch nach rechts
  • Sondereintrag „Filler Words“ (TO=0.001) für Füllphrosen die kein echtes Level haben — verhindert NULL bei der Levelberechnung ohne das Ergebnis zu verfälschen
  • Nach dem Speichern wird automatisch recompute_sequence_max_to() angestoßen

0.60 — F13–F24 Tasten-Trigger (2026-04-25)

Erweiterte F-Tasten-Unterstützung

  • F13–F24 sind jetzt vollwertige Rule-Trigger — erscheinen im Trigger-Dropdown des Rule-Editors
  • Capture-Dialog erkennt F13–F24 beim Drücken korrekt und zeigt sie als „F13″ etc. an
  • Abfang über den App-weiten EventFilter (zuverlässiger als QKeySequence-Strings, die Qt für F13+ nicht parst)
  • Nützlich für USB-Fernbedienungen und Makro-Pads, die erweiterte F-Tasten senden

0.59 — Shortcodes in Notizen & Rule-Editor Gruppen (2026-04-24)

Shortcodes in Notizen (BL-093)

  • Shortcode-Syntax in Notizen: [load_song "Titel"] lädt ein Lied; [sequence_view id=42] / [sequence_view contains="Swing Thru" limit="MS"] öffnet die Sequenzansicht mit optionalem Filter
  • Shortcodes werden ausgelöst beim manuellen Abhaken einer Notiz sowie via notes_tick_top-Regel
  • Neues Modul shortcode_parser.py mit robustem Regex-Parser (positionale und benannte Parameter, Integer-Erkennung)
  • → Notiz Button in Songliste, Playlist, Sequenz-Übersicht und Sequenz-Detail: fügt den aktuellen Eintrag als Shortcode in die Notizliste ein
  • → Filter Button in Sequenz-Übersicht: fügt die aktiven Contains/Limit-Filter als [sequence_view]-Shortcode ein
  • Rechtsklick-Menü (Context-Menu) in Songliste, Playlist und Sequenz-Tabelle: „Zu Notizen hinzufügen“
  • Warnung wenn keine Lokation gewählt und Notiz eingefügt werden soll
  • Songtitel wird ohne Anzeige-Suffixe (Typ, Label, Qualität) in den Shortcode übernommen

Rule-Editor: Aktionen gruppiert

  • Die 43 Regelaktionen sind jetzt in 10 Kategorien gegliedert: Transport · Audio · Layout & Docks · Lyrics & Scroll · Sequence View · Notes · Workflow · Photo · Genre · Info & Warnings
  • Nicht-auswählbare Gruppenheader im Aktions-Dropdown für bessere Übersicht
  • Reihenfolge der Aktionen innerhalb der Gruppen logisch sortiert
  • Bestehende Rules bleiben vollständig kompatibel — nur die Anzeige ändert sich

0.58 — Sequence Detail als echtes Dock (2026-04-24)

Sequence Detail als QDockWidget (BL-092)

  • dock_sequence_view ist jetzt ein vollwertiges Dock-Widget — kein temporärer Popup-Dialog mehr
  • Kann wie alle anderen Docks behandelt werden: dock_open, dock_close, dock_fullsize, dock_focus, dual_view, Layout-Save/Restore
  • Klick auf eine Zeile in der Sequenzübersicht aktualisiert das Detail-Dock und bringt es in den Vordergrund
  • Im Regel-Editor unter dem Kurzname sequence_view verfügbar (z.B. dual_view mit dock_left=sequences + dock_right=sequence_view)
  • sequenceview_maximize öffnet das Dock als schwebendes 90 %-Fenster — kein Konflikt mehr mit dem Dual-View
  • Navigation (◀/▶, Tastatur ← →) bleibt erhalten; sequenceview_prev/sequenceview_next-Regelaktionen steuern das Dock direkt
  • Alle Regel-Aktionsnamen durchgehend Englisch: sequenceview_* (statt sequenzview_*)
  • Filter-Sync: Ändert der Nutzer den Contains- oder Limit-Filter in der Sequenzübersicht, springt das Detail-Dock automatisch auf die erste Sequenz der neuen Ergebnisliste (nur wenn das Dock sichtbar ist)
  • Startup-Vorbefüllung: Beim App-Start wird das Detail-Dock sofort mit Sequenz 1 gefüllt — kein leeres Fenster beim ersten Öffnen

0.57 — SequenzView Navigation & Vollbild (2026-04-24)

SequenzView — Navigation ohne Dialog zu schließen (BL-089)

  • ‹ / › Buttons in der Sequenzansicht: blättert durch die aktuell gefilterte Liste
  • Positions-Anzeige „3 / 12″ zwischen den Buttons — Caller sieht sofort wo er in der Liste steht
  • Tastatur-Support: ← / → Pfeiltasten navigieren ebenfalls (ideal für freihandigen Betrieb)
  • Buttons werden am Anfang bzw. Ende der Liste automatisch deaktiviert
  • Navigation bezieht sich immer auf die vollständige gefilterte Liste (nicht nur geladene Zeilen)
  • Neue DB-Methode get_filtered_sequence_ids() liefert alle passenden IDs für die Navigation

SequenzView — Auto-Zoom & freie Fenstergröße (BL-090)

  • Frei vergrößerbar: Dock kann beliebig groß gezogen werden
  • Mitwachsende Schrift: Schriftgröße der Calls passt sich automatisch an die verfügbare Fensterhöhe an — Sequenz füllt das Fenster optimal aus
  • ◀ / ▶ Buttons in einheitlicher Größe (font-size 16px)
  • Position-Label „X / N“ verwendet die Schriftfarbe des aktiven Themes

SequenzView — Rule-Aktionen (BL-091)

  • sequenzview_open: zeigt das Detail-Dock mit der aktuellen Tabellenauswahl
  • sequenzview_close: versteckt das Detail-Dock
  • sequenzview_prev / sequenzview_next: blättert per Rule/Tastenkürzel zur vorherigen/nächsten Sequenz
  • sequenzview_focus: bringt das Detail-Dock in den Vordergrund
  • sequenzview_maximize: macht das Detail-Dock als schwebendes 90%-Fenster
  • Auto-Zoom bidirektional: Schriftgröße wird auch nach oben korrigiert wenn der erste Schätzwert zu konservativ war

0.56 — Dual-View & Songlisten-Schnellnavigation (2026-04-23)

Dual-View: zwei Widgets nebeneinander (BL-077)

  • Neue Regel-Aktion dual_view: Öffnet zwei beliebige Docks als schwebende Fenster nebeneinander — zusammen 90 % Bildschirmbreite und -höhe, zentriert mit 4 px Abstand
  • Flexibles Breitenverhältnis: Auswahl aus 50:50, 33:67 oder 67:33 direkt im Regel-Editor
  • Neue Aktion dual_view_close: Schließt beide Dual-View-Fenster und dockt sie zurück
  • Neue Aktion dual_view_toggle: Ein Tastendruck öffnet den Dual-View (Layout wird automatisch gesichert), ein zweiter Tastendruck stellt das ursprüngliche Layout exakt wieder her — ideal als Keyboard-Shortcut
  • Alle drei Aktionen erscheinen mit englischen Display-Namen im Regel-Editor; Parameter dock_left, dock_right und split als gewohnte Dropdowns
  • Häufigste Kombination: Lyrics links + Sequenzen rechts, 50:50

0.55 — Planner-Loop-Dialog & Doppelklick-Fix (2026-04-22)

Planner: Loop-Dialog mit Ziel-Patternlänge vorbelegt (BL-085)

  • Loop-Count-Dialog im Planner und im Playlist-Widget übernimmt jetzt automatisch die Ziel-Patternlänge des aktiven Tanzprogramms als Voreinstellung (statt fest 7 min)
  • Ist kein Tanzprogramm gesetzt, bleibt der Standardwert 7 min

Playlist-Widget: Doppelklick auf Loops-Spalte (BL-085)

  • Doppelklick auf die Loops-Spalte im Playlist-Dock öffnet jetzt denselben Loop-Count-Dialog wie im Planner — Anzahl und Zeitvorgabe direkt editierbar
  • Zuverlässige Auslösung über mouseDoubleClickEvent-Override in _PlaylistTable, der einen bekannten Qt-6-Timing-Konflikt zwischen DragDrop-Modus und cellDoubleClicked-Signal umgeht

0.54 — Tanzprogramm-System & Lokations-Erweiterungen (2026-04-22)

Tanzprogramm-Anzeige im Player (BL-083)

  • Neuer Button btn_program in der Player-Info-Zeile (neben BPM): zeigt das aktuell eingestellte Tanzprogramm-Kürzel an (z.B. MS, A1 Class)
  • Schnellauswahl-Dialog: Klick auf den Button öffnet ein Grid aller konfigurierten Programme als Schaltflächen — Button-Breite passt sich automatisch an den längsten Text an
  • 14 Default-Programme: MS, MS Class, PL, PL Class, A1, A1 Class, A2, A2 Class, C1, C1 Class, C2, C2 Class, C3A, C3A Class — je mit konfigurierbarer Ziel-Patternlänge (Standard 7 min)
  • Verwaltungsdialog über Menü Datenbank → Tanzprogramme verwalten: Programme anlegen, umbenennen, Reihenfolge und Ziel-Patternlänge anpassen, löschen
  • Neue DB-Tabelle dance_programs; bestehende Installationen erhalten die Default-Programme automatisch beim nächsten Start (INSERT OR IGNORE)

Lokations-Einstellungen: Tanzprogramm & temporäres Tempo (BL-084 + BL-086)

  • Neuer „Einstellungen“-Button im Lokations-Dialog: öffnet einen Einstellungs-Dialog für die gewählte Lokation
  • Tanzprogramm-Zuweisung pro Lokation: Beim Wählen einer Lokation wird das gespeicherte Tanzprogramm automatisch im Player eingestellt
  • Temporäres Tempo pro Lokation: SpinBox (50–150 %, Standard 100 % = kein Einfluss). Bei Lokationswechsel wird der gespeicherte Wert automatisch in das Feld „Temporäres Tempo“ übernommen — praktisch für Classes und Anfänger-Gruppen mit fester Tempobremse
  • Neue DB-Spalten dance_program_id und temp_tempo in der locations-Tabelle (Migration für Bestandsinstallationen)

0.53 — Class Designer: Prüfen & Optimieren, Notizen-Feinschliff (2026-04-20)

Class Designer — Prüfen & Optimieren (neu)

  • „Prüfen“-Button in Spalte 3: löst explizit Überlast/Unterlast-Färbung der Tagesheader und Abstandregel-Check aus
  • Orange Markierung für Teaches, die Prereq-Delay-Regeln verletzen (vorher rot) — klar abgegrenzt vom roten Überlast-Tagesheader
  • „Optimieren“-Button: iterative Local Search (Best-Improvement Hill Climbing) auf dem bestehenden Plan — ersetzt keine Generator-Neubelegung, sondern räumt Verstöße und Lastungleichheiten nachträglich auf
  • Zielfunktion: Verstöße × 10 000 + Σ(Last − Ø)² — Constraint-Verstöße dominieren hart, Lastvarianz wird darunter feinabgestimmt
  • Respektiert manuelle Drag-Änderungen in Spalte 3
  • Harte Constraints werden pro Move geprüft: Prereq-Delay, Nachfolger-Delay, Repeat nach Teach, keine doppelten Repeats am selben Tag
  • Konvergiert deterministisch (max. 200 Iterationen); typisch deutlich schneller
  • Algorithmus-Einordnung (RCPSP / Sprint-Rebalancing) dokumentiert in docs/16_class_designer.md

Class Designer — UX-Verbesserungen

  • Effort-Felder als Button-Reihe statt ComboBox: alle Fibonacci-Werte (1, 2, 3, 5, 8, 13 bzw. 0–13 bei Info) als Toggle-Buttons direkt sichtbar — ein Klick statt Dropdown öffnen
  • Neue Einträge hinter markiertem Element: Bei „+ Call“ und „+ Info“ wird das neue Element hinter dem aktuell selektierten eingefügt (statt ans Ende) und automatisch markiert — kettenweises Einfügen fließt natürlich
  • Effort-Filter in Spalte 2: Toggle-Button-Reihe 0 | 1 | 2 | 3 | 5 | 8 | 13 zwischen Toolbar und Planungstabelle. Standardmäßig alle aktiv — ermöglicht auf einen Blick zu prüfen, ob Calls mit gleichem Aufwand auch ähnlich aufwendig sind
  • n_evenings wird im Col3-Widget gespeichert, damit Optimieren auch nach manuellen Änderungen mit dem richtigen Rahmen arbeitet

Notizen-Widget — Darstellung & Bearbeitung

  • Oberste offene Notiz 4× vergrößert (BL-079): Die aktuell wichtigste Notiz wird prominent als große, fette Überschrift angezeigt — Vergrößerungsfaktor in INI konfigurierbar (notes/first_note_factor, Default 4.0)
  • Kompakter Zeilenabstand bei langem Mehrzeilen-Text: Das Label rendert Wort-Umbrüche jetzt selbst (statt über Qt’s Standard-Lineheight) und nutzt ca. 90 % der Schriftgröße als Zeilenvorschub — spart bei der großen ersten Zeile erheblich Platz, ohne Descender abzuschneiden
  • Wortumbruch für sehr lange Notizen: Text umbricht sauber innerhalb der Zeile, Zeilenhöhe wächst mit
  • Doppelklick zum Bearbeiten: Linker Doppelklick auf eine Notizzeile öffnet einen Edit-Dialog mit mehrzeiligem Textfeld — Theme-konform gestylt, Sprache folgt UI-Einstellung (DE/EN), Ctrl+Enter bestätigt
  • Zoom-Buttons +/− weiterhin aktiv — die neue Rendering-Logik respektiert die Zoom-Stufe
  • Neue DB-Methode update_note_text(note_id, text) in song_db

Regel-System

  • Neue Aktion notes_tick_top (BL-080): Hakt die oberste offene Notiz der aktiven Lokation ab — nützlich z.B. für Keyboard-Shortcuts oder Timer-Events. Bei leerer Liste stumm ignoriert (keine Fehlermeldung)

Interne Aufräumarbeiten

  • Neues Helper-Widget _ValueButtonRow für exklusive Wert-Auswahl (wiederverwendbar für weitere diskrete Auswahlen)
  • Helper _insert_after_selected() in Col2 — zentralisiert Einfüge-Logik
  • Neue QLabel-Subklasse _TightLabel mit eigenem paintEvent + manuellem Wortumbruch für präzise Zeilenabstandskontrolle
  • Neuer modaler Dialog _NoteEditDialog

0.52 — Class Designer (Prototyp) & Tracking-Fix (2026-04-17)

Class Designer — Erster Prototyp

  • Hinweis: Dies ist der erste Prototyp des Class Designers — weiterer Feinschliff ist definitiv nötig
  • Gleichmäßigere Punkteverteilung pro Tag: Umstellung auf Greedy-Bin-Filling. Jeder Tag wird bis zum Zielbudget (Gesamt-Punkte / Anzahl Tage) aufgefüllt, bevor der nächste Tag befüllt wird
  • Repeat-Constraints respektiert: Wiederholungen derselben Figur halten weiterhin mind. 1 Tag Abstand; Prereq-Delays bleiben erhalten
  • Unterfüllte Tage vermieden: Wenn ein Repeat wegen earliest-Constraint vorspringt, bleibt der Tag-Zeiger zurück — nachfolgende Teaches füllen den freigebliebenen Tag auf, statt ihn leer zu lassen

Loop Finder — Zeit-Anzeige unter Suchbereichen

  • Spielzeiten unter den Prozent-Feldern: Unter jedem der 4 Prozent-Felder (Loop-In Start/Ende, Loop-Out Start/Ende) wird jetzt die konkrete Spielzeit des geladenen Songs im Format m:ss angezeigt (z.B. 0:53). So sieht der Caller auf einen Blick, wo im Song der Suchbereich liegt
  • Anzeige aktualisiert sich live bei Eingabe der Prozentwerte und beim Ziehen der Waveform-Handles
  • Einheitliche Zeilenhöhe: Preset-ComboBox und Load/Save-Buttons nutzen jetzt dieselbe Höhe wie die Prozent-SpinBoxen

Bugfix — Abspielhistorie

  • Tracking nur bei echtem Play: Bisher wurde die „Zuletzt gespielt“-Spalte bereits beim reinen Selektieren/Laden einer Datei aktualisiert. Jetzt wird der Zeitstempel ausschließlich beim tatsächlichen Drücken von Play gesetzt. Der Song muss nicht vollständig durchlaufen
  • Der DB-Eintrag in play_history war bereits korrekt, nur die UI-Spalte lief voraus

0.51 — Notizen-Widget Verbesserungen (2026-04-15)

Notizen-Widget — Überarbeitung & neue Features

  • Export-Ordner notes/: Neuer Unterordner wird automatisch angelegt; ist Default-Ort für Laden/Speichern von JSON-Dateien
  • Hintergrundfarbe: „Erledigt“-Liste hat jetzt dieselbe Hintergrundfarbe wie „Offen“-Liste — einheitliches Erscheinungsbild
  • Export-Markierung: Auswahl-Checkbox ersetzt durch _SelectToggle (○ / ✓) — kein Qt-QSS-Problem mehr mit unsichtbarem Haken
  • Drag-Highlight: Gezogene Zeile erhält während des Verschiebens farbigen Hintergrund + linken Rand (Akzentfarbe)
  • Alle markieren / Alle abwählen: Zwei neue Buttons Alle ✓ und Alle ○ für schnelle Export-Selektion
  • Zoom-Controls: / 100% / + oben rechts — ändert nur die Schriftgröße der Listeneinträge; Icons aus dem aktiven Skin
  • Zoom-Persistenz: Zoom-Einstellung wird in INI gespeichert (notes/zoom_pct) und beim nächsten Start wiederhergestellt
  • Zeitstempel bei Erledigt: Abschluss-Zeitpunkt wird im Format [TT.MM.JJ HH:MM] hinter dem Text angezeigt
  • Import-Reihenfolge: Aus JSON geladene Notizen werden in korrekter Reihenfolge oben eingefügt
  • Done-Toggle: ☐ (offen) / ☑ (erledigt) — Stift-Experiment rückgängig gemacht

Loop Active Checkbox — Barrierefreiheit

  • Sichtbarer Haken: Alle 4 Skin-QSS-Dateien erweitert — QCheckBox::indicator:checked zeigt jetzt weißes Häkchen (check.svg) auf farbigem Hintergrund

Sequenzen-Widget

  • Zoom-Persistenz: Zoom-Einstellung wird in INI gespeichert (sequences/zoom_pct) und beim Start wiederhergestellt

Performance

  • Notizen-Dock lazy: Widget wird erst beim ersten Öffnen erstellt (wie Reports, Potential, Photo) — kein Startup-Overhead

0.50 — Frei belegbare Tasten-Trigger (2026-04-09)

Tasten-Trigger selbst erzeugen (BL-064)

  • Neuer Button „+ Taste“ im Rules-Dialog neben der Trigger-Auswahl
  • Klick öffnet Mini-Dialog: User drückt eine beliebige Taste — der Trigger-Name wird automatisch ermittelt
  • Unterstützte Tasten: A–Z, 0–9, F1–F12, Space, Return, Delete, Tab, Escape, Insert, Backspace, Home, End, PageUp, PageDown
  • Nach dem Erstellen taucht der neue Trigger sofort in der Trigger-Liste auf und kann einer Rule zugewiesen werden
  • Persistierung: Neue Trigger werden automatisch beim App-Start wiederhergestellt, sofern mindestens eine Rule damit verknüpft ist
  • Fokus-Sicherheit: Tasten-Trigger feuern nicht, wenn ein Textfeld oder eine Suche aktiv ist — diese haben immer Priorität. Gilt automatisch für alle zukünftigen Trigger.
  • Dynamischer eventFilter: Nicht mehr hardcodiert — alle registrierten key_*-Trigger werden automatisch erkannt und weitergeleitet

0.49 — Label-Erkennung (bidirektional), Lyrics-Co-Import (2026-04-08)

Label-Erkennung — bidirektionale Dateibenennung

  • Format 1 (Titel-Label): Ring Of Fire-RYL818.mp3 → Titel: „Ring Of Fire“, Label: „RYL818“
  • Format 2 (Label-Titel): RYL818-Ring Of Fire.mp3 → Titel: „Ring Of Fire“, Label: „RYL818“
  • Mit Leerzeichen im Label: YRR 043a-Dunderklumpen.mp3 oder Dunderklumpen-YRR 043a.mp3
  • Regex-Pattern: Buchstaben + optionales Leerzeichen + Ziffern + optionaler Suffix (a/b/+)
  • Unterstützte Label-Formate: BVR113, RYL818+, YRR 043a, RBS 1326

Lyrics-Co-Import

  • Beim MP3-Import wird automatisch eine gleichnamige Lyrics-Datei gesucht (ohne Extension-Suffix)
  • Quellordner (Import-Ordner): RTF/HTML/TXT-Datei wird in lyrics/-Ordner kopiert
  • Lyrics-Ordner: Bereits vorhanden → wird direkt verknüpft
  • Unterstützte Lyrik-Formate: .rtf, .htm, .html, .txt
  • Log-Ausgabe: [Import] Lyrics verknüpft: <dateiname> bei erfolgreicher Zuordnung

0.48 — SqView-Migration, Blind-Import, Theme-Fix (2026-04-08)

SqView-Migration (BL-011)

  • Ordner-Auswahl: User wählt den SqView-Ordner direkt per Explorer — sqview.db, MP3/ und text/ werden automatisch erkannt
  • Blind-Import: Songs werden auch ohne vorhandene MP3-Dateien vollständig in die DB eingetragen (Dateiname als Platzhalter). MP3s können später per normalem Datei-Import nachgeliefert werden — bestehende Einträge werden automatisch aktiviert statt als Duplikat übersprungen
  • Vollständige Song-Erkennung: Liest alle ~200 Songs aus markext1/2/3 + track-Tabelle (nicht nur die ~10 mit expliziten Einstellungen in der music-Tabelle)
  • Rekursiver MP3-Index: Durchsucht alle Unterordner (patter/, singer/, Karaoke/ etc.)
  • Lyrics-Matching: 4-stufige Regex-Strategie — exakter Titel, Label-Strip (- RBS 1234), Normalisierung (alphanumerisch), Kombination
  • Loop- und Pitch-Übernahme: Werte aus der SqView-music-Tabelle werden übernommen
  • Abspielhistorie: Aus track-Tabelle mit Datum/Zeit und Lokations-Zuordnung
  • Musik-Ordner ist optional (Blind-Import läuft auch ohne)
  • MP3-Zählung in der Statusanzeige jetzt rekursiv

Blind-Import aktivieren (Datei-Import)

  • Beim normalen MP3-Import: Existiert bereits ein DB-Eintrag zum Dateinamen, aber die Datei fehlt noch im music/-Ordner → Datei wird kopiert und der Song aktiviert (statt als Duplikat übersprungen)

Bugfix: Song Data — heller Hintergrund im Default-Theme

  • QScrollArea-Viewport und dessen Inhalt erhielten keinen dunklen Hintergrund (Qt-Stylesheet-Vererbung greift nicht durch Viewport-Grenzen)
  • Fix in allen 4 Themes (default, win11, elegant, light)

0.47 — Loop Finder Presets, CrossFade Beat Snap (2026-04-07)

Loop Finder: Parameter-Presets (BL-046)

  • Preset-ComboBox ersetzt den alten Reset-Button: zeigt alle gespeicherten Presets, „Standard“ ist nicht überschreibbar
  • Laden-Button: Wendet das gewählte Preset auf Suchbereiche, Vergleichsfenster und Strategie an
  • Speichern-Button: Immer aktiv — bei „Standard“ erscheint Eingabedialog für neuen Namen, bei User-Presets direktes Überschreiben
  • Presets als JSON-Dateien im Ordner loop_presets/ — portabel und editierbar
  • Strategie-ComboBox in der Analyse-Zeile: zeigt alle verfügbaren Auswahlstrategien (aktuell: „Bestes Vielfaches von 64 Beats“), wird mit dem Preset gespeichert und geladen; weitere Strategien jederzeit nachrüstbar
  • Rules-Aktion „Auto-Set Best Loop“ hat jetzt Parameter preset (Dropdown aller gespeicherten Presets)
  • Lädt Suchbereiche, Vergleichsfenster und Strategie vollständig aus dem gewählten Preset
  • Neuer preset_choice-Parametertyp in rule_widget.py mit preset_names_provider

CrossFade im Beat Snap (BL-067)

  • Neuer Toggle-Button CrossFade zwischen Snap und Vorhören
  • Wenn aktiv: Vorhören des Loop-Sprungs mit demselben Crossfade wie im Normalbetrieb
  • Wird bei jedem Laden und jeder Waveform-Änderung automatisch deaktiviert

Taskleisten-Icon Laptop-Fix

  • cc-logo.png wird beim Build ins App-Root kopiert (war bisher nur auf Build-Rechner vorhanden)

0.46 — Live-Volume (BL-070), UI-Gleichraster Player (2026-04-07)

Live-Volume / Mindest-Lautstärke (BL-070)

  • Neuer Live-Vol-Slider im Player (4. Spalte neben Heutiges Tempo / Song-Tempo / Pitch)
  • Artefaktfreie Lautstärkeänderung via Windows WASAPI (pycaw) — außerhalb des Audio-Streams, keine Knackser bei schnellen Bewegungen
  • Reset auf 100% bei jedem Song-Wechsel (nicht persistent)
  • INI-Einstellung audio/min_volume (Default 0.0): Slider kann nicht unter diesen Wert gesenkt werden
  • Wird beim App-Start automatisch in INI geschrieben falls fehlend
  • Graceful Degradation: ohne pycaw (kein Windows-Gerät) bleibt Funktion stumm, App läuft normal weiter

Rules-Aktion: Live-Volume ändern

  • Neue Aktion „Change Live-Volume (±)“ mit einstellbarem delta in Prozentpunkten (−100 bis +100, Default −10)
  • Respektiert automatisch die min_volume-Grenze aus der INI

UI: Player-Zeilen im gleichmäßigen 4er-Raster

  • Zeile „Heutiges Tempo / Song-Tempo / Pitch / Live-Vol“: QGridLayout mit columnStretch=1 + QSizePolicy.Ignored → exakt gleichbreite Spalten
  • Zeile „Lokation / Planner / Lyrics / Loop aktiv“: ebenfalls ins 4er-Raster überführt, bündig mit Zeile darüber
  • Labels mit setWordWrap(True) — kein Text bläht seine Spalte auf

0.45 — Genre-System, Rules Drag&Drop, Bugfixes (2026-04-06)

Bugfix: Reports und Potential Dock-Absturz beim ersten Öffnen

  • setFloating(True) im visibilityChanged-Handler loeste re-entranten Signal-Aufruf aus → Absturz
  • Fix: Signal sofort trennen + Initialisierung per QTimer.singleShot(0, ...) zurueckstellen
  • Betrifft _on_reports_visibility und _on_potential_visibility

Genre / Tags (BL-063)

  • Songs koennen mehrere Genres/Tags erhalten (Many-to-Many)
  • 65 Default-Genres aus Square Dance Labels + musicforcallers.com (Dekaden, Stile, Kuenstler, Themen, Square Dance spezifisch, NEW)
  • seed_default_genres() ist idempotent — fuegt nur fehlende Genres ein, bestehende bleiben erhalten
  • Genre-Verwaltung (Menue Datenbank → „Genres verwalten…“):
  • Liste aller Genres mit Song-Zaehler
  • Anlegen, Umbenennen, Loeschen
  • Beim Loeschen mit zugeordneten Songs: Wahlmoeglichkeit „Auf anderes Genre umbiegen“ oder „Einfach entfernen“
  • Song-Datensatz: Genre-Tags als klickbare Anzeige + „…“-Button oeffnet Checkbox-Dialog
  • Neues Genre direkt im Dialog anlegen moeglich
  • Aenderungen werden sofort gespeichert
  • Import-Keyword-Matching: Beim Import werden Genres automatisch aus dem Dateinamen vorgeschlagen (z.B. „Christmas“ aus „Xmas Song.mp3“)
  • Rules-Aktionen: „Add Genre to Song“ und „Remove Genre from Song“
  • Parameter als Dropdown aller vorhandenen Genres (kein Freitext → keine Duplikate)
  • Neuer genre_choice-Parametertyp in rule_widget.py mit genre_names_provider

Rules: Aktionen per Drag&Drop umordnen

  • Jede Aktion-Zeile hat links ein -Handle (Cursor ↕)
  • Ziehen verschiebt die Zeile live an die neue Position
  • Reihenfolge der Aktionen ist sofort gespeichert
  • Bugfix: _on_action_type_changed hatte falschen Index nach Handle-Einfuegung (combo wurde statt Params entfernt)

0.44 — Multi-Musikpfade, Import Kopieren/Belassen (2026-04-05)

Mehrere Musik-Verzeichnisse (bis zu 4)

  • Bis zu 4 Musikpfade konfigurierbar (Slot 1 = Hauptordner, Slots 2–4 optional)
  • find_song_file() sucht in Reihenfolge Slot 1 → 2 → 3 → 4, gibt ersten Treffer zurueck
  • Neuer Dialog „Musikpfade verwalten“ (Menue Pfade) mit Browse + Leeren pro Slot
  • Menuetext: „Musik-Verzeichnis aendern“ → „Musikpfade verwalten“
  • Migration: Alter INI-Key paths/music_dir wird automatisch nach paths/music_dir_1 uebertragen
  • Gut fuer Caller mit Programmdaten auf einem und Musikdateien auf einem anderen Laufwerk

Import: Kopieren oder am Ort belassen

  • Neuer Zwischendialog nach Songtyp-Auswahl: „Dateien kopieren?“ oder „Am Ort belassen“
  • Kopieren: bisheriges Verhalten — Dateien gehen ins music/-Hauptverzeichnis
  • Belassen: Dateien bleiben wo sie sind, nur DB-Eintrag wird angelegt
  • Bei Belassen: wenn Quellordner noch nicht als Musikpfad eingetragen, Nachfrage ob er als freier Slot ergaenzt werden soll
  • Wenn alle 4 Slots belegt: Hinweismeldung mit Verweis auf den Verwaltungs-Dialog

Single-Instance-Lock robuster (Race Condition bei Doppelklick)

  • Ersetzt QLocalServer/QLocalSocket durch atomaren QLockFile
  • Doppelklick auf run_test.bat oder EXE startet keine zweite Instanz mehr

Mindestbreite Player- und Loop-Dock

  • Player-Dock: min. 340px — verhindert unleshares Zusammenquetschen
  • Loop-Dock: min. 400px — alle 4 Buttons bleiben nebeneinander lesbar

Performance-Optimierung Startup (−22% auf Laptop)

  • Reports-Dock: setFloating(True) wird nicht mehr beim Start gesetzt, sondern erst beim ersten Oeffnen (lazy) → −318ms auf Laptop
  • Potential-Dock: gleiche Optimierung → −137ms auf Laptop
  • Gesamtersparnis Laptop: ~526ms (2415ms → 1889ms)
  • Hinweis fuer Kunden: Beim ersten Start nach einem Update kann die App einige Sekunden laenger brauchen — Windows Defender scannt die neuen Dateien. Ab dem zweiten Start ist alles normal.

0.43 — UI-Mindesthoehen, Song-Data-Scroll, Erststart-Sprachabfrage, Quickwin-Bundle (2026-04-04)

Neue Rule-Aktion: Song-Tempo aendern (persistent)

  • song_tempo_change ergaenzt zur bisherigen tempo_change
  • tempo_change (umbenannt zu „Change Today’s Tempo (±%)“): heutiges Tempo, nicht persistent
  • song_tempo_change („Change Song Tempo (±%, persistent)“): aendert das Song-Tempo und speichert den Wert ueber die bestehende Auto-Save-Kette am Song in der Datenbank
  • Parameter: delta als Integer-Prozent, Clamp 50-150%

Import/Migration fehlertolerant (BL-065)

  • Manueller Import: Pro-Datei-try/except — defekte/unlesbare Dateien werden uebersprungen, Session laeuft weiter
  • CC1-Migration: shutil.copy2 pro MP3 gekapselt, Fehler protokolliert, Report am Ende
  • SqView-Migration: gleiche Fehlerresilienz
  • Auch player._load_file() am Ende des Imports fehlertolerant — eine defekte letzte Datei bricht die Summary nicht mehr ab

Ordner-Import mit Unterordnern (BL-032)

  • Neuer Zwischendialog „Importquelle“: Einzelne Dateien oder Ordner (inkl. Unterordner)
  • Bei Ordner-Auswahl wird rekursiv nach .mp3/.wav/.flac/.ogg/.aiff/.aif gesucht
  • Thorstens Langzeit-Feature-Request erfuellt

Aktiver Tab besser erkennbar (BL-060)

  • QTabBar::tab:selected in allen Themes mit font-weight: bold
  • Win11: Border von 2px auf 3px, expliziter widget_bg-Hintergrund
  • Default: zusaetzliche 2px Top-Border in Selection-Farbe
  • Light: Bold ergaenzt, elegant war bereits bold

Import-Hinweis: wo die Songs landen (BL-062)

  • Nach erfolgreichem Import wird das Song-List-Dock automatisch in den Vordergrund geholt
  • Import-Zusammenfassung enthaelt neuen Hinweis: „Die neuen Songs wurden der Songliste hinzugefuegt.“

TIC-0014: Player-Mindesthoehe beim App-Resize

  • MainWindow.setMinimumSize() von (1100, 650) auf (1100, 720) erhoeht
  • Summe aus Player (350) + Loop (240) + Titelleisten + Menu + Statusbar passt jetzt in die Mindesthoehe
  • Untere Button-Zeile (Lokation, Planner, Lyrics) wird beim Verkleinern des Hauptfensters nicht mehr abgeschnitten

Erststart-Sprachabfrage (BL-058)

  • Beim allerersten Start (keine Sprache in INI) erscheint ein Dialog: „Start in English“ / „In Deutsch starten“
  • Sprache wird danach in der INI gespeichert, Dialog erscheint nur einmal

UI: Mindesthoehen gegen Quetschen (TIC-0008, TIC-0013)

  • Player-Buttons (Play, Pause, Stop, Fade Out, Lokation, Planner, Lyrics): Mindesthoehe 34px
  • Player-SpinBoxen (Tempo, Pitch): Mindesthoehe 24px mit Labels 16px
  • Player-Widget gesamt: Mindesthoehe 350px, wird nach Layout-Restore erneut erzwungen
  • Loop-Widget („New Songs“): Mindesthoehe 240px, Buttons 52px, festes Spacing 6px
  • Verhindert unleserliche UI auf kleinen Bildschirmen oder bei hoher DPI-Skalierung (z.B. 1.8x)

Song Data: ScrollArea (TIC-0012)

  • Song-Data-Widget hat jetzt eine vertikale Scrollleiste statt Quetschen bei kleinem Dock
  • Alle Felder bleiben lesbar unabhaengig von der Widget-Hoehe

Bugfix: „Titel“-Spalte nicht uebersetzt (TIC-0009)

  • Spalte „Titel“ in Playlist und Planner wird jetzt korrekt ueber das Uebersetzungssystem ausgegeben („Title“ auf Englisch)

Bugfix: Show/Hide-Buttons sind jetzt echtes Toggle (TIC-0010, TIC-0011)

  • _toggle_dock() war bisher nur Show + raise — zweiter Klick blendete nicht aus
  • Planner- und Lyrics-Button blenden das jeweilige Dock jetzt beim zweiten Klick wieder aus
  • Sonderfall hinterer Tab im Stapel: Dock wird nur nach vorne geholt, nicht versteckt
  • Sortier-Preselect im Planner laeuft nur noch beim Oeffnen, nicht beim Schliessen

0.42 — Rules-Erweiterungen, Planner-Loeschen, App-Menu & Song-Anzeige ohne Datei (2026-03-28)

Neue Rule-Aktionen

  • Go To Position (BL-044): Springt zu Start, Loop-In, Loop-Out oder Ende des Songs. Position ueber Dropdown waehlbar, nutzt Crossfade-Parameter fuer sanften Uebergang
  • Toggle Loop Active (BL-045): Schaltet die Loop-Checkbox an/aus — per Tastenkuerzel oder Regel steuerbar

Planner: Playlist komplett loeschen (BL-049)

  • Neuer roter ✖-Button ueber dem Bestaetigungs-Button im Planner
  • Loescht die gesamte Playlist nach Rueckfrage-Dialog

Song-Daten ohne Audiodatei (BL-051)

  • Song-Daten und Lyrics werden jetzt auch angezeigt, wenn keine MP3/Audio-Datei vorhanden ist
  • Dateiname-Feld wird rot hinterlegt als visueller Hinweis
  • Warnung nur noch in der Statusbar (kein blockierendes Popup mehr)
  • Ermoeglicht manuelles Verlinken einer Datei oder Einsicht in Migrationsdaten

App-Menu (BL-052)

  • Neuer erster Menueeintrag „App“ mit „Beenden“ — sauberes Schliessen ueber das Menu statt nur ueber das X

Rules-Widget

  • Neuer Parametertyp „choice“ fuer Dropdown-Auswahl in Rule-Aktionen (z.B. GoTo-Position)

0.41 — Song-Verwaltung, Foto-Widget, RTF-Bereinigung & MDB-Erweiterungstabellen (2026-03-27)

Song loeschen (BL-039)

  • Songs koennen einzeln aus der Datenbank geloescht werden
  • Sicherheitsabfrage mit Option, Historiendaten (play_history, song_location_stats) mitzuloeschen
  • Auch per Entf-Taste in der Songliste aufrufbar

Multi-File-Import mit Typ-Auswahl

  • Beim Importieren neuer Songs wird vorher der Songtyp abgefragt (Pattern / Singing / Beides)
  • Mehrere Dateien gleichzeitig auswaehlbar (Multi-File-Dialog)
  • Gewaehlter Typ wird auf alle importierten Songs angewendet

Foto-Widget (BL-041)

  • Neues Dock-Widget mit Kamera-Vorschau (QtMultimedia: QCamera + QMediaCaptureSession)
  • RAM-only: Fotos werden nur im Speicher gehalten, kein Dateisystem, keine DB
  • Lazy-Init: Kamera wird erst bei erster Sichtbarkeit des Docks initialisiert
  • QStackedWidget fuer Umschaltung zwischen Kamera-Preview und aufgenommenem Foto
  • Rules-Aktionen: photo_capture (Kamera starten + Timer) und photo_show (90% Screen)

RTF-Bereinigung (BL-043)

  • Lyrics-Import: Word-Muell aus RTF-Dateien wird automatisch entfernt (datastore, themedata, colorschememapping, xmlnstbl, latentstyles etc.)
  • Whitelist-Ansatz: Nur bekannte RTF-Gruppen (fonttbl, colortbl, stylesheet) werden behalten
  • Bei betroffenen Dateien bis zu 48% Dateigroesse eingespart

MDB-Migration: Erweiterte Tabellen (BL-047)

  • access-parser Monkey-Patches fuer erweiterte CC1-Tabellen (Off-by-One, Row-Count, Primary-Key)
  • History-Based Reconstruction: Wenn normale Song-Felder unlesbar, werden Songs aus der Historie rekonstruiert
  • Case-insensitiver Fallback fuer Tabellen- und Spaltennamen (access-parser liefert inkonsistente Gross-/Kleinschreibung)
  • Windows-Console: Unicode-sichere Log-Ausgaben (ASCII statt Sonderzeichen)

Bugfixes

  • SqView-Migration bereit fuer groessere Testdaten

0.40 — Loop-Anzahl, Performance-Optimierung & Mehrfachstart-Schutz (2026-03-26)

Loop-Anzahl / Zeitgesteuerter Loop (BL-042)

  • Neue Funktion: Caller legt gewuenschte Pattern-Dauer fest, Callers Caddy berechnet die noetige Anzahl Loops
  • Zwei Optionen (ein Loop mehr / ein Loop weniger) mit resultierender Gesamtdauer
  • Loop-Anzahl wird im Player angezeigt (Loop X/N bzw. Loop unendlich)
  • Singing Calls zeigen „1“ statt Unendlich-Zeichen in der Loops-Spalte
  • Loop-Anzahl pro Playlist-Eintrag (nicht pro Song), persistiert in Playlist-Dateien
  • Rueckwaertskompatibles Playlist-Format: Erkennt altes und neues Format automatisch
  • Doppelklick auf Loops-Spalte oeffnet Loop-Anzahl-Dialog (Playlist + Planner)

Player-Verbesserungen

  • Song-Titel in eigener Zeile (16px fett), Info-Zeile darunter mit Timer + Loop-Count + BPM
  • Loop-Marken (Loop-In / Loop-Out) werden als vertikale Linien auf dem Position-Slider angezeigt

Playlist + Planner

  • Neue Spalte „Dauer“ mit berechneter Laufzeit pro Song (beruecksichtigt Loop-Anzahl)
  • Gesamtdauer-Summe unter der Playlist — Caller kann den ganzen Abend verplanen
  • Planner: Linker und rechter Bereich per QSplitter in der Groesse verschiebbar

Performance-Optimierung (Startup −55%)

  • App-Start: 1724ms → 780ms durch Lazy-Init von Reports, Potential und Planner
  • Songliste: set_last_played_map aktualisiert nur noch Datumsspalte statt Table-Rebuild
  • Playlist-Dauer: Negative Cache + Inline-Summe (250 Songs: 367ms → 5ms)
  • Performance-Logging-System: perf_start() / perf_log() / perf_split()
  • Aktivierbar via INI-Schalter debug/performance_logging = true

Mehrfachstart-Schutz

  • Doppelter App-Start wird verhindert (QLocalServer/QLocalSocket)
  • Fehlermeldung wenn Callers Caddy bereits laeuft
  • Wait-Cursor (Sanduhr) waehrend des App-Starts

Uebersetzungen

  • Neue Schluessel: header_duration, playlist_total, loop_count_per_loop, loop_count_before, loop_count_after, already_running

0.39 — SqView-Migration, Song-Volume & Verbesserungen (2026-03-26)

SqView-Migration (Beta)

  • Neuer Migrations-Pfad: SqView → Callers Caddy 2.0
  • Liest sqview.db: Songs (Tempo, Pitch, Volume, Loops), Abspielhistorie, Lyrics-Zuordnungen
  • Auto-Detect: Musik- und Lyrics-Ordner werden aus SqView-INI erkannt
  • Ausfuehrliches Log pro Song: MP3-Status, Lyrics, Loop-Punkte, Pitch, Volume
  • Nacharbeit-Bericht am Ende: fehlende MP3s und Lyrics aufgelistet
  • Beta-Warnung: „Noch im Test-Stadium. Benutzung auf eigene Gefahr!“
  • Dateiname-Parsing: „Title-Label.mp3“ wird automatisch in Titel + Label zerlegt

Song-Volume

  • Volume-Feld in Song-Daten wird jetzt auf die Audio-Engine angewandt (multiplikativ)
  • Smooth-Rampe bei Volume-Aenderung (~50ms), kein Knistern oder Knacksen
  • Debounced DB-Save: nur Volume-Spalte, kein Lyrics-Reload bei Aenderung
  • Range begrenzt auf 0.0–1.0 (0%–100%)

Rules-Aktionen

  • Neue Aktion: „Change Pitch“ (±Halbtoene, konfigurierbare Schrittweite)
  • Neue Aktion: „Change Volume“ (±Faktor, konfigurierbare Schrittweite)

Tutorial-Menu

  • Neuer Menuepunkt „Alle Tutorials beenden“ (Gegenstueck zu „Alle zuruecksetzen“)
  • Beendet laufendes Tutorial und markiert alle als abgeschlossen

Potential-Widget

  • FlowLayout fuer Check-Buttons: Buttons haben volle Textbreite, umbrechen automatisch bei schmalem Dock
  • Doppelklick auf „Leere Lokation“ oeffnet Lokation-Dialog mit der betroffenen Lokation vorselektiert

Bugfix

  • Tasten P und L funktionieren jetzt in Songliste/Playlist fuer Type-to-Search
    (wurden vorher vom app-weiten EventFilter geschluckt, auch bei deaktivierten Regeln)
  • Tempo/Pitch-Aenderung verursacht kein Audio-Knistern mehr (Debounced Save ohne Lyrics-Reload)

0.38 — Lyrics-Redesign, Tutorials & Bugfixes (2026-03-25)

Lyrics-Widget: As-Is-Rendering (Architektur-Vereinfachung)

  • Lyrics werden jetzt 1:1 original dargestellt — wie im Browser oder Word
  • Weisser Hintergrund, unabhaengig vom gewaehlten Theme
  • Alle Farben (Textfarbe, Hintergrundfarbe, Highlights) bleiben original erhalten
  • Sanitizer radikal vereinfacht: nur noch CSS-Link-Aufloesung + font-size-Entfernung
  • Externe CSS-Dateien (z.B. cuesheet2.css) werden automatisch inlined
  • RTF-Konverter: Unterstuetzung fuer \highlight (Hintergrundfarben)
  • RTF-Konverter: Korrekte Behandlung von *\background und weiteren Header-Gruppen
  • Neuer Button „Auto-Breite“: Skaliert Schrift so, dass Text in die Fensterbreite passt
  • Auto-Breite auch als Rules-Aktion verfuegbar („Lyrics Auto-Width“)

Tutorials

  • Neues Tutorial: Loop Finder (6 Schritte: Wellenform, Suchbereich, Suchfenster, Analyse, Ergebnisse, Uebernehmen)
  • Neues Tutorial: Rules (7 Schritte: Regelliste, Neue Regel, Name/Aktiv/Once, Trigger, Bedingungen, Aktionen, Import/Export)

Song-Restart

  • Play-Button bei laufendem Song = Neustart von vorne (seek 0)
  • Kein Stop+Start mehr noetig, auch per F5-Rule nutzbar

Bugfixes

  • HTML-Lyrics mit externem CSS werden jetzt korrekt dargestellt (TIC-0001)
  • RTF-Lyrics mit Farben und Highlights werden originalgetreu angezeigt (TIC-0002)
  • App-Icon in Titelleiste und Windows-Taskleiste (TIC-0004)
  • CP1252-Encoding-Fallback beim Laden von Playlists (utf-8 Fehler)

Ticket-System

  • Neues Ticket-System unter 5_Tickets/ fuer Fehlermeldungen und Fragen
  • TICKETS.md als Uebersicht, ein Ordner pro Ticket mit Anhaengen

0.37 — Regel-Engine & Automatisierung (2026-03-24)

Regel-Engine (neues System)

  • Komplett neues Automatisierungssystem: Trigger → Bedingungen → Aktionen
  • 26 Trigger: App-Lifecycle (Start, Song gestartet/pausiert/gestoppt/resumed/gewechselt), periodischer Timer, Tastatur (F1–F12, Space, L, P), Manager geschlossen
  • 9 Bedingungen: Songtyp (Singing/Patter), Lyrics vorhanden/nicht, Loop gesetzt/nicht, Location gewaehlt/nicht, Spielzeit ueber Schwellwert
  • 25 Aktionen: 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
  • Bedingungslogik: Flexible UND/ODER-Gruppen (z.B. „Singing UND Lyrics vorhanden ODER Patter UND Loop gesetzt“)
  • „Einmal pro Song“-Option: Regel feuert maximal einmal pro Song

Regel-Editor (neues Widget)

  • Dockbares Editor-Widget mit zweigeteiltem Layout (Regelliste links, Editor rechts)
  • Suchfeld zum Filtern nach Name oder Trigger
  • Sortierbare Tabelle: Aktiv-Checkbox, Name, Trigger, Quelle (System/User)
  • Dynamische Parameter-Eingabefelder je nach Aktions-/Bedingungstyp
  • Buttons: Hinzufuegen, Duplizieren, Loeschen, Hoch/Runter, Export, Import

System- vs. User-Regeln

  • 13 vorinstallierte System-Regeln (nur Aktiv-Toggle aenderbar, nicht editierbar):
  • Singing Call → Lyrics Vollbild mit Auto-Scroll (Start + Resume)
  • Singing Call Stop/Pause → Default Layout zurueck
  • Song Stop → Auto-Advance
  • Manager geschlossen → Playlist fokussieren
  • Tastatur-Shortcuts: F5=Play, F6=Pause, F7=Stop, F8=Fade-Out, Space=Play/Pause, L=Location, P=Manager
  • User-Regeln: Voll editierbar, Import/Export als JSON, frei sortierbar

Regel-Logging

  • Eigene Log-Datei rules/rules.log mit Kategorien: TRIGGER, MATCH, NO_MATCH, ACTION, ERROR, BLOCKED
  • Automatische Rotation bei 1 MB (behält 500 Zeilen)
  • Hilft bei Diagnose, warum Regeln feuern oder nicht

Auto-Loop-Finder (Regel-Aktion)

  • Neue Aktion auto_set_best_loop: Analysiert den Song automatisch und setzt den besten 64-Beat-Loop
  • Bevorzugt 64-Beat-Loops, Fallback auf hoechsten Score
  • „Bitte warten“-Overlay waehrend der Analyse (halbtransparent, verschwindet automatisch)
  • Kann per Regel z.B. bei Song-Start automatisch ausgeloest werden

Performance-Optimierung

  • Lazy Waveform: Loop-Finder-Waveform wird erst bei Sichtbarkeit geladen (spart ~100-400ms beim Songwechsel)
  • Gezieltes Song-Update: Nach Abspielen wird nur die Last-Played-Spalte aktualisiert statt die gesamte Songliste neu aufgebaut (~4-22ms statt ~400-1200ms)

Loop-Widget: Neues Button-Layout

  • Alle 4 Buttons (Set In, Clear, Set Out, Test Loop) in einer flachen Zeile
  • Buttons schrumpfen bei Platzmangel mit automatischem Textumbruch
  • Player-Spalte laesst sich jetzt deutlich schmaler ziehen

Dock-Widget-Verbesserungen

  • Features-Persistenz: Dock-Faehigkeiten (Verschieben/Andocken/Schliessen) bleiben nach Layout-Wiederherstellung erhalten (Qt-Bug behoben)
  • Kleinere Fenstergroessen: Docks lassen sich jetzt auch andocken, wenn die App nicht im Vollbild laeuft (minimumSize-Fix)

Bugfixes

  • Loop-Guard: Snapshot-Werte von 0.0 werden korrekt als ungueltig erkannt — verhindert Ueberschreiben guter Loop-Werte beim Schliessen
  • Audition/Beat Snap: Abspielen im Loop Finder und Beat Snap wird nicht mehr in der Play-Historie geloggt
  • Loop Finder schliessen: Stoppt laufende Wiedergabe automatisch
  • Resume-Regel: Funktioniert wieder zuverlaessig nach Layout-Wechsel (Focus-Restore nach restoreState)

0.36 — Loop Finder & UI-Reorganisation (2026-03-21)

Loop Finder (neues Widget)

  • Neues dockbares Fenster „Loop Finder“ — sucht automatisch passende Loop-Punkte
  • Aehnlichkeitsbasierte Analyse: Vergleicht Phrasen im vorderen und hinteren Songbereich
  • 8-Beat-Nummerierung: Alle Beats werden 1-8 durchgezaehlt, Spruenge nur zwischen gleichen Beat-Positionen
  • Downbeat-Erkennung: Bevorzugt Kandidaten auf geschaetztem Beat 1 (Kick-Energie-Heuristik)
  • Chroma-basierter Harmonie-Score (FFT → 12 Halbtoene, rein mit scipy/numpy)
  • Einstellbares Vergleichsfenster: 4, 8, 16, 32 oder 64 Beats per ComboBox
  • Einstellbare Suchbereiche: 4 Prozentfelder (Default 7%/21%/64%/79%) mit Reset-Button
  • Waveform-Uebersicht mit farbigen Suchbereichen (gruen = Loop-In, orange = Loop-Out)
  • 4 verschiebbare Handles (beide Seiten pro Region per Maus anpassbar)
  • 7 Singing-Call-Segmente ueber der Waveform (Opener, 1-4, Middle Break, Closer)
  • Weisse gestrichelte Marken zeigen den selektierten Vorschlag in der Waveform
  • Sortierbare Ergebnistabelle: Klick auf Spaltenueberschrift sortiert nach Score, Beat, Zeit
  • Audition-Funktion: Startet 5 Sekunden vor Loop-Out, springt, stoppt 2 Sekunden nach Loop-In
  • Apply-Button: Uebernimmt den Vorschlag als Loop-In/Loop-Out in den Player
  • Analyse laeuft in QThread (nicht blockierend)
  • Keine neuen Abhaengigkeiten — alles mit scipy + numpy

UI-Reorganisation (Loop-Widget)

  • Loop Active → Player: Checkbox aus dem Loop-Widget in die Player-Toolbar verschoben (rechts neben Lyrics)
  • 3-Spalten-Layout: Loop-In-Zeit und Loop-Out-Zeit stehen zentriert ueber ihren Buttons
  • Button-Reihe: Set Loop-In | Set Loop-Out | Test Loop nebeneinander
  • Neue Button-Reihe: Loop Finder | Beat Snap nebeneinander
  • Fixe Zeilenhoehe im 3-Spalten-Grid (dehnt sich nicht bei groesserem Widget)

Loop Finder Dock

  • Eigenes Dock-Widget, darf nicht mit anderen Widgets andocken (Qt.NoDockWidgetArea)
  • Oeffnet sich ueber den neuen „Loop Finder“-Button im Loop-Widget

0.35 — Guided Tutorials & Verbesserter Loop-Guard (2026-03-20)

Tutorial-System (13 Tutorials)

  • Neues geführtes Tutorial-System mit Tooltip-Overlays und Highlight-Rahmen
  • 11 Widget-Tutorials: Player, Layout, Songliste, Song-Daten, Planner, Playlist, Loop, Lyrics, Sequenzen, Reports, Potential
  • 2 Dialog-Tutorials: Lokationen, Beat Snap
  • Prioritaetsbasierte Reihenfolge: Player → Lokationen → Layout → Songliste → … → Potential
  • Automatisches Chaining: Nach Abschluss eines Tutorials wird das naechste angeboten
  • Tutorial-Angebot ablehnbar: „Nicht jetzt“ pausiert Tutorials fuer die Sitzung
  • Schritt-Navigation: Weiter, Zurueck, Ueberspringen + Schritt-Anzeige (z.B. „3 / 5“)
  • Enter = Weiter, Escape = Ueberspringen

Tutorial-Menu

  • Neues Untermenu „Tutorials“ mit allen Tutorials in Prioritaetsreihenfolge
  • Haekchen (✓) vor bereits abgeschlossenen Tutorials
  • „Alle Tutorials zuruecksetzen“ setzt den Fortschritt komplett zurueck
  • Menu-Auswahl hat Vorrang ueber automatisches „naechstes Tutorial“
  • Einzelne Tutorials koennen jederzeit ueber das Menu neu gestartet werden

Tutorial-Architektur

  • Drei-Komponenten-System: Transparentes Overlay (Klick-Faenger) + Highlight-Rahmen + Tooltip-Popup
  • Highlight und Tooltip als eigenstaendige Tool-Fenster (liegen ueber QDockWidgets)
  • Multi-Element-Highlighting: Mehrere Elemente gleichzeitig rahmen (z.B. BPM-Feld + Auto-Button)
  • Dialog-Tutorials: Eigene leichtgewichtige Engine fuer modale Dialoge (LocationDialog, BeatSnapDialog)
  • Spezial-Pfade: _menu_bar, _dock_XXX_title fuer Menu und Dock-Titelleisten
  • Floating-Dock-Management: Lose Docks werden waehrend Tutorials versteckt und danach wiederhergestellt
  • Tooltip-Box mit eigenem paintEvent (opaker Hintergrund trotz transparentem Overlay)
  • Dedizierte Skin-Farben: tutorial_box_bg, tutorial_box_text, tutorial_highlight in allen 4 Themes

Beat Snap: „Adjust“ → „Snap“

  • Button-Beschriftung von „Adjust“ zu „Snap“ umbenannt (inklusive Tooltip und Status-Text)

Verbesserter Loop-Guard (Datenbank)

  • Erweiterter Schutz gegen versehentliches Ueberschreiben von Loop-Werten
  • Neuer Guard 2: Erkennt das Engine-Reset-Muster (loop_in=0 + loop_out=Songdauer) und schuetzt gespeicherte Werte
  • Bisheriger Guard schuetzte nur gegen 0.0, nicht gegen die Songdauer als loop_out

Win11 Theme

  • Zoom-SVG-Icons: Strichfarbe von dunkel (#1b1b1b) auf weiss (#ffffff) geaendert (bessere Sichtbarkeit auf blauem Hintergrund)

0.34 — Keyboard-Shortcuts & Elegant Gold Theme (2026-03-19)

Keyboard-Shortcuts (App-weit)

  • L-Taste: Oeffnet Lokations-Auswahl-Dialog (mit Fokus auf Lokationsliste)
  • P-Taste: Oeffnet/schliesst Planner (mit Fokus auf Pool-Tabelle)
  • App-weiter EventFilter statt QShortcut (funktioniert auch bei fokussierten Tabellen/Listen)
  • Modale Dialoge blockieren Shortcuts automatisch
  • Textfelder/SpinBoxen werden erkannt und nicht abgefangen
  • Planner-Sortierung wird automatisch vorausgewaehlt (Empfehlung bei Lokation, Qualitaet sonst)

Elegant Gold Theme

  • Neues Theme „Elegant Gold“: Anthrazit-Basis mit strahlendem Gold (#d4a017)
  • Goldene Titelleisten, Buttons, aktive Tabs, Header-Trennlinien und Tooltips
  • Deaktivierte Elemente in mittlerem Goldton (#7a6a2e)
  • Eingabefelder und Listenbereiche mit leichtem Goldfarbton (#2e2a1f)
  • SVG-Icons: Pfeile und Dock-Buttons schwarz (#000000), Lupen/Zahnrad dunkelbraun (#2a2518)
  • Section-Bar-Segmente (Singing Call 1/2/3/5) in mittlerem Goldton

Fokus-Management

  • Startup-Fokus auf Songliste (verhindert Shortcut-Blockade durch SpinBox)
  • Floating-Dock-Aktivierung: activateWindow() vor setFocus() fuer Keyboard-Input
  • Lokations-Dialog: Fokus auf Liste bei vorhandenen Eintraegen, auf Hinzufuegen-Button bei leerer Liste

Tooltip-Verbesserungen

  • Lokations- und Planner-Buttons zeigen Shortcut-Hinweis im Tooltip (L) / (P)

0.33 — Potential-Widget & Menu-Umbau (2026-03-18)

Potential-Widget (Datenqualitaet)

  • Neues dockbares Fenster „Potential“ — zeigt Optimierungspotential in der Songdatenbank
  • 5 Checks mit Badge-Counter auf den Buttons:
  • Singing Calls ohne Lyrics
  • Pattern ohne Loop-Marken
  • Loops ohne BeatSnap-Optimierung
  • Lokationen ohne Abspielhistorie
  • Verwaiste Historieneintraege (geloeschte Lokationen)
  • Doppelklick navigiert zum betroffenen Objekt (Song-Daten, Beat Snap, Lokation)
  • „Ignorieren“-Button: Einzelne Eintraege als bewusst akzeptiert markieren
  • „Alle bereinigen“: Verwaiste History-Eintraege per Batch loeschen
  • Lazy Loading: Daten werden erst beim Einblenden geladen
  • DB: Neue Tabelle potential_ignored (check_type + entity_id)

Lokation loeschen

  • Loesch-Funktion funktioniert jetzt korrekt (vorher durch Foreign Key blockiert)
  • Checkbox „Historiendaten ebenfalls loeschen“ im Bestaetigungsdialog
  • Ohne Checkbox: Historie bleibt als verwaiste Eintraege erhalten (im Potential sichtbar)
  • Mit Checkbox: Historie und Stats werden komplett geloescht

Menu-Umbau

  • „Design“ umbenannt zu „Einstellungen“ / „Settings“
  • Datumsformat-Einstellung von Ansicht nach Einstellungen verschoben
  • Sprach-Einstellung von Info nach Einstellungen verschoben
  • „Skin“ umbenannt zu „Theme“ (Menue, Dialoge)
  • Datumsformat-Label: „DE“ geaendert zu „EU“ (europaweit gueltig)

Default-Layout (3-spaltig)

  • Neues 3-Spalten-Layout als Standard bei Erstinstallation und Layout-Reset
  • Spalte 1: Player oben, Loop/Neu unten
  • Spalte 2: Songliste und Playlist als Tabs (Songliste aktiv)
  • Spalte 3: Lyrics, Song-Daten und Sequenzen als Tabs (Lyrics aktiv)
  • Planner, Reports, Potential versteckt (ueber Menu oeffenbar)

Technisch

  • Layout-Version 3 (neues Dock erfordert Layout-Reset)
  • Dock-Aufbau-Reihenfolge: Zuerst 3 Spalten horizontal, dann Spalte 1 vertikal teilen
    (verhindert dass Player ueber volle Breite spannt)

0.32 — Keyboard, Datei-Auswahl & Loop-Verbesserungen (2026-03-18)

Keyboard & Datei-Auswahl

  • ENTER-Taste: Song in Songliste laden, Song im Planner-Pool zur Playlist hinzufuegen, Song in Playlist entfernen
  • F-Tasten (F5-F8, Space) funktionieren jetzt auch bei abgedockten Fenstern (ApplicationShortcut)
  • Datei-Auswahl-Button („…“) in Song-Daten: Audio-Datei nachtraeglich aendern
  • Bei bereits vergebener Datei: Kopie-Dialog mit automatischer Kopie-Erstellung
  • Erweiterte Audio-Format-Unterstuetzung: WAV, FLAC, OGG, AIFF neben MP3
  • Audio-Format-Filter auch im Import-Dialog erweitert
  • Neue DB-Methode update_filename() mit UNIQUE-Constraint-Pruefung

Loop-Crossfade

  • Nahtloser Loop-Uebergang durch Crossfade statt hartem Schnitt
  • Crossfade-Dauer konfigurierbar via INI loop/crossfade_ms (Default 46ms)
  • Eliminiert WSOLA-Einschwing-Artefakte am Loop-Punkt (kein flush/warmup noetig)
  • Budget-basierter Loop-Mechanismus: Callback zaehlt Output-Samples, kein Stretcher-Zugriff aus UI-Thread
  • Fallback-Sicherung: Feed-Level Loop-Back falls UI-Timer den Seek verpasst

Loop-Offset (pro Song)

  • Automatische Offset-Messung via FFT-basierter Kreuzkorrelation (Tiefpass <200Hz)
  • Findet optimalen Versatz zwischen Loop-Ende und Loop-Anfang im Bass-Bereich
  • Suchbereich ±2 Sekunden, waehlt den kleinsten Offset mit guter Korrelation (>= 0.1)
  • Offset wird pro Song in der DB gespeichert (loop_offset_ms)
  • Manuelle Feinkorrektur ueber SpinBox in Song-Daten (±3000ms, 0.5ms Schritte)
  • Auto-Messung bei Beat Snap und Loop-Test, Ergebnis in DB + SpinBox
  • DB-Migration: Neue Spalte loop_offset_ms wird automatisch angelegt

Bugfixes

  • Playposition-Anzeige (Uhrzeit + Slider) klemmt nicht mehr bei Pattern-Start mit Loop
  • Loop-Marken werden beim Dateiwechsel nicht mehr auf 0 zurueckgesetzt

0.31 — Beat Snap Audition (2026-03-16)

  • Beat Snap Dialog: Vorhoeren des Loop-Sprungs mit Waveform-Visualisierung
  • Doppelte Waveform-Anzeige (Loop-Out oben, Loop-In unten) mit Cursor-Synchronisation
  • Playback-Sample-Counter (_playback_sample) in Audio-Engine fuer praezise Positionsbestimmung
  • Engine-Loop wird waehrend Audition deaktiviert (verhindert Doppel-Sprung durch Feed-Ahead)
  • Layout-Versionierung: _LAYOUT_VERSION verhindert korrupte Dock-States bei Aenderungen
  • Versioned saveState()/restoreState() — alter State wird automatisch verworfen
  • Bugfix: Dock-Widgets liessen sich nicht mehr einrasten nach P30→P31 Dock-Aenderung

0.30 — BPM-Detection, Reports, Lyrics-Kontrast (2026-03-14)

  • Auto-BPM-Erkennung via Comb-Filter-Bank (scipy/numpy, keine neuen Pakete)
  • Sub-Harmonik-Korrektur: Integer-Vielfache pruefen, hoehere Tempi bevorzugen
  • BPM-Detection laeuft in QThread (nicht blockierend)
  • Reports-Widget: Setlist/Musikfolgeliste fuer GEMA mit TXT-Export
  • Bidirektionale ComboBox-Filterung (Lokation ↔ Datum)
  • Lyrics-Kontrast: WCAG-basierte Farberkennung fuer Word-HTML (bgcolor, background, color)
  • Sanitizer entfernt Block-Hintergruende, behaelt Inline-Highlights, ersetzt schlechte Textfarben
  • Default-Stylesheet wird bei jedem Skin-Wechsel und setHtml() aktualisiert

0.29 — Release-Vorbereitung (2026-03-12)

  • Internationalisierung: i18n-Modul mit JSON-Translations (Deutsch/Englisch)
  • 5-Stufen-Ordnerstruktur: 1_Source, 2_Test, 3_Build, 4_Release, _archive
  • Build-Pipeline: PyInstaller-Spec + build.py (Vollpaket, Update, Source-ZIP)
  • Clean-DB-Skript: Entfernt User-Daten, behaelt Referenzdaten (Sequenzen, Teaching Order)
  • Migration-EXE: Separater Access-Import-Prozess
  • Portable Pfade: App-Verzeichnis neben EXE statt Prototypen-Ordner

0.28 — Sequenzen-Fenster + Design-Menu + Audio-Fix (2026-03-11)

  • Neues dockbares Fenster „Sequenzen“ (Dock 9, getabbt mit Lyrics)
  • Import von 885 Singing-Call-Sequenzen aus Access-MDB (caller.mdb)
  • Cached Live-Mapping gegen Burleson-Vocabulary (Teaching Order)
  • Contains-Filter: Autocomplete-Suche nach enthaltenen Calls
  • Limit-Filter: Nur Sequenzen bis zu einem bestimmten Programm-Level
  • Lazy Loading (50er-Bloecke) fuer schnelles Scrollen
  • Detail-Dialog mit allen Calls und Programm-Tags
  • Remapping-Button (Zahnrad) fuer Teaching-Order-Neuberechnung
  • Zoom [-/+] mit Prozentanzeige (wie Lyrics-Widget)
  • Neues Modul: sequence_mapper.py (Burleson-Mapping-Logik)
  • DB-Erweiterung: sequences + sequence_calls Tabellen mit Indizes
  • Design-Menu: Layout laden/speichern/wiederherstellen + Skin-Wechsel zur Laufzeit
  • Benannte Layouts: Caller koennen „Live.ini“, „Workshop.ini“ etc. speichern
  • Playlist-Manager umbenannt zu „Planner“ (kuerzer, ueberall umbenannt)
  • Caller-Workflow-Guidance: Lokation → Planner-Button rot → Planner bestaetigt → Playlist fokus
  • Audio-Fix: Persistenter Stream (kein Knacken/Brummen bei Song-Start)
  • WSOLA-Warmup: 200ms Einschwingphase wird als Stille ausgegeben

0.27 — Performance-Optimierung (2026-03-11)

  • Performance-Messframework mit Phase A (Baseline) und Phase B (Stresstest mit 10k Songs)
  • Testmethodik: 10 Wiederholungen, Statistik (Mean/StdDev/Min/Max), CSV-Export
  • Pool-Tabelle im Playlist-Manager: 40% schneller durch optimiertes Tabellen-Pattern
  • Songliste: 7% schneller durch gleiche Optimierung
  • Erkenntnis: QTableWidget-Rebuild ist der Flaschenhals, nicht DB oder Sortierung
  • Optimiertes Pattern: setRowCount(0) + setRowCount(n) + setItem() statt insertRow()

0.26 — Lyrics-Anzeige (2026-03)

  • Lyrics-Widget als dockbares Fenster (getabbt mit Song-Daten)
  • Unterstuetzte Formate: HTML/HTM, RTF, TXT
  • Auto-Fit: Schriftgroesse wird automatisch angepasst wenn Text auf eine Seite passt
  • Auto-Scroll: Proportional zum Song-Fortschritt
  • Smarte Farb-Bereinigung: Hintergruende entfernt, Sektionsfarben beibehalten
  • Toolbar mit Auto-Scroll/Auto-Size Toggle und Zoom +/-
  • Light Blue Skin: Zweites Farbschema (helle Oberflaeche, blaue Akzente)
  • Muted- und Indicator-Farben fuer besseren Kontrast in beiden Skins
  • Loop-Save-Bugfix: Snapshot-Mechanismus sichert Loop-Werte vor Song-Wechsel
  • Gemeinsame Datenordner (music/, lyrics/, playlists/) sparen Plattenplatz

0.21 — Playlist und Playlist-Manager (2026-03)

  • PlaylistWidget: Schlank, getabbt neben Songliste, Laden/Speichern als .txt
  • PlaylistManagerWidget: Zwei-Panel-Ansicht mit Song-Pool und Playlist-Spiegel
  • Song-Transfer: Doppelklick, Pfeil-Buttons, Drag & Drop
  • 4 Sortierungen: Alphabetisch, Qualitaet, Zuletzt gespielt, Empfehlung
  • Filter: Alle / nur Pattern / nur Singing
  • Auto-Advance: Naechster Song bei Song-Ende, Stop oder Fade-Out
  • Fade-Out: Konfigurierbarer linearer Volume-Ramp (Default 3s)
  • Empfehlungssystem integriert (urspr. P25)
  • Playlist-Builder integriert (urspr. P24)

0.20 — Abspielhistorie (2026-03)

  • Drei-Schichten-Architektur: play_history, song_location_stats, On-the-Fly-Berechnung
  • „Zuletzt gespielt“-Spalte in der Songliste
  • Lokations-bezogene Statistik (wann wurde welcher Song wo gespielt)
  • Umbenennung: „Club“ wird zu „Lokation“ (generalisiert fuer Club + Special)
  • INI-Setting fuer Datumsformat (deutsch/amerikanisch)

0.19 — Lokationen (2026-03)

  • Club- und Special-Verwaltung als auswaehlbare Kontexte
  • Lokationsauswahl beeinflusst Songempfehlung und Historie

0.18 — Pattern/Singing-Modus (2026-03)

  • Songs als Pattern, Singing oder beides markierbar
  • Typ-Kuerzel (P/S/PS) in Songliste und Pool-Anzeige
  • Filter im Playlist-Manager nach Modus

0.17 — Heutiges Tempo (2026-03)

  • Gespeichertes Tempo pro Song fuer den heutigen Abend
  • Tempo wird beim Laden eines Songs automatisch wiederhergestellt

0.16 — Songliste mit Suche (2026-03)

  • Songliste als QTableWidget mit Echtzeit-Suchfilter
  • Suche ueber Titel, Label und Dateiname

0.15 — Portable Pfade (2026-03)

  • Relative Pfade fuer Songs und Daten
  • Anwendung kann auf USB-Stick oder zwischen Rechnern verschoben werden

0.14 — Auto-Save (2026-03)

  • Automatisches Speichern aller Aenderungen (Song-Daten, Einstellungen)

0.13 — Song-Datenmodell (2026-03)

  • SQLite-Datenbank fuer Songs, Lokationen, Historie
  • Song-Felder: Titel, Dateiname, Label, Qualitaet, Pattern/Singing, Tempo

0.07 — Dock-Fenstersystem (2026-03)

  • QDockWidget-basiertes Fenstersystem mit freier Anordnung
  • Fenster verschieben, andocken, stapeln, Groesse aendern
  • Layout wird gespeichert und beim Neustart wiederhergestellt
  • Resize-Regeln pro Fenstertyp
  • Integriert: P8 (Ein-/Ausblenden), P9 (Verschieben), P10 (Resize-Regeln), P11 (Docking), P12 (Layout-Persistenz)

0.06 — Loop mit Tempoanpassung (2026-03)

  • Loop-Region bleibt bei Tempowechsel stabil
  • Eigener Streaming-WSOLA-Algorithmus (kein Rubber Band/SoundTouch)

0.05 — Loop-In / Loop-Out (2026-03)

  • Markierbare Loop-Region mit Start- und Endpunkt
  • Nahtloser Loop waehrend der Wiedergabe

0.04 — Tempo und Pitch gleichzeitig (2026-03)

  • Unabhaengige gleichzeitige Tempo- und Pitch-Steuerung

0.03 — Pitch-Steuerung (2026-03)

  • Tonhoehe stufenlos aendern, unabhaengig vom Tempo

0.02 — Tempo-Steuerung (2026-03)

  • Wiedergabegeschwindigkeit stufenlos aendern

0.01 — MP3-Wiedergabe (2026-03)

  • MP3-Dateien laden und stabil abspielen
  • Grundlegende Transportsteuerung (Play, Pause, Stop)
  • Positionsanzeige und Seek-Slider