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_dialognutzt jetztfind_song_file()statt nur Slot 1 - TIC-0018 Rule-Aktion „Load Layout“: Dropdown zeigt jetzt alle gespeicherten Layouts aus dem
skins/-Ordner —layout_names_providerangebunden, 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 kopiert1_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
LoopFinderWidgetwird 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
setFloatingundrestoreGeometrydes Dock-Fensters ebenfalls perQTimer.singleShotnachshow()verschoben
Mapping Export/Import (Sequenzen-Menü)
- Mapping exportieren…: Speichert alle
call_text_mappingsals 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.pyausgelagert — 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.SequenceMatcherals 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 inmain.pydurchCallMatcher-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:
ResizeToContentsbei Type-Spalte ließ die Sequenz-Spalte schrumpfen wenn viele Zeilen denselben langen Typ hatten
Performance-Logging
- Neue Messpunkte:
SequencesWidgetundSequenceViewWidgetgetrennt gemessen - Neuer Messpunkt:
_build_menu(war bisher insong_list.refreshversteckt) - Neuer Messpunkt:
_init_sequencesintern 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
typeunddifficultyin dersequences-Tabelle (Migration idempotent) insert_sequence()nimmt jetztseq_typeunddifficultyentgegen- 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.pymit 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_viewist 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_viewverfügbar (z.B.dual_viewmitdock_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_*(stattsequenzview_*) - 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 Tabellenauswahlsequenzview_close: versteckt das Detail-Docksequenzview_prev/sequenzview_next: blättert per Rule/Tastenkürzel zur vorherigen/nächsten Sequenzsequenzview_focus: bringt das Detail-Dock in den Vordergrundsequenzview_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:67oder67:33direkt 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_rightundsplitals 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 undcellDoubleClicked-Signal umgeht
0.54 — Tanzprogramm-System & Lokations-Erweiterungen (2026-04-22)
Tanzprogramm-Anzeige im Player (BL-083)
- Neuer Button
btn_programin 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_idundtemp_tempoin derlocations-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 | 13zwischen 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_eveningswird 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+Enterbestätigt - Zoom-Buttons +/− weiterhin aktiv — die neue Rendering-Logik respektiert die Zoom-Stufe
- Neue DB-Methode
update_note_text(note_id, text)insong_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
_ValueButtonRowfür exklusive Wert-Auswahl (wiederverwendbar für weitere diskrete Auswahlen) - Helper
_insert_after_selected()in Col2 — zentralisiert Einfüge-Logik - Neue QLabel-Subklasse
_TightLabelmit eigenempaintEvent+ 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:ssangezeigt (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_historywar 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 ✓undAlle ○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:checkedzeigt 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.mp3oderDunderklumpen-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/undtext/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 dermusic-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 mitpreset_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.pngwird 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(Default0.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
deltain 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“:
QGridLayoutmitcolumnStretch=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)imvisibilityChanged-Handler loeste re-entranten Signal-Aufruf aus → Absturz- Fix: Signal sofort trennen + Initialisierung per
QTimer.singleShot(0, ...)zurueckstellen - Betrifft
_on_reports_visibilityund_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 mitgenre_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_changedhatte 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_dirwird automatisch nachpaths/music_dir_1uebertragen - 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_changeergaenzt zur bisherigentempo_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:
deltaals 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.copy2pro 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:selectedin allen Themes mitfont-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.logmit 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_titlefuer 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_highlightin 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()vorsetFocus()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_mswird 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_VERSIONverhindert 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()stattinsertRow()
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