Versioning: 0.XX = Prototype phase (XX = prototype number).
From the official launch, it will switch to 2.0 .
Versions 1.xx will remain available for the old version

0.160 — Reading bar in the lyrics, assignment import with conflict resolution & song catalog (2026-10-01)
Improvements
- New reading bar in the lyric window: The text that is currently being sung is highlighted in color. Anyone who briefly looks away from the screen can immediately find the spot again. The bar follows the sung text, even if „timing text jump“ scrolls earlier, and then moves a bit upwards. A section counts from the first line after the heading (OPENER, FIGURE …) to the end of its last line, even if the SyncPoints are on the heading. It works with and without SyncPoints; in SyncPoint and editing mode, it is off. New in the settings (Lyrics): „Reading position“ determines at what height in the window the sung text appears (0 % = top, 100 % = bottom, default 30 %: you can still see a bit of what was just sung and more of the text that is coming). Also, „Show reading bar“ (default on), „Reading bar height“ (default 20 %) and „Reading bar opacity“ (30 %); the color comes from the theme. Previously, the current text with SyncPoints was centered in the window and without SyncPoints proportionally to the song length.
- Text jump and text swap of the lyrics can be timed. Two new settings in the Lyrics group, each in whole seconds from −10 to +10: „Timing text jump“ shifts when the auto-scroll reaches the line of a SyncPoint, and „Timing text swap“ shifts the sequence change and the heads/sides swap in Dynamic Lyrics. The default is −4: The next text appears four seconds earlier, allowing time to prepare instead of being surprised by the swap in the middle of calling. The SyncPoints themselves remain unchanged, and in SyncPoint mode, the text continues to scroll exactly at the saved time. If you want the previous behavior, set both values to 0.
- When importing assignments (menu „Import Assignments“), differing assignments are no longer silently skipped. Previously, the import only took Call texts that were not yet assigned locally; everything else was omitted without notice. Now a dialog shows every Call text that is assigned differently locally than in the file, and you can choose for each line: A keep locally, B take from the file, or C choose the figures yourself. A recommendation is pre-selected (more figures first, then the more reliable source: manually derived before automatically). Four buttons set all lines at once: left side, right side, closer to the quantity suggestion, closer to manual; self-chosen lines (C) remain unchanged. Figures that do not exist here are skipped and mentioned at the end. The export now writes a new format with multiple figures and figure names; older export files can still be imported. Attention: Callers Caddy 0.159 and older cannot import files in the new format – anyone exchanging assignments with other callers should update beforehand.
- Dynamic Lyrics can swap heads and sides in selected figures. A new mirror button directly behind „Dynamic Lyrics“ swaps heads and sides in the displayed sequences, allowing a Singing Call to be danced as HHSS (Figure 3 and 4), HSSH (Figure 2 and 3), or HSHS (Figure 2 and 4). All common notations (Heads/Sides, Head/Side, HDS/SDS, „(H)“/„(S)“) along with couple numbers (1→2→3→4→1); „each side“, „first couple“ or formations like „3 & 1 Lines“ remain unchanged, and sequences with adjacent pairs or „Your Couple Number“ are not touched at all. On the first click, the button leads to the settings (Lyrics), where the type is chosen; saving the first type immediately activates the swap, afterwards the button toggles on and off, synchronized with the switch in the settings. The lyric file remains unchanged. Additionally, Dynamic Lyrics now retains the current font size when changing the sequence, swapping, and turning off; previously, the text would revert to the size at the time of activation and often became significantly smaller.
- Freshly imported sequences can now be easily found again. If their Call texts have no assignment yet, the dance program selection or the limit hides them – previously without notice. New in the right-click menu of the sequence list (even if the list is empty): „Show hidden sequences as well“. It lifts Contains, Limit, and Only filters, suspends the dance program selection only for this list (the status bar indicates this; the next filter or program change will lift it again) and jumps to the end, where the newest sequences are. Type, difficulty, and Tags remain unchanged. Sequences with Call texts without assignments are marked in red; by right-clicking „Open Call Mapping for this sequence“, the Call Mapping opens filtered for exactly these Call texts. You can go back by right-clicking „Hide unassigned sequences“: The red sequences disappear again, and the dance program selection applies as at the start. A newly created sequence in the sequence editor with Call texts without assignments shows the list in the same way after saving.
- New button „Optimize“ in Call Mapping takes the quantity suggestions all at once. It takes exactly the lines that the filter „Suggestion deviates“ shows and asks beforehand – separated into three groups with their own count and checkmark: Reassign Call texts without assignment, complete incomplete assignments with missing figures, and change assignments whose suggestion deviates differently. Only the checked groups will be written, canceling changes nothing. The adopted assignments appear in the „Source“ column as „derived“ and can thus be distinguished from manually set ones; the bands of the sequences are recalculated immediately.
- The pattern recognition for composite Call texts now also works in the sequence editor. Previously, it only suggested in Call Mapping; when typing a sequence, the double click would check exactly one figure – and only if the text had no assignment at all. Now the selection dialog checks all recognized figures for texts like „Heads Touch 1/4 & Roll“, even if an incomplete assignment already exists (the existing checks remain). Lines where the recognition still suggests missing figures are marked yellow instead of green – a double click is worth it there. Adoption still only happens with „OK“; canceling changes nothing.
- When saving in the sequence editor, Callers Caddy asks whether open suggestions should be adopted. If there are still yellow lines left when saving, the question „N Call texts have suggestions with still missing figures – adopt now?“ comes up once. Below, it states for each Call text which figures are added (e.g. „Heads Touch 1/4 & Roll → + (Anything) & Roll“) – important because an assignment applies to all sequences with this text. For more than ten Call texts, the question shows the first ten, the complete list is under „Details“. If „Yes“ is selected, these Call texts receive their previous figures plus the suggested ones, marked as „derived“ – the sequence is thus classified correctly. If „No“ is selected, it is saved without them. The sequence is saved in both cases. Without a yellow line, there is no question; at startup, during import, and via the gear, nothing is assigned without asking.
- The „Source“ column in Call Mapping is now translated: „auto“, „manual“ and „derived“ instead of the English values.
- Double-clicking on a jump marker starts playback directly at that point. A single click still just jumps; if the music is already playing, the double-click will only jump. From a stop or pause, it starts like the play button – so that the exact marker point is heard first (the short ramp-up time at the start is deducted beforehand). The tooltip indicates this.
- „Fill“ in the To-Call window now suggests the highest selected dance program. If Mainstream (2026) and Plus (2026) are selected, the dialog is directly set to Plus (2026) – the same program that the program button in the player shows. Previously, it was the first in the selection, which was usually the lowest.
- The included song catalog (about 9,100 Square Dance songs) now helps everywhere in recognizing title, label, and number. When importing a music file, Callers Caddy looks up label and number from the filename in the catalog. If the entry matches, the song gets the clean spelling (from „AintSheSweet-ESP717“ to „Aint She Sweet“, label „ESP 717“) and empty fields like caller, original artist, year of release, and genre are filled in as well. Additions like „(Vocal)“ remain in the title. „Metadata from CSV“ in the potential window uses the catalog directly, and a separate CSV file can still be chosen. In the cue sheet search on ceder.net and in the grab bag, the app searches for songs without a label additionally with the label from the catalog if the title is unambiguous there. Additionally, the matching now recognizes concatenated titles („RhythmOfTheRain“), bracket additions („(Vocal)“) and apostrophe variants („Cant“/„Can’t“) as the same title. The catalog is regularly updated and comes with each release.
- Rules can now respond to the break clock. The new triggers „Break Started“ and „Break Finished“ fire when the break clock starts fresh (via button, rule action, or with waiting music) or when the countdown reaches 0. Continuing after stopping and resetting do not count. The new condition „Break Type“ distinguishes whether the break was started with or without waiting music. This allows you to build, for example: break over → play the prepared next song („Break Finished“ → „Play“). If waiting music is still playing during the countdown, it will be stopped beforehand.
- Pilot Square: Names and colors can now be deleted separately. At the bottom left, there are now three equally wide buttons: „Delete Names“, „Delete Colors“ and „Delete All“ (previously „Clear“, behavior unchanged). This way, the names remain if only the colors for the next tip are to be redistributed. A security prompt only appears if there is something to delete.
- Each window can now be docked. The magnet in the view menu and „Move freely“ in the right-click menu of the title bar work for all windows. Previously, some (e.g., evening planner, rules, break clock) were fixed on „free“; this is now only the default setting as long as you haven't chosen anything yourself. Additionally, the windows in the view menu are now sorted alphabetically.
Bug fixes
- Sequences with unknown calls no longer appear in the normal sequence list. Previously, the dance program selection only checked the calls of a sequence that were already assigned to a figure; call texts without assignment were skipped. This meant that a sequence containing an unknown Plus call could appear during a Mainstream selection and surprise someone at the club night. Now, sequences with at least one call text without assignment are always hidden, even without selected dance programs. This also applies to rules and shortcodes that take sequences from the current list. They become visible via „Show hidden sequences as well“ (marked in red); there, they can be assigned directly in the call mapping via right-click. Note: In collections with many imported sequences, the list becomes significantly shorter until the missing call texts are assigned.
- „Time text jump“ and „Time text swap“ are really preset to -4 seconds after an update. The settings dialog showed -4 as long as the value was not saved, but 0 was used.
- Headings in lyrics are no longer displayed oversized when first opened. With auto width or auto size and dynamic lyrics enabled, the text shrank when opening a lyric file for the first time, while headings without their own font size (like „OPENER“) appeared huge. On the second opening, it was correct again. Now the text has the right size right from the first opening.
- Lyrics from Word look like they do in Word. Display and edit mode now show lyrics from Word just like Word and any browser: Headings like „OPENER“ have the font and color from the file and are the same size as the text instead of huge and black, and there are no paragraph spaces that aren't in the file. The edit mode always shows the file in original size (100 %), so that text, headings, and spaces match; zoom and auto width are locked there. Upon exit, the set zoom applies again.
- Two settings now end up in the
callers_caddy.ini. The last selected folder during sequence import and the read zone for SyncPoints (lyric_sync/viewport_frac) were previously located elsewhere (under Windows in the registry). A value for the read zone in the INI had no effect, and the import folder did not carry over with the INI. The import dialog now starts once again in the user folder. - No crash log anymore if the app is closed shortly after starting. If someone closed Callers Caddy in the first seconds after starting (or a bit later with a slow network), it could trigger a hard crash upon exit: The update check was still running in the background. The next time it started, the message „Error log available“ appeared. No data was lost in the process. Now the check simply ends with the program.
- If someone manually starts a song during the break, it ends the break. Previously, the break timer just kept running; if waiting music was playing, its end even stopped the new song and reloaded the song from before the break, causing the caller's selection to be lost. Now, a manual play is the clear signal that it continues: The break timer is reset, the waiting music is considered finished, the song continues, lands normally in the history, and the rules apply again. The trigger „Break Finished“ does not fire intentionally, because the break was interrupted and not elapsed. Previewing (Audition, Loop-Finder) does not end the break. Without intervention, everything remains the same.
- Type and difficulty filters of the sequence list remain after call mapping. After „OK“ in call mapping, after an import, or after deleting a sequence, the type previously reset to „Singer“ and the difficulty to „All“. If someone had sent a red sequence under „Two Couples“ to call mapping via right-click, they wouldn't find it marked again afterward. Now the selection is retained, just like with the tags.
- ZIP import recognizes multiple songs in a package and asks whether they should be imported separately. If a manufacturer packed two Patter titles along with extended versions into a ZIP, everything ended up as a single song; if one of the files was already present, the entire package was skipped and the second title never arrived. Now the import recognizes any number of different songs per ZIP (including compilation bundles from a label), asks before the preview „Import separately“ or „As one song per ZIP“ and allows toggling the choice in the preview per ZIP. Songs without matching lyrics are preset as Patter instead of Singing Call, „extended“ in the filename is recognized as track „Extended“. If the main track already exists, the preview indicates this and offers to attach the new tracks to the existing song; the completion message now names skipped files.
- The end of the waiting music no longer advances the playlist. When the waiting music of the break timer ended („Play Last Song“), the app interpreted that as the end of the song: The next playlist song was marked as played and the one after that was loaded. Now the playlist stays where it was.
- „Play Last Song“ in the break timer really plays the last played song. Without a selected location, the already preloaded next playlist song previously played as waiting music. Now the app remembers which song actually played last. After the break, the song that was previously selected is loaded again.
- Rule sounds („Play Sound“) can now be heard even without music playing. Previously, the sound was only mixed into a running song. During the break or after stopping, it remained silent and then suddenly played at the start of the next song. Now it comes immediately, even right after the app starts, before any song has been played.
- Metadata import is now checking if the values are landing with the correct song. When filling via AI (Potential → Fill Metadata), values like original artist and release year could end up with the wrong song unnoticed, because the return file only contained the song number. The provided AI task now additionally requires the title; if it doesn't match the song, the line is marked in red in the preview and not checked. For older files without a title, the preview indicates that.
- CSV matching now only assigns based on label and number if both match. Previously, just having the same number with a different label or the same label with a different number was enough – then details from a foreign recording would be assigned to the song.
- The sequence filter now reacts without stuttering when switching programs, limits, or „Only“. Since 0.159, the hit count after a filter change often took around 140 ms, and when switching programs during ongoing music, the interface would stutter briefly (the music itself continued playing). Now, a switch only takes a few milliseconds; the first new filter after starting or after a change in assignments takes a bit longer. The found sequences are the same as before.
- The time display in the player no longer runs about one second ahead of the music. The displayed position (time, slider, lyrics scroll, start countdown) was about 1 s ahead of what was audible. After jumping to a jump marker, it looked like the playback was landing too late – in reality, it was just right. More importantly: „Set Loop-In“ and „Set Loop-Out“ during playback now land exactly where you hear them, instead of about a second later. Already saved loop points remain unchanged. Additionally, the tooltip of a jump marker now clearly shows the time („Refrain · 00:29.54“ or just „00:29.54“) instead of „00:29 — 00:29.54“, which looked like a time span. Note on lyrics sync points: Manually set sync points and manually set song start/end were saved with the old, leading time. The lyrics scroll there now about one second later than usual – if necessary, reset the sync points once. Automatically recognized sync points, on the other hand, are now more accurate than before.
- In the To-Call window, the tiles no longer overlap for many calls. If the window was too small for all calls, the open tiles would overlap the completed ones or get cut off at the bottom. Now, the completed calls are by default collapsed as a bar „36 completed ▸“ under the open ones, making the still open calls stand out. A click on the bar expands and collapses it, and when expanded, the view jumps to the completed calls; after „Filling“, it is collapsed again. If there isn't enough space for all open calls, the window gets a scrollbar. With very little height, the window could also completely stop rearranging – that has been fixed as well.
- Floating windows now reopen exactly where they last were after closing. If you use the To-Call window floating and almost full screen, you found it slightly offset when reopening (via the view menu, „Filling“ or the
[to_call]-shortcode) before. Now, each floating tool window remembers its position during the session, and even after a restart, Loop Finder, Lyrics, To Call & Co. open without offset at the last position – even if the title bar is at the very top of the screen. Windows that are intentionally centered or opened to full screen/custom size via rules still land there. The previously saved positions are taken over by the first start after the update, even for tool windows that are currently docked; upon exiting, they are converted to the new format, and after that, the conversion is complete. - In the settings dialog, „Insert New Notes“ and „Automatic Width“ now appear in the chosen language. In English and Japanese, the notes had labels, selection (Top/Middle/Bottom), and tooltips previously in German, and for the lyrics, instead of a label, the internal name „auto_width“ appeared with a text field. The automatic width is now a normal checkbox.
- Playlist folders, sequence import folders, and „Randomly sort ties“ now have a translated label, a tooltip, and the appropriate control (folder selection or checkbox) instead of the internal name with a text field.
- The note about logged errors at startup no longer sounds like a crash and only appears for new logs. Previously, the app reported something like „crashed 9 times at the last startup,“ even though nothing was noticeable: Errors were counted that allowed the app to continue running normally, including all logs ever saved – hence the message appeared at every startup with an increasingly larger number. Now it says „Error log available“ and only counts logs that have been added since the last message (on the first startup after the update, it still shows all existing ones once). The logs remain saved and can still be displayed or opened in the folder.
- After the song ends, the player jumps back to the beginning. If a song played all the way through or was faded out, the position previously stayed at the end – a click on Play would then only play a fraction of a second and stop immediately. Now the song end behaves like Stop: The position jumps to the beginning, but the song does not start by itself, only with Play. If automatic switching to the next song in the playlist is active, the next song is loaded as before.
- Saved pitch and tempo also apply when the same song is reloaded. If a song was reloaded (or the previous song had the same pitch or tempo), the sliders showed the saved values, but it played with 0 semitones and 100 %. Now the player receives the values with every load.
Technical note
- The sequence import is internally cleaned up (invisible for operation). Reading the formats MDB, JSON, CSDS, and free text is now collected in one place and is secured by automated tests. The old individual import paths, which were no longer accessible in the menu since the universal sequence import, have been removed. Nothing changes in the import itself.
0.159 — Playlist multiple selection, call texts with multiple figures & freely movable windows (2026-09-24)
Improvements
- A call text can now be assigned to multiple figures. Many lines in sequences contain two or more figures, e.g. „Swing Thru & Roll“. Until now, such a text only referred to one figure – the limit filter only checked that one, and the sequence appeared in a program where „(Anything) & Roll“ hadn't even been taught yet. Now, you can check as many figures as you want per call text in the call mapping, and the limit filter is based on the highest one. The figure column shows all assigned figures (highest first, with „+n“ for multiple). Double-clicking or pressing F2 opens a new selection dialog with a search field and checkboxes; „Split at comma“ is available as a button there. Existing assignments remain unchanged.
- The call mapping automatically suggests all included figures for composite call texts. Texts like „Heads Touch 1/4 & Spread“ or „All 8 Swing Thru“ are recognized and broken down into their figures; unassigned lines with such a suggestion are highlighted in yellow, and the selection dialog pre-checks the suggested figures. A suggestion is only adopted with „Confirm“ or „Save“. A new filter „Suggestion deviates“ also shows already assigned call texts whose saved figures differ from the suggestion – this allows for targeted revision of incomplete or incorrect old assignments. If part of a text is ambiguous, there is deliberately no suggestion instead of a guessed one.
- In the figure selection dialog, checked figures move up. As soon as you check a figure, it moves into its own block at the top; unchecking moves it back to its original position. This way, you can always see the current selection at a glance, even in long lists.
- All provided designs now display active tabs and switches much more legibly. In the „default“ design, the active tab is filled in the accent color, in „elegant“ the active and inactive tabs clearly stand out from each other, and in „winter-is-coming“ inactive tabs and switches are lighter and thus easily readable. The font on active switches in all designs follows the design instead of always being white.
- In the playlist, you can now select multiple songs at once and move or delete them together. With Ctrl or Shift-click (or by dragging), you select a block; the arrow keys ▲/▼ move the entire selection up or down (even non-contiguous lines, the relative order remains intact), ✕ or the Delete key remove all selected songs at once, and by dragging, you can place the block in a new location. A selection click no longer accidentally loads every tapped song as audio. This applies equally to the playlist in the planner.
- The button „+Note“ now transfers all selected songs in the correct order. Without selection, it still asks whether the entire playlist should be adopted; if the playlist is empty, there is now a brief notice instead of a silent cancellation.
- Switching between Pattern (P) and Singing (S) in the playlist retains the current selection. Previously, clicking on the P/S column reset the selection.
- A new switch „Top“/„Middle“/„Bottom“ directly next to the input field for notes determines where new entries land. „Middle“ adds above the top separator line, i.e., at the end of the top section (e.g., of the current tips or day); if there is no separator line, the note lands at the very bottom. After switching, the cursor is directly in the input field, so you can start typing immediately. This applies to both manually typed notes and songs taken from the playlist or evening planner. The switch only affects the current session; the default value at program start can be permanently set via the settings.
- After transferring songs to the notes, no confirmation message appears anymore. The new entries are immediately visible – an additional dialog that had to be dismissed was unnecessary.
- Each window (widget) can now optionally be docked or moved freely like a normal window. So far, the windows were always aligned to the dock grid. Now, a right-click on the title bar of a docked window with „Move freely“ disables docking – the window then floats freely and no longer snaps in. Additionally, in the view menu, each window line on the right has a magnet symbol that toggles between „docked“ and „free“; this is also how you can bring a floating window back into the grid. The color of the magnet indicates the state: docked in the accent color of the design, free subtly grayed out. Windows that are intentionally always free (e.g., evening planner, rules, break clock) remain unchanged. The selected state is remembered per window and survives a restart.
Bug fixes
- The spacebar now reliably stops and starts the music, no matter where the cursor is. When a song is playing or paused, the spacebar also works even if a search or note field is focused or a dialog is open – whoever is at the computer first in an emergency can always stop the music. Only those who are currently typing (last key press in the field less than 3 seconds ago) will get their space as usual in the field. If no song is started, everything remains as before. Additionally, the lyrics window no longer blocks keyboard shortcuts, and holding down the spacebar, letter, or F key only triggers its action once instead of in the rhythm of key repeat (volume keys still repeat).
- Songs from subfolders no longer get a duplicate entry, and existing duplicates are automatically merged. If a song was „kept in place“ during import in a subfolder of the music folder, loading from the song list previously created a second entry (with Patter + Singing). Changes to type, loop, BPM, lyrics, or genres then landed on this duplicate, and the song appeared twice in the list. Now the song is always recognized correctly when loading. On the first start after the update, the app returns existing duplicates to their original: the changes made on the duplicate, the play history, and the genres are retained, and saved playlists are switched to the correct title. Before that, the app creates a backup of the database (filename ends with
.bak_pre_intern106_…), changed playlists are backed up as.bak_intern106. - When transferring multiple songs to the notes, the order is now correct – even from the evening planner. Previously, notes from the evening planner always came out in reverse order; both paths (playlist and evening planner) now create the entries from top to bottom in the expected order. Taking over an entire list is also noticeably faster because the order is only saved once at the end instead of after each individual song.
- The limit filter in the sequences now correctly classifies sequences again. If a call belongs to multiple dance programs (e.g., „Dosado“ in Basic and Mainstream 2026), previously a randomly selected – almost always the highest – program was counted. This meant that even a pure Basic sequence of Dosado and Promenade was considered a Mainstream-2026 sequence and disappeared from the filter „up to Basic“. Now, the lowest program in which the call is taught is always counted – the same rule that applies to program selection and the figure dialog. On the first start after the update, the app recalculates the classification of all sequences once (about one-fifth of a second for 11,000 sequences).
- In call mapping, the „Count“ column is correct again. A call text whose figure belongs to multiple dance programs was counted once per program – so the frequency was doubled (or tripled) and the sorting by frequency was correspondingly shifted.
- In call mapping, the F2 key now opens the figure selection dialog regardless of the previously clicked column. If you first clicked in the call text column and then pressed F2, the key press had no effect (only double-clicking on the figure cell worked). F2 now works in every column of the row.
- In the figure selection dialog, each figure now appears only once. Since the program restructuring, a call that belongs to multiple dance programs (e.g., „Recycle“ in Mainstream and Mainstream 2026) appeared multiple times in the selection list – once for each program and with the attached program name. The program is irrelevant for the assignment; the list now shows each figure exactly once, without program addition. This applied both in call mapping and when double-clicking in the sequence editor. Additionally, the sequence display now shows the program abbreviation of a figure consistently (always the lowest program) instead of changing.
- The preview during metadata import now states the number of affected songs. Instead of the number, it previously literally said „{count} songs with changes found.“.
- Your own or older designs no longer look broken after an update. If a new version came with an additional color setting (like the focus frame, for example), it was missing in custom or older designs – which could sometimes cause display issues. The app now automatically takes missing settings from the default design; everything specified in your own design still takes precedence.
0.158 — Focus Frame, Medley Auto-Sync & Window Positions (2026-09-14)
Improvements
- Higher dance programs now automatically include the underlying ones. Previously, if you only selected a higher program (e.g. „Plus 2026„), without the underlying one („Mainstream 2026„), the sequence list remained empty – there simply is no sequence without the lower calls. Now, a click on the desired program is enough: The lower programs of the same series are automatically selected (e.g. „Plus 2026„ → also "Mainstream 2026"; "A2" and higher access the 2026 programs). The old programs (Basic, Mainstream, Plus, A1 without "2026") continue to use their own series including the basics. Unneeded options can be deselected at any time.
- Key commands with letters now work reliably – even when a list, table, or the lyrics window is in focus. Previously, a letter (e.g. „S“) in such windows was used for their own quick search instead of triggering the assigned rule. Now, an occupied letter triggers the rule; only real text input fields (e.g. notes or search fields) still take priority. The recognition is also case-insensitive – „S“ works like „s“. Unoccupied keys still function for quick search in lists/tables.
- In text fields, it's now clearly visible where the cursor is – and Escape immediately switches back to key mode. Previously, it was often unclear that the focus was still in an input field, and you accidentally typed a key command into the field. Now, a colored frame that matches the respective design surrounds the active field. Pressing Escape releases the focus, so occupied letter keys immediately work as commands again.
- For medley songs with four separate „FIGURE“ sections, the automatic section recognition now recognizes each figure individually. Previously, the first figure block took all four figure rounds – in a medley with different figures, the second (and further) text was never displayed. Now, with exactly four figure sections, each is assigned its own round (1st, 2nd, 3rd, 4th figure in order). In the case of one or two blocks, the previous behavior remains (the first covers all); differing cases can still be adjusted manually.
- Windows (widgets) can now be opened either centered or at their last used position. Previously, the window buttons (e.g. „Lyrics“) always opened a loose window centered above the main window – a previously chosen position was lost in the process. The rule action „Open widget“ now has the switch „Open position“ with the values „centered“ (default, as before) and „last“ (the last used position is remembered and restored). The on-screen button of a window automatically takes on the setting of a suitable „Open widget“ rule; without such a rule, the button still opens centered.
Bug fixes
- Sync marks on the last lines of long songs are displayed again. For songs with many sync points (e.g. figures danced multiple times), the time marks on the back text lines were missing, even though they were set (right-click still showed them). They are now correctly displayed on all lines.
- Newly created key rules respond immediately – without a restart. If you assigned a previously unused key to a rule (e.g. „S“), it only triggered after restarting the app. The trigger is now activated directly upon saving.
0.157 — New Window „Pilot Square“ & automatic window lists in rules (2026-09-12)
New
- New Window „Pilot Square“ — Notes on the eight dancers in the square. By selecting „View → Pilot Square“, a dockable field opens that spatially arranges the eight dancers as a square (Couple 1 at the bottom, Couple 2 on the right, Couple 3 at the top, Couple 4 on the left – with each man and woman in their actual position). You can freely enter something in each field: name, level, or notes like „needs eye contact“. The font automatically adjusts to the text length and optimally fills the field; the text is always centered and easily readable. Using the color palette in the middle, you can assign a color to each field – first click the field, then choose a color (the first field removes the color again); the text color automatically adjusts for contrast. „Clear“ resets all fields, „Close“ hides the window. The notes apply to the current session.
Improvements
- The rule actions „Open/Close Dock“ and the Stream Deck assignments now automatically list all windows. Previously, the selection was a fixed list that missed newer windows. Now all dockable windows appear automatically – including „Pilot Square“ as well as notes, evening planner, tags, and „To Call“. Existing rules remain valid unchanged.
Bug fixes
- Individual letters are no longer intercepted as key commands when typing in multi-line text fields. If you had set a letter (e.g. „L“) as a rule trigger, you couldn't type it in some text fields – it would instead trigger the rule. Now text inputs in such fields take precedence.
- The checkmarks in the view menu now match the visible windows again after startup. A visible window saved in the layout (e.g. the Loop Finder) was displayed correctly at startup, but without a checkmark in the view menu – which seemed contradictory. The checkmarks are now adjusted to actual visibility after restoring the layout.
0.156 — Crash fixes (2026-09-11)
Bug fixes
- Fixed crash when operating selection lists. In certain situations (including when expanding/clicking selection fields), the app could crash completely due to an internal type error. The app-wide key/mouse filter now catches such unexpected cases instead of terminating.
- Fixed crash during audio diagnosis. A rare collision between the audio thread and the diagnosis display could terminate the app. The diagnosis now works on a copy and allows the audio thread to run uninterrupted.
0.155 — Exporting song data as JSON & importing carefully (2026-09-11)
Improvements
- Exporting song data as JSON and re-importing it. In the song list, there is now „Export...“: it writes the database data of all songs in the currently filtered list to a JSON file. First, you select the fields — the list includes everything from song info and the extended data and automatically grows with future fields. The title is always included as a mapping key; critical fields (filename, paths, recording date) and extended data fields are unchecked by default — if you want them, just check them. The same export is also available in the tab „Potential → Data Export/Import“, covering all songs.
- Careful import under „Potential → Data Import“. When re-importing such a JSON: it only updates existing songs (never creates new ones), mapping by song name. A preview shows each change „old → new“ individually for checking — nothing is silently overwritten. Not found or duplicate (ambiguous) songs are listed by name and skipped.
- Renaming during re-import on the same installation. If you edit a JSON exported here and re-import it on the same device, you can also change the song name — the play history remains intact. For foreign files (caller exchange), the name of the mapping key remains.
0.154 — New rule condition „Song Length“, broader selection lists & freely scalable Rules window (2026-09-10)
Improvements
- New rule condition „Song Length“ — responds to the total length of the loaded song. In the rules, you can now check if a song is longer or is shorter than a set time (input as
mm:ss, e.g.3:00). This way, you can automatically set a loop for short Patter titles before the song starts, but leave longer ones untouched. You select the condition via a dropdown „above/below“; if no song is currently loaded, it is considered unmet. - Selection lists (comboboxes) now open as wide as their longest entry. On narrow laptop resolutions, the layout squeezed the selection fields together, causing longer entries to be cut off and unreadable when expanded. The dropdown list now always opens as wide as necessary (up to the screen edge) — the actual field remains space-saving. This applies automatically to all selection fields in the program.
Bug fixes
- The floating Rules window can no longer be resized smaller than its content. Previously, you could resize the Rules window so small that fields were cut off and a horizontal scrollbar appeared. The sensible minimum size (700 × 400) is now restored, ensuring that the content remains fully visible.
0.153 — Auto-Scroll starts reliably & font size is retained when saving (2026-09-09)
Bug fixes
- The Auto-Scroll now runs automatically when starting a song. Previously, the lyric text would initially stop after playing, even though Auto-Scroll was active — it would only start when you adjusted the zoom or briefly turned Auto-Scroll off and on again. Now the text scrolls correctly from the very first moment. (Very short texts that fit completely in the window still do not scroll as before.)
- When editing and saving lyrics, the font size is no longer accidentally changed. If you resized the lyric window in edit mode (which causes the display to automatically adjust the font), and then saved, you would end up with permanently smaller letters in the file. The pure display adjustment no longer ends up in the saved file; the sizes set consciously per word are retained.
0.152 — Live volume is retained, uniform green active switches & smoother evening planner (2026-09-09)
Improvements
- The live volume now remains stable when changing songs. Until now, the live control would reset to 100 % with each new song, requiring you to readjust it while building the playlist. Now it retains the set value for the entire session. If you want a fixed level per song, you can set it using the new rule action „Set Live-Volume“ (e.g., with the trigger „Song Changed“) — the default remains 100 %.
- Active toggle buttons are now consistently green. Switches that indicate an ongoing function — Auto-Scroll, Auto-Size, Auto-Width, and Dynamic Lyrics in the lyric window, Random (🎲) in the sequence view, and Shuffle in the evening planner — light up green when active, just like the sync switch. Same meaning, same color, easily recognizable at a glance. The color comes from the respective design theme.
- The evening planner opens without a brief empty window. It is now prepared shortly after the program starts in the background, so that when opened for the first time, the finished content appears immediately instead of a momentary empty window.
Bug fixes
- The „Shuffle“ option in the song list can now always be toggled. Previously, it was grayed out in certain sortings (e.g., alphabetical or purely random), which was confusing. Now it is always usable; it still only takes effect where a random balance is meaningful in case of a tie (recommendation, quality, insertion date), and remains intentionally ineffective in other sortings.
0.151 — Dynamic Lyrics protects the song text at the end of figures (with movable cut mark) & search field in the location dialog (2026-09-08)
Improvements
- When automatically replacing the figure text with the current sequence (Dynamic Lyrics), the attached song text at the end of the figure is now preserved. In many cue sheets, a figure block does not end with the last dance call, but with one or two lines of pure song text that play while the dancers promenade home. Previously, these lines were also overwritten by the sequence calls; now the replacement ends at the last home promenade line, and the closing song remains visibly in place. The timing remains unchanged — the display continues to rest in its place during the closing song. The recognition has been tested on all real lyrics and correctly identifies the right place in about 96 % of the figure blocks.
- New movable cut mark in the section strip (sync mode). A wide separator in the figure bar now shows where the dance calls end and the song text begins. The mark is set automatically; if it is not positioned correctly, it can be easily moved up or down by dragging. The position is saved per song and directly controls how far Dynamic Lyrics are replaced.
- The location dialog now has a search field with a clear button. This allows entries to be quickly filtered; a click on the X clears the search again.
0.150 — Text can now be manually scrolled during playback (2026-09-08)
Bug fixes
- The lyric text can now also be manually scrolled during playback. Previously, the auto-scroll would immediately pull the display back to the current song position with each measure — making it impossible to reach another line of text to set a sync point there. Now, as soon as you scroll manually (mouse wheel or scrollbar), the auto-scroll pauses for a few seconds and then resumes on its own. If you want to browse freely for longer, you can still completely turn off the auto-scroll using the button in the toolbar.
0.149 — Significantly faster program start, reliable playback during background analyses & organized beat snap list (2026-09-07)
Performance
- Significantly faster program start. The BPM analysis library (with its extensive computational foundation) was previously fully loaded at program startup — even though it is practically never needed right after the start. It is now loaded only when a BPM measurement actually starts (button in the song info or via rule action). The pure module loading phase at startup is reduced from ~1.8 s to ~0.6 s (around −1.2 s); the first BPM process afterwards takes a fraction of a second longer, which is not noticeable in live operation.
- The window appears noticeably earlier. At startup, the program previously had to calculate which sequences fit the current dance program (a run through tens of thousands of figure entries) — this blocked the appearance of the window by ~0.3 s. This result is now permanently cached and only recalculated when something actually changes in the calls, bands, mappings, or sequences; additionally, the sequence list loads only after the window is visible. The time until the visible window is further reduced by ~0.4 s.
Bug fixes
- Music can now be played immediately even when a collective analysis is running in the background. (e.g., determining BPM, beat snap, „enhancing“). Previously, such a background task could briefly lock the database; a click on Play would then abort with an error message instead of starting the song. Now playback takes priority: The song starts in any case, and the recording of the playback history is silently skipped if the database is occupied. Additionally, analyses wait for each other during brief locks instead of skipping individual songs.
- Songs whose loop cannot be sensibly aligned with the beat no longer reappear endlessly in the beat snap area. If the automatic beat snap optimization could not determine an offset — for example, because the file is not a normal audio format, the signal is too unclear, or the loop is already exactly on the beat — the song remained in the list and was suggested again with each run. Such songs now receive the genre label „CHECK: BEATSNAP“ and are excluded from the suggestion list; they can be specifically searched for in the song list using this genre and checked manually if needed. If you manually snap one of them, the label is automatically removed again.
- Non-playable files (e.g., MIDI) no longer generate confusing error messages. If such a file was in a list (e.g., during automatic switching), a long technical error block appeared in the log. Now the format is quietly noted as „not playable“ and skipped; for real, unexpected loading errors (e.g., a corrupted MP3), the clear warning remains.
Technical note
- Major internal restructuring of the code structure (invisible for operation, foundation for the future). The central program file, which has grown to ~29,000 lines over the years, has been divided into ten thematic modules (Player, Song Data/List, Playlist, Sequences, Song Pool, Loop Finder, Pause/Photo, Reports, Dialogs, Lyrics) — thus shrinking the central file to ~7,300 lines. This makes future changes safer and debugging faster, but does not change the program's behavior. Additionally, unused code and unnecessary references have been removed. All areas were checked after the restructuring.
0.148 — Faster termination when accidentally starting a second instance, „Load Song“ adjusts the song list filter & inactive rules disappear from the Stream Deck (2026-09-05)
Performance & Start
- If you accidentally start Callers Caddy a second time (typical double-click because the start takes a bit), the second instance now terminates significantly faster. Previously, the second start loaded almost the entire program — including the heavy audio/analysis components — before it reported „already running“; during this time, it actually slowed down the first visible start. The multiple start lock now takes effect right at the beginning: The second instance recognizes in fractions of a second that the program is already running, shows the notice, and terminates itself without hindering the first one. The proven detection of orphaned locks after a crash remains fully intact.
Improvements
- The rule action „Load Song“ now automatically switches the song list filter to the selected song type. If you set „Patter“ in the action while the song list was still filtered to „Singing“, the suggested song was correctly loaded into the player, but not marked in the list — the filter hid it, which was confusing. Now the action sets the list filter accordingly (Singing → Singing, Patter → Patter), so the loaded song is visible and selected. If the filter is already correct, nothing happens (no unnecessary rebuilding of the list).
Bug fixes
- The „Active“ switch of a rule now again affects the Stream Deck. Finally, the Stream Deck button of a rule remained present and triggerable even when the rule was deactivated — only the automatic trigger adhered to the switch. Now the switch applies consistently: When a rule is deactivated, its button immediately disappears from the Stream Deck, and an (accidental) call of an inactive rule no longer performs any actions. When reactivating, the button immediately reappears — without a restart.
Technical note
- Extended start timing (only with active performance log,
debug/performance_logging=true): The perf log now also captures the previously invisible phases before of the program window — bootloader/Python start and the import phase — as well as the total time from process start to visible window. This is the basis for further start optimization; no impact for end users.
0.147 — More robust sequence import, clearer Evening Planner design & floating windows remember size and position (2026-09-03)
Sequence Import
- Sequence files with double line breaks (e.g. SqView exports) are now read correctly. Such files write an additional carriage return character per line; the free text import recognized each individual call line as its own sequence. Now the line endings are cleanly normalized before reading — multiple blank lines separate the sequences, single breaks belong to the ongoing sequence. Normal files remain unchanged.
- Head/Side abbreviations are recognized when matching the calls. „HDS“, „HD“, „SDS“ and „SD“ now count as role prefixes like „Heads“/„Sides“ and are correctly separated when matching with the call database.
- New option „Notation“ in the import dialog. Selectable: As in text (unchanged), ALL UPPERCASE or First letter of each word capitalized. This allows source files in uppercase to be directly converted into a nicely readable notation. The capitalization also applies after delimiters like „-„, „(„, „)“ — only after digits does the letter remain lowercase (from „1ST“ it becomes „1st“, not „1St“).
Improvements
- The table in the Evening Planner is significantly more readable. Previously, all cells were filled with the ERR level colors — in both dark and light themes, the titles were hardly readable. Now the table follows the normal theme (alternating row colors, standard text color); the ERR color is only present where it carries meaning: in the two ERR columns, as a solid badge with a white number. Unconfirmed song suggestions are now only italicized instead of gray — this keeps them easily readable in both themes.
- The candidate window (clicking on a slot) now also shows the ERR value as a solid badge instead of colored text — consistent with the main table.
- The bars in the tension arc diagram are now consistently in full color and match the ERR badges of the table.
Bug fixes
- Floating windows now remember their size and position across a restart. Affected were, among others, Evening Planner, Photo, Reports, Statistics, and the Magic Wand Planner: After closing and restarting, they opened again in standard size at the standard position. The cause was that a closed floating window lost its geometry when saving. The window size/position is now reliably saved and restored upon opening.
- „Add to Notes“ in the Evening Planner without a selected location showed the message „Please select a location first“ once per song (with many tips like a loop). The message now appears exactly once, after which the action cleanly aborts.
0.146 — Import songs via Drag & Drop on the NEW button (2026-09-03)
New Features
- MP3 files, ZIP packages, and entire folders can now be dragged directly onto the NEW button — the drop starts the same import as a click. When dragging, the button shows a dashed border as a drop hint. Since the source is already determined by the drop, only the file/folder selection is omitted compared to the click; the usual prompts (copy or leave in place, song type, genre assignment for folders) remain unchanged.
- Folder imports now also find included ZIP packages. If you drag a folder onto the NEW button (or select it via „Import Folder“), Callers Caddy recursively searches it for audio files AND ZIP label packages. Previously, ZIPs in a folder were ignored.
- With mixed content, a transparent follow-up question is asked. If a drop or folder contains both MP3/audio files and ZIP packages, a dialog will appear showing the exact number of both types and the options Only MP3 / Only ZIPs / Both. After that, everything continues in the usual import process (ZIPs into the preview window, audio with copy/type/genre).
0.145 — Cleaned up song list highlight & countdown disappears when the song stops (2026-09-02)
Improvements
- The highlight in the song list now uses Qt's native row selection — exactly one row is marked, and it moves smoothly in one step when switching. Previously, a separate highlight was overlaid on the selection. Both did not switch simultaneously, causing two colors to be visible briefly during song changes and the old song to briefly flare up before the marking jumped. The second system has been removed — less code, consistent behavior.
- When hovering with the mouse, the marked row is no longer covered in gray. A hover rule in the design changed the color of the cell under the mouse pointer, making it seem as if only one of the two columns (Title/Played) was highlighted. The rule has been removed; the marking remains fully intact while hovering.
Bug fixes
- The counting countdown now reliably disappears when stopping or switching the song. The countdown overlay is intentionally above all windows; with the active „Feedback at the end of the song“ dialog, the countdown number remained visible in front of the dialog when switching the song in the middle of counting. The countdown is now hidden immediately when the song stops — even before the feedback dialog appears.
0.144 — Double-click starts the song & continuous Now-Playing highlight (2026-09-02)
New Features
- Double-clicking in the song list starts the song immediately. A double-click on a song in the song list not only loads it but also plays it directly — one step less in live operation. The single click remains as usual: It selects and loads the song without starting playback.
Improvements
- The currently playing song is continuously highlighted — in the song list AND playlist. Previously, the marking was inconsistent (sometimes visible, sometimes not) because it depended on the row selection. Now a separate background highlight follows the actually playing song — no matter if it was started by click, double-click, from the playlist, or via a rule. The highlight remains on the correct row even after filtering/sorting the song list.
0.143 — New rule action „Create Jump Marker“ & fixes for rebuilding from the source code (2026-09-02)
New Features
- New rule action „Create Jump Marker“. Sets a custom jump marker at the current playback position of the running song via rule or Stream Deck/button. Unlike the manual „Set Marker“ button, this action not asks for a label, but automatically takes the current position as mm:ss as the label — ideal for marking a spot while calling on the go (e.g., via remote control or Stream Deck button) without interrupting the flow. The action is only executed during ongoing playback; if a marker is already very close (under 1 second) to the position, no second one is set. Found in the Rule Editor in the „Transport“ group.
Bug fixes
- First start against an empty database was aborted (
no such column: origin). The columnoriginthe tabledance_programswas only available as a subsequent migration (ALTER TABLE) not in theCREATE TABLE. Since the migration runs before the table is created at the first start, the ALTER was ineffective (error is swallowed) and the table was created withoutorigin— which led to the loading of the reference data (reseed_reference_data) crashed. The column is now additionally in theCREATE TABLE; the migration remains for existing databases. In the delivered setup, the error was invisible because the prepared database comes along — it only affected new builds from the source code. (Thanks to Thomas Franzek for analysis and patch.) pip install -r installer/requirements.txtfailed. The version pinaccess-parser>=0.4pointed to a non-existent version — the library only exists in the0.0.x-series on PyPI. Onaccess-parser>=0.0.4corrected (the same intended lower limit). Affected every fresh installation of the dependencies. (Thanks to Thomas Franzek.)
Custom bookmarks with labels (BL-185).
New Features
- Especially for callers working with recordings: You can now set freely named bookmarks at any point in the song — e.g., “Start of 2nd section” or “Applause” — to replay a sequence purposefully. Besonders für Caller, die mit Aufnahmen (Recordings) arbeiten: An beliebiger Stelle im Song lassen sich jetzt frei benannte Sprungmarken setzen — z. B. „Beginn 2. Abschnitt“ oder „Applaus“ — um eine Sequenz gezielt noch einmal anzuspielen. Set: Play the song in the player and click on „Set Marker“ in the „New Songs“ area (the space now shares with "Beat Snap"); a prompt for the label follows (pre-filled with the timestamp). Jump: In „Song Data“, a button labeled appears between „Loo—p Offset“ and „Lyrics file“ for each mark — a click jumps there. Manage: Right-click on a marker button (edit label/time, delete) or in the „Advanced Data“ dialog in the new „Marker“ tab. The markers are space-saving in the extended song data (no empty database fields for callers who don't use it) and are tied to the original time, so tempo/pitch-independent. Any number of markers per song is possible.
- New „To Call“ window — check off calls throughout the evening (BL-199). Many callers want to use each call of a program at least once during the course of an evening. The new dockable window displays the desired calls as tiles, evenly distributed across the field (with dynamic wrapping like in the jump markers window). Initially, all are high-contrast; a click marks a call as done. — the tile changes background and text to muted theme colors (still easily readable) and moves to the bottom end, where the completed calls gather in half size. This pushes the open calls up and gives them more space — the later the evening, the more generously the remaining figures are displayed. The font size automatically adjusts per tile (short names large, long smaller instead of cut off). Clicking again undoes „completed“. Fill: By clicking the „Fill“ button in the header, a dialog opens with the current dance program and all its calls (all pre-selected), along with „All on/off“. Preliminary save: The same dialog offers „Add to Notes“ — the selection lands as a compact entry in the notes (with full selection only the program; with minor changes only the exceptions; otherwise the call list). When this note is checked off, the To-Call window is automatically filled with it. This way, you can prepare the call lists for the evening. The check-off status applies to the current session.
- New window „Bookmarks“. An additional, dockable widget (can be displayed via the „View“ menu) shows all jump targets of the current song as large buttons: always Start · Loop Start · Loop End · End and behind that all your own markers (sorted by time). The buttons spread evenly across the window area and automatically wrap when you resize the window — similar to the Stream Deck. A click jumps immediately to the spot. Ideal for switching between important points of a recording while calling without going through the song data.
- New rule action „Shift Position (relative ±)“. Shifts playback relative to the current position — e.g., 20 seconds back. The value is entered in the format mm:ss.cs with optional sign (
-0:20= 20 s back,0:05= 5 s forward; decimal separator dot or comma). This allows you to create a button via Rule that gives a little extra time for a clean finish when a song fades out. The target position is automatically limited to the start and end of the song; the jump uses the same smooth crossfade as „Go To Position“. Found in the Rule Editor in the „Transport“ group directly under „Go To Position.“.
Bug fixes
- Deleted genres returned upon restart. If you deleted a standard genre (e.g., „Blues“), it was immediately gone, but reappeared at the next program start (with 0 songs). Cause: The standard genre list was reloaded at every start. Now, the standard genres are only loaded once. created during the initial filling of a new database; afterwards, genres deleted by the user remain permanently deleted. Exception: The system genre „NEW“ (marker for newly imported songs) is still always ensured and cannot be deleted.
0.141 — Call mapping comfort & speed, genre assignment during folder import + new rule actions (2026-08-31)
New Features
- View examples of a call text in call mapping. In the „Call Mapping“ window (assignment of sequence texts to the official figures), it is sometimes unclear what a contextually out-of-place text like „(Rotated)“ actually means. A Right-click now offers a call text in the first column „Show Example“: A viewer opens with all sequences using this text — for browsing, with the searched text highlighted in yellow in each sequence.
- New rule actions for sequence filters and dance programs. Rules can now set the filters of the sequences window themselves — suitable for the song type or level: „Contains“ (specific figure), „Limit“, „Only“, „Difficulty“ and „Tags“. Additionally, an action that sets the active dance program(s) (multiple selection via checkbox list). This way, everything is set up correctly automatically when starting a block. Also new: “Focus Widget + Cursor” „— like the “Focus Widget”, but additionally brings the mouse pointer to the center of the widget (handy for the lyrics window to scroll immediately).“ Assign genres directly when importing folders (BL-184).
- If you import an entire folder where all songs belong together (e.g., “Recordings”, “Elvis” or all Singings), you can now set the appropriate genres for all imported songs at once. After selecting the folder, a new dialog appears with a checkbox list of all existing genres — the checked ones are assigned to each song of the import. At the bottom, a new genre can be created; if the name already exists (regardless of case), no duplicate is created, but the existing genre is checked. The automatic “NEW” genre is displayed in the list and pre-selected — you can uncheck it here if the songs should be considered “processed” directly. The pure file import (individual files) remains unchanged. Call mapping: convenient search field for figure assignment.
Improvements
- The column “Figure (Teaching Order)” now uses the same search as the sequence filters: typing finds matches even in the middle of words (e.g., “thru” → “Pass Thru”) and shows them as a selection popup, and a small “x” in the field clears the input with one click. Call mapping „Confirm Selection“ reduced from several seconds to fractions of a second.
Performance
- Previously, each confirmed line was written individually to the database and then the entire list (~10,000 lines) was rebuilt — including an expensive suggestion calculation over all lines. Now, all confirmed lines are saved in one go and only the affected lines are removed from the view. Call mapping window opens noticeably faster.
- The user interface appears immediately, the visible part of the list is colored right away, and the suggestions for the remaining lines are updated in the background (immediately upon reopening in the same session). The suggestion calculation itself has also been accelerated. 0.142 — bookmarks & to-call list, relative position rule action, genre deletion fix (2026-09-01).
0.140 — Bug fixes: sequence program filter & search field completion (2026-08-29)
Bug fixes
- Fragmented auto-completion in the sequence search fields. In the fields „Contains“ and „Limit“ (as well as Tags) in the sequences window, entering a partial word like „Thru“ while typing created nonsense in the field (e.g., „Thru thru“); only after pressing Enter did it jump to the correct call („Pass Thru“). The cause was an inappropriate completion mode. The fields now display substring hits cleanly as a selection popup, and Enter directly takes the highlighted call.
- Sequences disappeared when selecting a program. After importing many of my own sequences (e.g., from SqView), the sequence list only showed something without a selected dance program — as soon as a program was chosen, it remained empty. The cause: During a mass import, the figures of the imported sequences were not automatically assigned to the known calls, and without this assignment, the program filter could not recognize any sequence as „dancable“. Fixed in three places: (1) on the first start of the new version, missing assignments for unique call texts are automatically and once added (existing databases heal themselves without intervention); (2) every future mass import will directly include the assignments; (3) the „Remapping“ button in the sequences window now also adds missing assignments instead of just recalculating. Manual assignments remain untouched.
0.139 — Dance program change 2026 (MS50 / Plus / Advanced 1) (2026-08-27)
New Features
- Support for the new dance programs starting September 2026. The Mainstream program is streamlined to 50 calls (MS50), and some figures are moving from Mainstream and Advanced 1 to Plus. Callers Caddy now knows both worlds simultaneously: the new programs Mainstream (2026), Plus (2026) and Advanced 1 (2026) alongside the previous lists Mainstream, Plus and Advanced 1. This way, both remain danceable during the transition period.
- Multiple dance programs per location. A location can now host multiple programs simultaneously — as a checkbox selection, both in the location settings and via the program button in the player. This is necessary because a figure can belong to multiple programs: For example, someone dancing Plus selects Plus (2026) and Mainstream (2026) together (the deeper programs are intentionally included and are not automatically carried over).
- Sequence filter by program selection. The sequence list shows exactly the sequences whose figures all appear in the chosen programs of the location — even if a figure is present in multiple programs due to restructuring. The „Only“ filter shows the sequences that the highest selected program really needs (that are not already danceable with a lower program).
- Dance program selection is now independent of the location. The selected dance programs apply for the entire session and also work without the selected location — the program button in the player opens the selection directly. The last choice made is remembered and loaded again at the next start. If you choose a location, it takes over its own programs. The current selection is additionally displayed in Settings → Sequences → Dance Program(s) and can be changed there via a button. The target song duration applies to the highest selected program.
- Organized dance program list including class programs. The list of dance programs is now clearly grouped by level — within each family in the order old → (2026) → (Class). The class programs (Mainstream (Class), Plus (Class) …) remain unchanged and use the same figures as the respective 2026 list; the target song duration can be freely adjusted per program. Additionally fixed: Class programs could appear and disappear depending on the program start.
- Figure filter in the sequences window follows the selected programs. The selection lists „Contains“ and „Limit“ now only show figures from the currently selected dance programs — and each figure in the right place: a figure that has moved to Plus (e.g., Spin Chain Thru) appears under Plus for MS 2026 + Plus 2026, no longer under Mainstream. The „Limit“ filter now neatly restricts the sequences over the program bands (instead of relying on a previously unreliable single value in parallel operation).
Improvements
- Dynamic Lyrics with randomness: even the first sequence is shuffled. If the shuffle mode is active in the sequence detail, Dynamic Lyrics now starts with a random sequence — instead of always starting with the first in the fixed order. The session's „already seen“ memory is continued: previously shown sequences are skipped until all have been shown.
Performance
- Sequence list is drastically faster when changing programs. The evaluation of „which sequences are danceable with the selected programs“ is now only once once per program set and then remembered (instead of being calculated multiple times with each change). After the first selection of a program, program changes, scrolling, filtering, and detail view are practically instantaneous; the remembered evaluation automatically discards itself as soon as sequences, assignments, or programs change. On weaker computers, the previous multi-second waiting time disappears.
Transition & Data Security
- Automatic, one-time transition at the first start. Existing locations will be set to the 2026 programs (standard „new“). Before that, Callers Caddy automatically creates a backup of the database. If someone wants to continue dancing a location according to the old list, they simply select the old programs again in the settings (Basic 1 + 2, Mainstream, Plus, Advanced 1).
- The programs Advanced 2 to Challenge 3B remain unchanged.
0.138 — Sequence Tags, Detail Header & Rules Window (2026-08-27)
New Features
- New rule action „Custom Size Widget.“. Opens a widget as a floating window with freely selectable size and position — width, height, and X/Y position each in percentage. The previous action „Fullsize Widget“ (fixed 90 %, centered) remains unchanged. X/Y refers to placement in the available space (0 = flush left/top, 50 = centered, 100 = flush right/bottom), ensuring the window remains fully visible at any size.
- Sequence detail shows type & difficulty in the header. The sequence detail view now has a header at the top displaying the sequence type and difficulty of the currently displayed sequence — so you can see at a glance what type of sequence it is, even without an active filter. The header automatically adjusts its font size to the available width and remains easily readable.
- Freely assignable tags for sequences. Each sequence can now receive a freely selectable tag in addition to type and difficulty — for example, „Once and a half“, „Asymmetrical Choreo“, or „One the x Hand“. The field is available in the sequence editor under „Difficulty“ and suggests already used tags while typing to avoid slightly differing spelling variations. In the sequences window, there is a new filter for this: selecting a tag shows only sequences with exactly that tag, a x resets the filter again.
Improvements
- Clearer rule editor. The parameters of an action are now labeled and listed vertically under the action, instead of being unlabeled in an ever-widening line. This keeps the Rules window narrow, even for actions with many settings, and each field is clearly named.
- No accidental adjustments via mouse wheel in the Rules window. When scrolling through the Rules window, the selection and number fields no longer change their value just because the mouse pointer hovers over them. If you actively click on a selection field, you can still scroll through the opened list with the mouse wheel. Other windows (e.g., long figure lists) remain scrollable as usual.
- Figure search in the sequences filter: Type instead of scroll. The fields „Contains“ and „Limit“ are now real search fields: You type part of a figure's name (e.g., „dodge“) and immediately get all matching figures suggested, where the text appears anywhere — no longer just at the beginning of the word. The suggestions are sorted by the selected dance program (figures of the current program first, higher programs afterwards). A small x in the field resets the filter with one click, without having to scroll back up.
0.137 — New theme „Winter is Coming“ (2026-08-26)
New Features
- New theme „Winter is Coming“ by Thomas Franzek. A dark theme with deep navy and icy blue accents (inspired by „Game of Thrones“). Selectable via Settings → Display → Skin / Theme.
0.136 — Large sequence library, longer sequences & faster import (2026-08-23)
New Features
- All sequence types included in the full package. The new installation now brings the complete choreography library with around 10,000 sequences across all types (Corner Progression, R-H Lady, Singing Break, Static Set, Zero variants, and much more).
- Reference sequences for re-importing. Existing users can find it in the program folder under
Sequence Importthe filesequence-import-v0136.jsonwith all sequences and can import them via „Sequences → Import Sequences (JSON)…“ The import automatically skips any existing sequences (no duplicates). - Sequences can now have more than 15 calls. The previous hard limit of 15 calls per sequence has been lifted — long Patter sequences (previously cut off) are now fully saved and displayed. Older versions of the program can still read the same database (backward compatibility).
Improvements
- Significantly faster import. All import methods (JSON, CSDS, free text, MDB, universal import) now run bundled: importing 10,000 sequences takes seconds instead of a minute. During the import, the mouse pointer shows a loading hourglass.
- Clean sequence types. Duplicate type labels for the same thing have been merged (e.g., „Singer“ and „Singing call“ for Corner Progression), separators standardized (arrow instead of hyphen), and the pure „Complete Dance Routine“ suffix removed, which created fake categories in the filter.
- Selection fields with one click. Editable dropdown fields (including „Contains“ filter, type/difficulty in the import and editor dialogs, figure selection in call mapping) now open their list with a click anywhere in the field — no longer just through the narrow arrow. Typing to search remains possible.
- Visible dropdown arrow in the „win11' theme. The selection arrow was white on a white field (invisible) and is now clearly recognizable.
- Call mapping: search per column. Under the column headers, there are search fields that allow filtering of call text, figure, and source (e.g., find all figures with „& Spread“).
- Call mapping opens with a loading indicator. Instead of waiting 1–3 seconds without feedback, the window appears immediately with a „Loading...“ message and hourglass.
Bug fixes & technology
- The „Contains“ filter has been internally switched to an indexed lookup index, keeping it fast even with over 10,000 sequences.
- Typeless old sequences without a recognizable type have been cleaned up.
- Call mapping readability: The colored call texts had light text on a light background in the dark theme — now consistently dark, easily readable text.
- Singing call sections: A heading like „ALTERNATE OPENER – BREAK – CLOSER“ incorrectly claimed the actual Opener/Break/Closer sections, causing the Dynamic Lyrics display to jump to the alternate block. Such „Alternate/Additional“ blocks are now correctly treated as additions (affected songs need to be resynchronized).
0.135 — Location Sessions (Appointments, Start Detection, Shared History) & Random Jump by Rule (2026-08-21)
New Features
- Appointment details per location (multiple weekday/time slots). In the settings dialog of a location, you can now store a list of appointments — each with its own weekday and specific start-end time. This way, the same location can dance, for example, on Tuesday evenings and Saturday afternoons at different times. Appointments can be added via „+ Appointment“ and removed individually. This is the basis for the new start detection and upcoming session features. Without an appointment, the location remains as previously considered appointment-free.
- Automatic location detection at program start. If the current weekday and time match a stored location, Callers Caddy suggests it at startup („Matching today … Start location ‚X‘?“) and takes it upon confirmation. If there are multiple matching locations, a selection appears; if none match, everything remains as before. The suggestion only applies as long as no location has been chosen yet, and with a tolerance window starting 60 minutes before the start.
- Shared playback history between locations. In the settings dialog of a location, you can choose another location as a shared history base via „Share history with …“. After that, plays from both locations count together — ideal for clubs that dance on multiple days with some of the same dancers: the same „new“ song is not recommended twice. Existing entries will be transferred to the shared history after confirmation. Notes, dance programs, tempo, and appointments remain separate per location.
- Create new sub-location. A click creates a location that takes over all settings and appointments of the selected location and automatically shares its history with it — the quick way to set up a second dance day for the same club.
- Linked locations visible & clickable. The settings dialog shows all locations with shared history under the appointments; the history-leading location is highlighted in bold and underlined, and you can click to go directly to its settings. In the location list, a shared history is marked with „→ Target Name“.
- New rule action „Random Sequence“ (Group Sequence View). Jumps in the sequence detail view by rule to a randomly chosen other sequence — regardless of whether the dice switch is active. This allows the random jump to be triggered via the Virtual Stream Deck or a remote control. The same logic applies as in dice mode: drawing without replacement per session with silent replenishment when all matching sequences have been played once.
- Selection adheres to the set filters. The random jump only pulls from the sequences that match the currently set filters (Contains, Type, Difficulty, etc.) — even if the detail window wasn't visible during the filter change. The filter state is freshly applied upon triggering, without losing the session memory (already shown sequences).
Improvements
- Time fields are readable in all themes. The new from-to time fields (and all future time inputs) are now styled by the skin system like the other input fields — previously, they were light text on a light background in the default theme and hardly readable.
0.134 — Random mode for sequence navigation (2026-08-20)
New Features
- Dice button in the sequence detail view (Sequence View). Next to „Continue“, there is now a dice toggle. When active, „Continue“ (button, right arrow key, and automatic switching with Dynamic Lyrics) no longer jumps to the next sequence in order, but to a random one. selected other sequence — only from the sequences that match the currently set filters.
- Drawing without replacement (per session). Callers Caddy remembers which sequences have already been played in random mode for the current session and does not repeat them until all matching sequences have been shown once. When the supply is exhausted, it refills quietly in the background (no notification) — so nothing disturbs the Singing Call, not even with active Dynamic Lyrics.
0.133 — New rule actions for sequences & songs + manual stream deck trigger (2026-08-16)
New Features
- New rule action „Set Sequence Type“ (Group Sequence View). Switches the type filter in the sequences window to a chosen value via rule — e.g., for Singing Call to the Singing Call figures, for Patter to modules and get-outs. The parameter offers the actual sequence types available in the database as options. If the saved type is no longer available, the filter remains unchanged and a brief note appears in the status bar.
- New rule action „Load Song“ (Group Transport). Automatically selects a song by type (Singing or Patter) and sorting, and loads it ready to play in the player (without automatic playback). „Recommendation“ always delivers the best song, while random sorts like „Balanced Roulette“ (weighted random) bring a different song with each trigger. The selection uses exactly the same rating as the visible song list. All sorts of the song list are available (Recommendation, weighted random, random, quality, recently played, alphabetical, added).
- New trigger „Virtual Stream Deck (manual only)“. Rules with this trigger no longer fire automatically on an event but are triggered exclusively via the Virtual Stream Deck (or manual call). It is at the top of the trigger selection. This allows you to create pure button press actions without having to choose an artificial trigger.
Improvements
- Automatic song loading via rule no longer blocks. The action „Load Song“ no longer shows an interactive sync point takeover dialog when loading a Singing Call — this query dialog remains reserved for manual song selection. Previously, such a dialog (sometimes behind the window) could hang the loading during live operation.
- Virtual Stream Deck: Initial letter capitalized and scalable. If a rule has no icon, the button shows its initial letter — this was previously very small and did not scale with the tile size. The letter now fills the tile similarly to an icon and grows correctly when enlarging/shrinking the deck.
0.132 — Dynamic Lyrics: Display sequences live in the Singing Call (2026-07-29)
New Features
- New button „Dynamic Lyrics“ in the Lyric window (next to Auto-Scroll). When activated, the text of the four figure sections of a Singing Call is temporarily replaced by the choreography sequences selected in the Sequence View. The Lyric file remains completely untouched — only the display is swapped. When turned off, the original text from the document reappears immediately.
- Auto-Scroll continues to run. The set SyncPoints remain valid; the display continues to follow the music, showing the displayed sequence texts instead of the figure lines from the Lyric file. The timing of the sections remains identical.
- Live switching of the choreography. Upon first activation, Callers Caddy asks once how the sequences should be distributed: either the same sequence in all four figures, or — starting from the currently selected sequence — the next sequence for each figure round. In a split FIGURE block, the display switches to the next sequence exactly at each figure part boundary (after the fourth round, it stays). The figure part times are derived from the existing SyncPoints.
- Settings are remembered. Both the choice made (Option 1 or 2) and whether Dynamic Lyrics should be active at all are saved and restored at the next start. Both can also be toggled in the settings under „Lyrics“ („Dynamic Lyrics active“ and „Dynamic-Lyrics mode“) — the new fields are fully translated (DE/EN/JA).
- Dynamic Lyrics remains active across song changes. When the mode is turned on, it automatically applies to the next song and reflects the currently displayed sequence in the Sequence View — you don't have to activate it again for each title. For a song without the necessary prerequisites, it pauses silently and returns by itself with the next suitable title.
- The Sequence View controls, the Lyric field reflects. With live flipping (Option 2), Callers Caddy flips one sequence further in the Sequence View at each figure part boundary, and the Lyric field shows exactly what is currently displayed there. The same coupling applies when manually flipping forward or backward in the Sequence View — the Lyric field follows immediately. This lays the groundwork for allowing the user to control the flipping later via remote control.
- Displayed sequences without background markers. The inserted sequence text takes the font and color of the surroundings, but no background/highlight color from the Lyric file anymore — it will no longer accidentally be highlighted in pink (or similar).
- Clean graying out. The button is only available when all prerequisites are met: Lyric loaded, SyncPoints set, figure sections recognized, and at least one sequence chosen in the Sequence View. If something is missing, the button is grayed out and states the reason in the tooltip. In Sync and Edit mode, Dynamic Lyrics is not available.
0.131 — Pause update reminder, manual update check & more Stream Deck icons (2026-07-26)
New Features
Significantly more symbols for the Stream Deck buttons. There is now a suitable icon for practically every rule action (tempo, pitch, live volume, BPM, window focus/full screen, dual view, auto-scroll, sequence view, photo, genre, messages, warning color, etc.), plus standard symbols like directional arrows in all eight directions, an eye, and a mouse pointer. All new symbols are designed in the same style and will be automatically colored in the theme color as before.
The update notice can now be muted for 7 days. In the „Update available“ window, in addition to „Download now“ and „Later“, there's the option „Don't remind me for 7 days“. If you check it, you won't be reminded of the same version for a week during the next start — so the daily reminder when opening is gone, without losing sight of the update. After the 7 days, the program will remind you again on its own. „Later“ remains the way to „just skip this time“ as before.
A truly newer version breaks the quiet period. If a higher version than the postponed one appears within the seven days, the notification will still be displayed immediately — only the version for which you chose „quiet“ is held back.
New menu item „Check for updates...“ in the „Info“ menu. This allows you to manually check for a new version at any time. Unlike the automatic check at startup, the manual call always provides feedback: either the update window, „Callers Caddy is up to date“ or a notification if there is currently no connection. A set 7-day quiet period is consciously overridden in this case.
0.130 — Automatic update check at program startup (2026-07-25)
New Features
- Callers Caddy automatically checks at startup if a newer version is available. Shortly after opening, the program checks in the background in the online download area. If a higher version than the installed one is available, a notification „An update (version xy) is available“ appears with the buttons „Download now“ and „Later“. If everything is up to date, nothing happens — no window, no delay. Even if there is currently no internet connection, the program starts normally.
- „Download now“ specifically downloads the correct update file. Instead of having to search in a folder full of ZIP files, the button directly starts the download of the appropriate update file into the download folder. This way, the complete reinstallation that would overwrite existing data can no longer be accidentally downloaded.
0.129 — Fill in missing lyrics from a folder: „Search in the Crate“ (2026-07-24)
New Features
- New button „Search in the Crate“ in the optimization window under „Without Lyrics.“. This allows you to fill in missing song lyrics for Singing Calls in one go from an existing folder full of loose lyric files — for example, the exported lyrics folder from another program. After clicking, a short dialog explains what will happen next and lets you choose between „only this folder“ and „also subfolders (recursively).“ Then you select the folder, and the program searches it for suitable candidates. Only Singing Calls without stored lyrics are affected.
- The matching recognizes suitable files by title, label, and catalog number — following the same principles as the ZIP import and cue sheet search. Different spellings (slugs, hyphenated and multi-word labels, modifier suffixes, capitalization) are dynamically considered. The search is not only in the file name but also in the header of the file itself — so files with uninformative names are found if the title is in the text. Since song lyrics apply per title and not per recording, label and catalog number count here as additional confirmation, but do not prevent a good title match (unlike in the cue sheet search, which concerns a specific recording).
- A results dialog compares the song and the found file and shows a probability for each line. The table displays the title, label, and number of the song alongside the information derived from the file, as well as the source (file name or file content) and a brief explanation. All suggestions are pre-selected — you can either approve them all or selectively uncheck some. The table can be sorted by any column (e.g., by probability), allowing everyone to decide how far they want to go. When accepting, the selected files are copied to the lyrics folder and assigned to the respective song — so the searched folder can be a temporary staging folder.
Improvements
- The search principles of ZIP import and cue sheet search are now centralized in one place. Title/label/number breakdown and hit evaluation have been merged into a common base shared by the new crate search and the ceder.net search. Improvements in recognition will thus take effect everywhere simultaneously in the future. The behavior of the cue sheet search remains unchanged.
Bug fixes
- In the sequence detail window, the last line is no longer cut off. The automatic font adjustment allowed for a small overflow with large fonts and few lines, causing the bottom call line to stick out of the window. The font is now reduced enough so that the entire content fits securely within the available height — no more clipping, no matter how you resize the window.
- When editing a rule, the name, trigger, and action are no longer lost when you touch the Stream Deck fields. Previously, when setting the button number (or icon/tooltip), the entire rule was immediately saved and reloaded — any inputs above that had not yet been confirmed by „Save“ were lost, and the „Save“ button was grayed out. Now, the Stream Deck fields for custom rules behave like normal editor fields: changes keep the „Save“ button active, and clicking „Save“ writes everything together (name, trigger, actions, and deck parameters including seamless renumbering). System rules are still immediately applied to the deck.
0.128 — Stream Deck: the rule system as a click interface (2026-07-23)
New Features
- New dockable window „Stream Deck“ — the powerful rule system gets a visible face. Each rule can have a button number, an icon, and a tooltip; all rules with a number greater than 0 appear as square tiles in the Stream Deck, sorted by their number. A click on a button immediately executes the rule — the conditions are still checked (e.g., „only for Singing“), only the key trigger is skipped. The buttons optimally utilize the window space: they are always square, break into multiple evenly filled rows with many buttons, and the button matrix is centered. A subtle gear in the top right directly opens the rule window for adjustments. The window can be freely docked, tabbed with other windows, or floated — the arrangement is retained over a restart.
- The Stream Deck comes pre-equipped with five standard control buttons. F5→Play, F6→Pause, F7→Stop, F8→Fade Out, and Spacebar→Play/Pause are available as buttons on the deck from the start (with matching icons). They are system rules, so they are always present — they also work through the actual keys. If you don't need a button, you can simply remove it from the deck; it won't come back uninvited. Existing installations will receive this initial setup at the next start.
- Rules now have a „Stream Deck“ section in the editor. Here, you can set the button number (= position), icon, and tooltip — with a preview of the selected icon, displayed like the later tile (so that the icons are also clearly visible on light themes). The numbers are always assigned without gaps (as many different numbers as buttons), and a change in position is immediately visible on the deck. The section is intentionally editable for system rules as well, so any rule can be placed on the deck.
- 17 new symbols for the buttons. Play, Stop, Pause, Play/Pause, Fade Out, Louder, Quieter, Faster (Rabbit), Slower (Turtle), Loop, Check Note, Next Song, Pause with Last Song, Pause (Coffee Cup), Open Window, Close Window, and Choreo (Dance Print). They are — like all icons — automatically colored in the theme color; pure title bar icons are intentionally not available in the selection.
Improvements
- In sync mode, the song start can now be shifted directly by one second with a button. To the left of the zoom buttons in the lyric window, there are two new buttons „−1 s“ and „+1 s“. A click shifts the start of the song along with all set sync points and the endpoint by one second forward or backward — practical for adjusting a start that is slightly too early or too late without touching each point individually. This function already existed but was hidden as a right-click menu on a sync point („Move All“); it is now just more accessible. Both methods use the same logic, and the buttons only appear in sync mode.
Bug fixes
- Windows reliably remember their arrangement again — including the last tab that was in front. Windows that are created late during program startup (including the pause clock and the new Stream Deck) returned to a standard position after a restart, instead of where you last had them — they simply didn't exist at the time of layout restoration. Now, all docks are created before restoration, and additionally, it is remembered which tab was in front for each tab group (Qt otherwise forgets this when restoring). Position, size, visibility, and active tab return uniformly for each window — all without the previous individual special treatments.
0.127 — Pause rules, ceder.net filtering, more robust section recognition (2026-07-22)
New Features
- Two new rule actions for the pause. In the „Transport“ group, there are now „Start Break“ and „Start Break with last Song“. Both open the pause clock and start the countdown; the second also plays the last song as waiting music. The pause duration can be set as a parameter (minutes) — at 0, the default pause duration of the current location is used automatically.
- New button „✨ Make everything nice“ in the optimization window (Potential). At the very bottom of the overview page, it sequentially executes the existing healing functions upon request, instead of triggering each one individually in its tab. A click opens a selection list with all actions and the respective found case count — recognizing BPM, auto-loop for Patter without loop, BeatSnap, recognizing song beginnings and sync points. The filling actions are pre-selected; the two deleting cleanup actions (empty locations, orphaned history) are intentionally not checked and must be activated individually. Actions without cases are grayed out. The run shows a ToDo progress list with the current step highlighted, can be canceled at any time (already made changes are retained), and reports at the end per action how many songs were processed and how many were skipped. Only the currently open cases are tackled — the „RE-CALCULATE ALL“ variants of the tabs remain untouched.
Bug fixes
- The dance programs and their figure limits are now also added to existing installations. Anyone who updated Callers Caddy (where the database is intentionally preserved) found that the dance programs were either missing or without a set sequence limit. As a result, the program change did not filter in the sequences window. At the next start, missing programs will be created and missing figure limits will be added once (Mainstream, Plus, A1, A2, C1, C2, C3A along with class variants). Custom programs, personal target pattern lengths, and a program intentionally set to „no limit“ remain untouched.
- The counter „Loop without BeatSnap“ now decreases after a BeatSnap run. Previously, the number remained unchanged, even though the stack BeatSnap had run: The check only considered a loop optimized when a loop offset was set — but the stack run only grabbed the loop marks on the beat and never measured the offset. Now the stack BeatSnap additionally measures the loop offset (low-pass cross-correlation in the bass range), just like the single song BeatSnap. This makes the loops not only beat-accurate but also smoothly blendable, and the processed songs disappear from the list. This also applies to the existing „Optimize All“ button in the BeatSnap tab.
Improvements
- The field „Contact address for server inquiries“ in the settings has been removed. It was purely a courtesy entry for ceder.net access, but it was almost always left empty and only caused confusion. For inquiries to ceder.net, a descriptive identifier text (program name + homepage) is still sent along, but no personal email address anymore.
- The network section in the settings is now translated. The section „Network“ along with „Cue-Sheet search on ceder.net“ (including tooltip) was previously displayed in German in the English and Japanese interface. The missing translations have been added.
- The setting „Patter filling in the planner“ is now translated. Field name and explanatory tooltip previously appeared in German in the English and Japanese interface. The missing translations have been added.
- The ceder.net hit dialog is now fully translated. The columns „Safety“ (safe / likely / uncertain) and „Reason“ (e.g., „Title identical“, „Title similar (85 %)“, „Label matches“, „Record number matches“, „no Cue Sheet“) were previously hardcoded in German from the search logic and remained untranslated in the English and Japanese interface. They now run through the central translation table (German, English, Japanese).
- When fetching a cue sheet from ceder.net, navigation elements are now filtered out. The „two columns“ toggle in the top right and the database links in the footer („Data page“, „Cue sheet“, „Lyrics“) previously ended up in the local lyric, even though they were of no use there. They are now removed before saving. The source reference remains as an HTML comment in the file.
- The section recognition for auto-sync can now handle additions attached to the heading. Many cuesheets (including those from ceder.net) write the dance program or a description after the heading following a larger gap — for example, „OPENER – MIDDLE BREAK – CLOSER Mainstream“ or „FIGURE Plus, corner progression“. Previously, the recognition completely discarded such lines (a single foreign word caused the entire heading to fail), so the auto-sync aborted with „no matching texts“. The addition after the gap is now separated; the protection against false alarms from normal song lines remains intact.
0.126 — Fill Patter to target length, sequence limit on program change (2026-07-20)
New Features
- Newly added patters in the planner can be automatically adjusted to the target length. In the settings, there is a new field „Patter Filling“ in the planner area with two options. With „Endless,“ everything remains as before: a newly added patter runs without a fixed length (∞) until you manually end it or set a length per song. With „Optimize to Target Length,“ the appropriate loop count is automatically set for each newly added patter — whether by button, double-click, drag, or via the magic wand — so that it closely matches the target length of the active dance program. If no whole loop count is close enough to the target time, fine shortening (whole phrases) is additionally applied, which comes down to about 20 seconds — the same calculation as in the loop dialog done manually. Songs without valid loop marks remain unchanged and endless. The default is „Endless,“ so nothing changes for existing processes unless you switch it.
Bug fixes
- A manually set limit in the sequences window is retained when switching the dance program. Previously, the limit filter was reset to „All“ when changing programs if the newly selected dance program did not have its own sequence limit set — the manually chosen limit was lost each time. Now, the filter is only adjusted if the target program specifies a sequence limit; otherwise, the current selection remains. There is no change for programs with a set sequence limit.
- The saved zoom in the lyric window now applies immediately upon startup. If you had manually set the lyric font size, you initially saw the small default size after starting the program — only pressing a zoom button restored the saved value. The reason was that the saved size was only applied to the still empty lyric window and was lost when loading the first text. Now it is directly applied to the loaded text.
0.125 — Colored lyric sections, personal presets (2026-07-20)
New Features
- The favorite sorting can now be permanently set. If you always work with „Recently Played“ or „Recommendation“, you previously had to reset the sorting after each program start. In the settings, there is now a new section „Sorting“ with the field „Favorite Sorting“ — all seven sortings are available for selection. At the next start, the song list and planner are already sorted that way. The sorting in the planner was previously fixed to „Recommendation“ or „Quality“ every time the window was opened — if a favorite sorting is set, it now takes precedence, and even a manually changed sorting remains intact when reopened. Without a stored favorite sorting, it remains as before.
- The „Only“ filter in the sequences window can be preset. If you generally only want to see the sequences of the selected program, set the new option „‚Only‘ filter active at startup“ in the sequences area. The checkbox in the sequences window will then be checked from the start, but can be toggled as usual during operation.
- The sections of a Singing Call are displayed in color in the lyric window. In sync mode, a separate column appears to the right of the text, showing the opener, the four figures, middle break, closer, tag, and additional lyrics as colored bars — in the same colors as the section bar in the player. If multiple sections share the same text, which is often the case on many cuesheets, they appear as narrow columns next to each other instead of stacked.
- You can move the section boundaries with the mouse. The top and bottom edges of each bar are individually grabable, indicated by the mouse pointer. The boundary snaps to text lines, and the start cannot overtake the end. It saves when you release. Because the column is next to the text and not above it, clicking on an edge can no longer accidentally trigger a sync point.
- Each section remains individually movable, even if multiple start on the same text. If the opener, middle break, and closer are on a common block after auto-analysis, only one of them can be pulled out — for example, to extend the middle break into the alternative lyrics later. If sections only partially overlap afterwards, they automatically move into adjacent tracks instead of covering each other. Those who do not overlap with anyone use the full width.
- The recognized sections are permanently saved with the song and are therefore available even after a restart, instead of being recalculated with each auto-sync. This applies to both methods: the auto-sync in the lyric window and the batch run „Set Sync Points“ in the background. The batch run has already calculated the sections, but until now, it only saved the jump marks from them and discarded the analysis afterwards.
- „Additional Lyrics“ and „Alternate Lyrics“ are recognized as their own section. This fixes a visible bug: Because a section extends to the next recognized heading, the alternative figure text previously migrated into the preceding block, extending the opener by multiple times. Now, in 29 of the existing lyric files, a block is correctly limited.
- The tag gets its own jump point. at the end of the closers. So far, it has been skipped during auto-sync.
- New button „RE-CALCULATE ALL Songs with Lyrics“ in the „Without Sync Points“ tab. It runs through the entire inventory, including songs that already have sync points and therefore are not in the list. This is intended for cases where the recognition has improved and you want to recalculate everything fresh. Since existing bookmarks are deleted and reset during this process, the query beforehand counts exactly how many songs are affected and how many of them already have bookmarks.
Improvements
- The button „Add All Songs“ is now called „Add All Songs from the List.“. It has always only processed the songs from the displayed list, meaning those without sync points — the old name suggested a complete run over all songs.
- A repeated collection run leaves no remnants anymore. Previously, the bookmarks were written over the existing ones. If a song had more bookmarks before than the new run generated, the excess from the old synchronization remained and mixed with the new ones. Now, the old bookmarks of the slot are removed first. Songs whose analysis fails remain untouched.
- Headings with explanatory additions in parentheses are recognized again. A line like „FIGURE (twice for heads, twice for sides):“ was previously discarded because the length check occurred before cutting off the parenthetical addition — the line is 42 characters long, while the actual heading is only 6. In 14 lyric files, all figure sections that were previously completely missing are now recognized. This also affects the auto-sync: these songs previously received incorrectly set bookmarks.
- If a song is skipped during the collection run, the message now indicates where to continue. Instead of just „no song start,“ there is now a note about the „Without Song Points“ tab, where the missing value can be set. The reason was always correctly named, but it led slightly down the wrong path — with flawless lyrics, you first look for the error there.
- Both settings are labeled in all three languages and marked as requiring a restart in the settings window — they take effect at the next program start.
- The random tiebreaker is correctly operable at startup. Previously, the box was always grayed out after startup because the application assumed „Alphabetical“. Now it is based on the actual set starting sort order.
- New settings also appear with a fresh installation. Until now, the settings window only displayed areas that were already in the INI file — with a new installation, areas that had never been used remained invisible.
0.124 — Target BPM per Location, „Only“ Filter for Sequences, ZIP Import (2026-07-19)
New Features
- The sequence list can now specifically display only the sequences of the selected program. Next to the limit selection box is the new checkbox „Only.“ Background: When choosing a limit like A1, previously all sequences of the lower programs were displayed — Plus, Mainstream, and Basic. While all are danceable for A1 dancers, those who came to an A1 evening want to dance A1. With the checkbox checked, only the sequences remain whose hardest call is within the program of the limit — so at least one A1 call per sequence is guaranteed.
- This also works with a limit in the middle of the program. If someone chooses a single call as a limit (like the learning status of a class), they get exactly the sequences with at least one call from the started program, but none above the chosen call — suitable for teaching.
- The filter works everywhere the filtered list is reused: when browsing in the detail window, during rule actions on the filtered selection, and when transferring to the notes. Without a selected limit, the checkbox has no effect; the explanatory tooltip is available in all three languages.
- Each location can now specify a target tempo in BPM. In the location settings, next to the known percentage tempo, there is a second field „Target BPM.“ When active, the current tempo is automatically calculated at each song change so that the song runs exactly at the set BPM number — regardless of how fast the recording is originally. This way, all songs of an evening run audibly at the same tempo. The basis for the calculation is the actual song speed, so base BPM times song tempo.
- Switching is done via the selection button, not by deleting. In front of both fields sits a selection button that determines which value applies. Both numbers remain saved — if you switch between „103 %“ and „128 BPM“, you don't have to retype anything. Existing locations continue to run unchanged in percentage mode.
- Manual deviation remains possible. Today's tempo can be adjusted manually as usual after the automatic setting — for example, faster for a Hot Hash or slower in the workshop. The deviation applies to the current song; with the next song change, the automation recalculates back to the target BPM.
- Protection against typos. When activated for the first time, the field is pre-filled with 128 BPM, the usual Square Dance tempo. If the entered value is outside of 100–150 BPM, the dialog will ask before saving — a mistyped „13" would otherwise push every song unnoticed to the tempo limit.
Improvements
- The ZIP import now recognizes significantly more filename patterns of the labels. An analysis of the open-source program SquareDesk served as a template, whose name recognition has grown over the years with many real music files. Newly recognized are: labels with a hyphen in the name like „4-Bar-B 123 – Chicken Plucker“ (previously, the label name was cut at the hyphen), multi-word labels like „New Beat 203a“ or „Blue Star 1790„, label abbreviations with a number like „OGRMP3 04“, pure number labels like „123 – Chicken Plucker“ — also with a dot instead of a hyphen („123.Chicken Plucker“) — as well as the format with a hyphen between label and number like "Paper Doll – Windsor-4936B.".
- Download filenames with underscores are automatically cleaned up. From a shop filename like „ego_112_-_go_tell_aunt_rhody“, the import now creates the title „Go Tell Aunt Rhody“ and label „ego 112". Completely lowercase or uppercase titles are converted to normal capitalization; mixed case remains untouched.
- Vocal files are now recognized more reliably as a variant. In addition to the known abbreviations, the full word „vocal“ in the filename as well as the bracket additions „(Vocal)“ and „(Inst)“ are now counted. Such files will no longer be mistakenly suggested as main titles.
- The labels with hyphens and the multi-word labels are listed in the editable label list. If you use another label with an unusual name, you can simply add it in the import dialog — from then on, it will be recognized correctly.
- Attached images (covers) and XML files are clearly listed in the completeness report with a specific reason instead of just as „unknown file type.“.
- Compact filenames in SqView style are recognized. For files like „A1005m“/„A1005v“ (label number plus attached identifier, without title), the label number is taken as the label and the pair is correctly bundled to main MP3 plus vocal variant. In a practical test with the existing library (755 files), label recognition increased from 15 % to 52 % of the files — the rest are normal music titles that intentionally do not receive a label.
- The magic wand in the planner reshuffles the random sortings before each filling. Those who had set the sorting to „Random“ or „Weighted Random“ and let the playlist be filled automatically twice in a row previously got exactly the same song selection both times — a second attempt for a different suggestion was therefore pointless. Background: The drawn random numbers are intentionally cached so that the song list does not reshuffle with every keystroke in the search field. The magic wand now specifically reshuffles them beforehand. In weighted random, the weighting remains intact: well-rated and rarely played songs continue to be favored, just not in the same order every time. Nothing changes with all other sortings.
Bug fixes
- Files with the same name from different ZIPs no longer overwrite each other. If two ZIP packages contained a variant or lyrics file with the same filename (e.g., „vocal.mp3„), the second import previously silently referred to the file of the first. Now the content is compared, and in case of deviation, a unique name with the addition "_1" is assigned; true double imports of the same file remain without duplicates as before.
Notes
- If a song cannot reach the target BPM (range 50–150 %), it will be adjusted as close as possible, and the BPM display in the player will appear in warning color; the tooltip states the reason. Songs without a stored BPM will continue to play at 100 % — the display will then show „—“. The potential window already lists songs without a BPM value.
- Since today's tempo only knows whole percentages, the actual BPM number can deviate by up to half a beat per minute from the target.
0.123 — Zooming with CTRL + Mouse Wheel, Random Sortings (2026-07-18)
New Features
- CTRL + Mouse Wheel now zooms everywhere that previously only had the plus/minus buttons. Affected are the sequence list, the lyrics window, the notes widget, the class designer, the curve in the evening planner, and the two waveforms in the beat snap dialog. The mouse pointer must be over the respective content. Zooming occurs in the same steps and within the same limits as with the buttons — the percentage display updates accordingly, and the saved zoom level upon exit behaves unchanged. With high-resolution mouse wheels and touchpads, partial steps are added together, so a felt grid step corresponds exactly to one zoom step.
- Two new sortings: „Pure Random“ and „Weighted Random.“. Both are available in the sorting selection box of the song list and playlist manager and also affect automatic filling via the Magic Button — if one of the two is selected, it takes precedence there. „Pure Random“ shuffles evenly. „Weighted Random“ draws based on the recommendation score, meaning quality times days since last played: well-rated and long-unplayed songs are significantly more likely to come forward, but poorly rated ones still have a real chance and do not disappear permanently from the program. Based on a library of 526 songs, a title with quality 10 appears in about 12 % of the draws in the first twenty, while one with quality 1 appears in about 1 %.
- Songs without ratings are treated as mediocre in the weighted random. A missing rating is a zero in the database, and a zero in the score would mean: this song never gets played — and therefore can never be rated. In the weighted random, a missing rating counts as a neutral 5, so the unrated back catalog gradually slips into the program. The normal recommendation sorting continues to calculate with the actual value unchanged.
- A song already played today stays at the back. Zero days since last played also results in the smallest possible weight in the weighted random — the same title should not be suggested again that evening.
Notes
- The shuffled order remains stable as long as only filtering is done — typing in the search field or changing genres does not cause the list to jump. It gets reshuffled at program start and every time one of the two random sortings is switched in the selection box.
- Without holding down the CTRL key, the mouse wheel remains the scroll wheel as before — zooming only works with the modifier.
0.122 — Sorting by insertion date, more cuesheets recognized during auto-sync (2026-07-17)
New Features
- Sorting by insertion date. The sorting selection field in the song list and planner has a new entry „Insertion Date“ — the most recently added songs are at the top. Songs without a saved insertion date (the legacy data carried over during migration) inherit the date of the first recording from the configuration, forming a common block behind all later entries. The random tiebreaker also applies here and shuffles songs with the same date at each program start.
- The date column moves with the sorting. When sorted by insertion date, the „Played“ column in the song list and planner shows the insertion date and is labeled „Added“; when sorted by recommendation, the same column shows the recommendation score and is labeled „Score“ — in any other sorting, it still shows the date when the song was last played in that group. Thus, the number in the table always corresponds to the current sorting. Inherited data from the legacy stock appears gray and italicized with an explanatory tooltip, so it is not confused with a real insertion date.
- Score column for recommendations. When sorting by „Recommendation“, the second column shows the underlying score as an integer — the product of quality and days since last played. This makes it immediately clear why a song is at the top. The displayed number comes from exactly the same calculation as the sorting itself, so it cannot differ.
Improvements
- Section labels in parentheses at the beginning of lines are recognized. Some cuesheets write the label in parentheses before the first call of the same line — for example
(Figure): HEADS SQUARE THRU and go - four hands and go. Such lines were previously completely overlooked, the auto-sync found no sections in these sheets and failed. Now the content in parentheses is considered a label and the rest of the line as content. Combined labels like(Middle Break & Closer):are included. Without parentheses, the previous strict checking remains in place, so that a song line is not accidentally considered a heading. - Additional spellings in the keyword list:
OPEN,CLOSE,BREAKSas well as the misspellings that actually occur on sheetsMIDLE. A title only counts if all its words are known — a single unknown word has previously caused the entire line, including Opener and Closer, to fail.
Bug fixes
- Song list: songs that were never played were treated as „played today“ during sorting. The song list was missing the date limit from the configuration that the Planner has long been using. As a result, a never-played song was considered 0 days ago when sorting by „Last Played“ or „Recommendation“ and ended up at the bottom instead of the top — exactly the opposite of the intention. Now, the song list also calculates from the set date limit, so songs that haven't been played for a long time and never played songs come up correctly. The Planner was never affected.
- Separate Opener and Break have been merged into one block. If a sheet under the Opener contained a second title with a previously unknown word (e.g.
BREAK & CLOSE), this title failed and the Opener block was silently applied over both sections and used equally for Opener, Middle Break, and Closer. The three parts now point to their respective text blocks.
Notes
- Measured against the test library (218 Cuesheets), the recognition rises from 199 to 204 sheets. All already functioning sheets provide unchanged positions. Of the remaining failures, most are pure song texts without section titles — there is nothing to share there, they continue to be consciously rejected instead of guessed.
0.121 — Set sync points in bulk (2026-07-15)
New Features
- Set sync points for many songs at once. The tab „Without Sync Points“ in the potential window now has two buttons below the list: „Add Selected Songs“ (multiple selection in the list is now possible) and „Add All Songs“ for the complete list. The calculation is done exactly like manual sync in the lyric window: the song body is divided into 7 equal sections, the section headers are searched in the cue sheet, and up to 14 anchors are set from them. All lyric formats are supported (HTML, RTF, DOCX, PDF, TXT) — the lyric files themselves are not changed, the points remain in the database as before.
- Time estimation before the big run. From 15 songs, 5 will first run as a trial, their duration measured and the total runtime projected — with a query whether the rest should run. The 5 trial songs are already entered and will not be recalculated. Same pattern as in the song start tab.
Notes
- Requirements per song: BPM and song start must be set, the lyric file must be findable. If a song end is saved, it will be used; otherwise, it is derived from 448 beats and the BPM.
- Skipped songs will be reported by name with reason — either because a requirement is missing or because no sections could be identified in the cuesheet. Nothing is omitted silently.
Bug fixes
- Delivery database contained data from the development environment. The supplied database in the full package is generated from the development database and is emptied in the process — so far, the tables
notesandsong_propertiesremained filled, even though the associated songs and locations had long been deleted. Both are now being emptied, as well asphotosandpotential_ignored. Affected all versions up to and including 0.120; the update ZIP was never affected as it does not contain a database. - The build now fails if user data remains in the delivery database — including a warning for new, yet unclassified tables. Previously, the numbers were only output and not checked.
0.120 — Move sync points together & song start linked to it (2026-07-14)
New Features
- Move all sync points at once by one second. In the sync mode of the lyric window, right-clicking now has the submenu „Move All Sync Points“ with the entries „1 sec. earlier (−1 s)“ and „1 sec. later (+1 s)“. This allows you to correct a continuous offset when the text is consistently too early or too late without having to adjust each point individually. No sync point will move before the song start (at 0:00 it will be cut off). The menu is available as soon as sync points are set — even when right-clicking on an empty text area.
- Song start remains linked to the earliest sync point. The saved music start point of a song now automatically follows the earliest sync point (the beginning of the opener). Whether by „Move All“, single moving, deleting, or direct time editing — as soon as the earliest sync point moves, the song start is set to the same time. This way, the opener start and song start are always intertwined, which is especially correct for Singing Calls. The start countdown immediately moves with it and counts down to the new start time. When „Move All (±1 s)“ is selected, the song endpoint also shifts by the same amount, keeping the body length unchanged. Songs without a set start point (e.g., Patter without a body) remain unaffected — no start point is invented.
0.119 — Potential Dashboard restructured: Overview tab, workflow order & readability fixes (2026-07-08)
New Features
- New start tab „Overview“ in the Potential Dashboard. When opening the window, you now land first on an overview with buttons for all tabs, grouped by a sensible workflow. Each button jumps to the corresponding tab and carries a badge with the number of open points: a number for quick checks, a checkmark „✓“ when nothing is open, and „[ ? ]“ for the more complex file checks (No MP3 / Incompatible format) — they determine their actual number only when you actually open the tab, keeping the overview quick. The buttons automatically break to the next line in a narrow window.
- Two dependency chains are made visible with arrows. In the overview, large arrows indicate the order in which steps build on each other: the Patter chain „Without loop → Without BeatSnap → Optimize loop“ and the Singing chain „Without lyrics → Without song points → Without song start → Without sync points“. This makes it clear at a glance that, for example, sync points require a set song start.
- Sticky „⌂“ button on the left in the tab bar. A small house button at the very front remains always visible — even when you have scrolled far to the right through the tabs — and brings you back to the overview immediately with a click.
Improvements
- All potential tabs arranged in a logical order. Instead of a growing list, the tabs are now sorted into four groups: Base (applies to every song: No MP3, Incompatible format, No BPM, No genre, No quality, No ERR, Fill quality + ERR, Fill metadata), Patter chain, Singing chain and Maintenance (Empty locations, Orphaned history, Mass deletion). „No BPM“ is intentionally in the base group because it affects both Patter and Singing Calls.
- The scroll arrows of the tab bar are usable again. Since so many tabs no longer fit side by side, Qt displays scroll arrows (‹ ›). These were squished into a tiny, barely clickable area in the Windows 11 theme — they now have enough space and are normally operable.
Bug fixes
- Windows 11 theme: Menu and tab texts when hovered over were barely readable. When hovering (and for selected menu entries), dark text was on a dark blue background. The menu bar, context/dropdown menus, and all tab bars now display the text in white in this state — easily readable. This affects the entire app, not just the potential window.
0.118 — New „Without Song Start“ tab with CHECK verification marker · Wait overlay · „Without BPM“ slimmer (2026-07-07)
New Features
- New tab „Without Song Start“ in the Potential Dashboard. It lists all Singing Calls for which no music start point has been set yet — intentionally including those without stored lyrics, as the automatic detection (from 0.117) works purely on the audio track and does not need lyrics. Below are three buttons: „Analyze selected“ (only those marked in the table), „Analyze open“ (all still open candidates from the list) and „ANALYZE ALL“. The last button runs over all Singing Calls — even those with an already set start point — and overwrites existing values; that's why there's a clear safety prompt beforehand. For each recognized song, start and end is set (the end is rigidly derived from start + 448 beats). For 15 songs to be processed, as with the „Without BPM“ tab, the estimated total duration is first calculated based on a sample of five songs and displayed for confirmation; these five are saved along with it, not discarded. The analysis runs in the background so that playback does not stutter.
- „CHECK: START“: uncertain detections automatically land on a verifiable to-do list. In batch analysis, there is no one present to confirm each suggestion individually. To ensure that every Singing Call is equipped and the shaky candidates do not get lost, Callers Caddy proceeds as follows: The start/end point is set for all recognized songs set — the recognition reports whether it was certain or ambiguous for each song. Songs with ambiguous results additionally receive the new genre „CHECK: START“. The caller can filter the song list by this genre and specifically listen to the songs where the automation was uncertain — an automatically maintained check list, similar to the well-known „NEW“ genre for newly imported songs. The marker clears itself: as soon as the caller resets the beginning of such a song in sync mode (regardless of whether they accept the auto-suggestion or click manually), „CHECK: START“ disappears for that song automatically — the to-do list clears itself while you work through it. Similarly, a new batch analysis removes the marker when a song is recognized confidently this time. The manual way via the sync button never assigns a marker (there the caller sees the „Ambiguous“ warning directly and decides immediately). „CHECK: START“ is the first of a reusable series of such check markers called „CHECK: „.
Improvements
- While the automatic start/end recognition is running, a „Please wait“ overlay now appears (like with the loop finder). Previously, there was only a small status text, which could give the impression that one could continue working while the audio analysis for the sync points was still calculating. The overlay disappears automatically as soon as the result is available (or the confirmation dialog appears) or the analysis fails.
- „Without BPM“: Trial run only from 15 songs — and without double work. The preliminary time estimation (trial run with 5 songs) is now offered only from 15 songs to be processed; below that, the BPM determination runs directly through without detours. Additionally, the 5 songs from the trial run are no longer discarded but are immediately determined and entered — the actual run then only processes the remaining songs. This saves double analysis time for the sample.
0.117 — Automatic Singing detection · Stream protection for play rules · New „Without BPM“ tab (2026-07-06)
New Features
- Automatic detection of the beginning and end of a Singing Call. In sync mode, in addition to „Set start & end manually“, there is now the option „Automatically detect“: Callers Caddy analyzes the music and suggests the start and endpoint of the Singing Call body, from which the seven sections (fixed 7 × 64 = 448 beats) and the sync points are derived — this saves manual setting for hundreds of songs. Here's how the detection works: First, a beat grid is calculated and anchored to the BPM stored in the database — this tempo anchor prevents the grid from locking onto a subharmonic (half/double tempo) and thus creating impossible grids. For each beat, a beat-synchronized log-Mel-timbre (spectral shape), the energy, and a kick transient is determined. Through the timbre, a Foote-Checkerboard-Novelty arrangement edge the (change of instrumentation), because intro and outro sonically break with the body, even if the melody continues. A 8-prong comb specifically evaluates the position where an edge lies simultaneously at all eight section boundaries (c, c+64, …, c+448) — this is typical for the body and distinguishes it from random single edges. Then, a bewertet gezielt die Position, an der gleichzeitig an allen acht Sektionsgrenzen (c, c+64, …, c+448) eine Kante liegt — das ist typisch für den Body und hebt ihn von zufälligen Einzelkanten ab. Anschließend rasten ein Downbeat-Snap (Kick accent modulo 8) on the phrase „1" and a Chroma figure pair tiebreak against the common ±32-beat half-section alias one; a little calibration (+2 beats) compensates for the systematic click latency. The result always comes as a suggestion with confidence value (the comb margin, meaning the distance from the best to the second-best position) — never as a silent overwrite. The user sees the start and end and chooses „Apply“, „Set myself“ or „Cancel“; if the confidence is below the threshold determined by validation, an additional check note appears. The analysis runs in a background thread so that playback does not stutter. Consciously as Suggestion set: Depending on the music, it can be off by one or two beats and will then be briefly adjusted by hand — the time savings over the mass remains.
- New tab „Without BPM“ in the Potential Dashboard. It lists all songs for which no BPM is set or whose value is implausibly outside the Square Dance range (less than 100 or greater than 150) — all candidates for automatic BPM detection. Below are three buttons: „Detect selected“ (only those marked in the table), „Detect all empty“ (all without BPM) and „DETECT ALL“. The last button runs the BPM finder over the entire library and also overwrites already good values — that's why there's a clear safety prompt beforehand. For more than five songs, the estimated total duration is first calculated based on a sample of five songs and displayed for confirmation (same procedure as with the stack loop finder). The BPM detection runs in the background so that playback does not stutter.
- Existence check after the BPM run. Songs whose audio file can no longer be found in any music folder are now listed by name at the end, instead of being silently skipped and remaining unexplained as candidates. The note refers to the tab „Without MP3", which is intended for cleaning up such orphaned entries.
Improvements
- The Auto Loop Finder now holds back the song until it is finished. If a loop is automatically searched for at the start of playback, the song only starts audibly when the analysis is complete — the loop is thus guaranteed to be set when the music plays.
- BPM detection more precise: Search range narrowed to 100–150 BPM. The Auto BPM Detector (Onset-Strength-Envelope + Comb-Filter-Bank) previously searched in a wide tempo range and occasionally locked onto a subharmonic (half/double tempo — e.g., „Waltzing Matilda“ mistakenly identified as a 90 BPM waltz). The narrower range covers the typical area for Square Dance (less than an octave, 150/100 = 1.5) and reliably eliminates these octave errors. Both the Auto BPM detection, the new body detection (as a tempo anchor), and the tab „Without BPM“ benefit from this equally.
Bug fixes
- No more stuttering at the start of playback when a rule simultaneously changes the layout. Rules that immediately trigger a layout change when starting or resuming a song (e.g., dual view with lyrics and sequences displayed) caused the just-starting audio stream to stutter audibly — especially noticeable on less powerful computers. Such stream-endangering actions now finish first (while silence still prevails), and only then does playback start audibly. Rules without layout changes start as before without any delay.
- Auto Loop Rule: empty preset field. When setting up the rule „Auto-Set Best Loop“, the field for the loop preset remained empty as long as the loop finder tab had never been opened before. The selection is now always filled regardless; additionally, it correctly displays the recently renamed default value again (existing rules with the old name continue to function unchanged).
0.116 — Evening Planner: Fine-tuning & Shuffle · Loop Finder: new strategy · Statistics: Multiple selection (2026-07-05)
New Features
- Evening Planner: Shuffle mode for song suggestions. A new toggle button in the top bar controls the random tiebreaker: If multiple songs have the same score, the top one is chosen randomly instead of always alphabetically when shuffle is active (stable within a session, so it doesn't jump with each rebuild). The switch shares the same setting as the tiebreaker in the song list and planner and remembers its state across restarts.
- Tiebreaker setting is now remembered permanently. The random tiebreaker in the song list and planner was reset to „on“ after each program start — its state is now saved and restored at the next start.
- Auto Loop Finder: new strategy „Best multiple of 8 beats“ – Addition to the previous „Best multiple of 64 beats“. Useful for music outside the classic Square Dance grid, where a fixed 64-beat phrase length doesn't fit, but a clean, beat-accurate loop point is still desired.
- Statistics widget: Multiple selection in all 3 columns (TOP/FLOP/Never played) via Shift-/Ctrl-click. „Add to playlist“ and „To notes“ now apply to the entire selection; Quality/ERR ±1 are intentionally grayed out for multiple selection, as there is no uniform basis for it.
Improvements
- Evening Planner is now a free window and no longer docks unintentionally to other areas when moved.
- Redundant apply button (green check) in Evening Planner removed. Its task – transferring confirmed songs to the playlist – is fully taken over by the „Apply to playlist“ button in the bottom bar (including safety prompt for unconfirmed songs).
Bug fixes
- Evening Planner: Songs with both type markings (Patter and Singing) now land in the playlist with the correct type. Previously, a song planned for a Singing slot was incorrectly recorded as Patter (P) when transferred. Now it retains the role of its slot (S or P). The path „To Notes“ was not affected by this.
0.115 — Rules: Multiple selection for export, duplicate & delete (2026-07-02)
New Features
- Rule list now supports multiple selection (Shift/Ctrl-click as usual).
- Export only exports the selection, if something is marked — without selection, everything will be exported as before.
- Duplicating duplicates all marked rules at once (system and user rules as new user rule copies).
- Deleting deletes all marked user rules at once, still with a security prompt (now with count for multiple rules). System rules in the selection are ignored as they can never be deleted.
0.114 — Sync points: status color & robust against text edits (2026-07-02)
New Features
- The sync button now shows progress by color: Red, as long as no sync points have been set for the current music/lyric variant; normal (theme standard) while the sync mode is active (points are being captured); green, once start, end, and at least one sync point are present — a sign that there's nothing more to do here.
Bug fixes
- Sync points now survive editing the lyric text: Previously, sync points (character positions in the text) were silently skipped during the next rendering after deleting/changing lines in the editor, as soon as their position slipped behind the (shorter) text end — visibly, this appeared as a complete data loss, even though the values were still in the database. Callers Caddy now compares the text before and after an in-app edit by diff when saving: Sync points in unchanged sections remain exactly preserved and are automatically updated, only points on actually deleted/changed lines are lost (they need to be set again there).
0.113 — More robust lyrics display & countdown fine-tuning (2026-07-01)
Bug fixes
- Line breaks no longer break extensively with faulty lyrics HTML: Some cuesheets exported from Word contain unclosed formatting tags (e.g., an orphaned
<nobr>). This previously caused the entire remaining song to display without automatic line breaks — the text overflowed instead of wrapping. Callers Caddy now detects this when loading, warns, and offers to permanently fix the file. For RTF/DOCX (where the HTML is just a derived representation, not a separate user file), it is automatically cleaned up silently, without prompting.
Improvements
- Start countdown overlay: removed unnecessary overhead. The overlay previously reset the window geometry at every 50ms UI tick and brought itself to the foreground — this now only happens when it first appears or when the main window position has actually changed. The number display remains smoothly fluid (continues running on its own pulse timer).
0.112 — Potential window: Tabs for missing song and sync points (2026-06-30)
New Features
- Two new tabs in the potential window – right behind „Without Lyrics“:
- „Without Song Points“: lists all Singing Calls (with lyrics) where song start and end both are not set yet.
- „Without Sync Points“: lists all Singing Calls (with lyrics) that still have no sync points have.
- For Double click you jump directly into the lyrics window, and mouse + focus are immediately on the sync button – the next step is readily available without searching.
- Like in „Without Lyrics“ with a count badge in the tab and an „Ignore“ function. Only songs with lyrics are intentionally listed, as the points cannot be set otherwise (songs without lyrics remain under „Without Lyrics“).
Bug fixes
- Win11 Theme: Plus/Minus buttons of the number fields always visible. The up/down buttons in input fields (e.g., tempo) were previously only visible when hovering with the mouse. Now they are permanently visible and darken slightly on hover.
0.111 — ZIP import: more variants recognized, better titles & remembered folder (2026-06-30)
Improvements
- ZIP import recognizes more key and voice variants: Packages in the Rhythm-Records scheme (e.g., „Jolene“, RR 409) are now correctly broken down — Female Vocal, Male Vocal and Harmony 1/2/3 land as named variants instead of multiple times as „Instrumental“. Labels with key or index abbreviations like
RR 409ForRR 409h1are reliably recognized as labels. - Clean song titles from the package instead of the ZIP file name: For packages with cryptic download names (e.g.,.
ego_112_-_go_tell_it_on_the_mountain,GP509MP3_…_0e76qf) or pure label names (STING 22209) CC now takes titles and labels from the main MP3 included. This will pre-fill, for example,. „Go Tell It On The Mountain / EGO 112" or „I Think We’re Alone Now / STING 22209" instead of the raw file name.
Bug fixes
- ZIP import remembers the last used folder: The file dialog for ZIP import opens again where it was last imported. Until now, the path was only saved for file/folder imports, not for ZIP imports — the dialog jumped to the wrong place every time.
0.110 — Start countdown, song frame in player & sync fine-tuning (2026-06-27)
New Features
- Start countdown before the song begins: A large, semi-transparent full-screen overlay counts down the beats before the singing starts — in time with the music and briefly flashing with each beat. This way, you know exactly when the first call comes without looking at the clock. The last two beats remain intentionally silent (no overlay), so your view is clear when it starts.
- Visually — the countdown integrates not into the audio playback and also appears over floating windows.
- Requires a stored BPM and a saved song start (from auto-sync, see below). Automatically follows the tempo controller.
- Can be turned on/off via Settings → Display → „Show start countdown“ (enabled by default). Fully translated (DE/EN/JA).
- Song frame in the status bar player: The seven section strips in the mini-player of the status bar are now exactly positioned between the saved song start and end — the bar thus shows the actually sung area instead of a generic division. If no times are saved, the previous display remains unchanged.
- Auto-sync uses saved start/end times (BL-161): If start and end times are already set for a song, the first sync offers three options: „Calculate Now“ (derive the seven sections immediately from the saved times — without any running along), „Measure Again“ or „Manual“ set.
Improvements
- Synchronously scrolling lyrics: current line centered: The line just sung now locks into the middle of the lyrics window (previously in the upper quarter) — equal preview down as context up.
Bug fixes
- No more shaking during auto-scroll: Small backward jumps due to playback position measurement inaccuracies are now suppressed, so the text runs smoothly. Real jumps (e.g., repeated sequence or loop) are still tracked cleanly.
- More stable sync markers: Markers that would mathematically lie outside the text are skipped instead of being misplaced; an additional safety net completely removes any leftover marker signs.
- More accurate automatic section calculation: A figure section now starts at its header line (instead of at the first content line), and the end anchor sits just before the section end — so the calculated sync points are more precise.
- Clean status bar with changing buttons: Hidden buttons (e.g., the sync buttons in auto-sync mode) no longer take up space — no gaps or overlaps when showing/hiding.
0.109 — Lyrics-Sync points, theme „Fire“ & more stability (2026-06-25)
New Features
- Synchronously scrolling cuesheets over sync points (BL-160): Automatically scrolling lyrics/cuesheets now reliably stay in time with the music. In the new sync mode you can firmly link individual lines of text to a song position (anchor). Between two anchors, the auto-scroll interpolates, and at each anchor, it catches itself again — so the display runs synchronously throughout the entire song.
- Set anchors are displayed directly in the text highlighted in yellow.
- In Rewinding (e.g., repeated sequence) causes the display to pause briefly instead of jumping back.
- In sync mode, there are Rules and history logging paused, so that setting the points doesn't trigger anything unintended.
- Automatically capture sync in 2 clicks (BL-161): When synchronizing a song for the first time, Callers Caddy asks if the sections automatically automatically. In automatic mode, you only mark Start of Part 1 and End of Part 7 — CC distributes the seven sections itself. The anchor line's position in the window can be fine-tuned if needed via INI (
lyric_sync/viewport_frac). - New theme „Fire“: dark theme with bright fire-orange accents. Selectable via Settings → Display → Skin / Theme.
- Crash notice: „Open folder“: The notice displayed at startup about a crash log now additionally offers „Open folder“, to jump directly to the log directory (
logs/crashes).
Bug fixes
- Crash fixed when quickly stepping through with Auto-Loop (TIC-0029): With the active rule „set best loop automatically,“ quickly switching through multiple songs could crash the app with „QThread: Destroyed while thread is still running.“ The lifecycle of the loop finder thread is now securely managed.
- No more crashes on exit (TIC-0026): When closing, a recently edited input field could still trigger an auto-save after the database was already closed (
AttributeError). Auto-save and volume-save now check if the database is still open.
Translations
- English and Japanese texts added for the three most recently added settings: Notification sound (timer overflow), Volume notification sound and „Automatically set filter to dance program“ (Sequences).
0.108 — Secure ZIP import & new songs automatically marked (2026-06-24)
New Features
- ZIP-Label-Import: Completeness Check + Learning Recognition (BL-157): The import of label packages is now secure with everything in the ZIP — and gets better with maintainable lists for each entry.
- Everything remains visible: All music files go into the Song Area, all lyrics into the Lyric Area, everything else (e.g. Word accessories) with justification in a „Other“ list. At the top, a balance, shows that every file is accounted for. This way, a package no longer splits into multiple „songs“ just because an original track or variant has a different name.
- Four maintainable lists in one dialog (Variant abbreviations, label directory, accessory patterns, role words): Through „Edit lists…“ you maintain what CC Songs recognizes. Your entries remain intact during updates, new supplied standards are added automatically (nothing gets overwritten). Via „Import list…“ you can add a colleague's collection incrementally.
- Variants recognized better: A variant abbreviation is now shown in parentheses
(V), directly next to the label number (WM 002v) and as a free word at the end of the file name (… VJ) recognized — as long as it's on your list. Flip-side numbers like509aremain untouched. - Standard song type in the preview window is now Singing (label packages are usually Singing Calls).
- Note: Lyrics in the old
.docformat cannot be displayed by CC (only.docx); such files appear visible under „Other.“. - Genre „NEW“ for newly added songs (BL-040): Every song that comes into the database – via import, ZIP label import, „New“ button, or by loading an unknown MP3 into the player – receives automatically the genre „NEW“. This way, you can see at a glance what has been added recently: just look at the song list (or in the planner) for the genre „NEW“ filtering.
- The caller decides for themselves when a song is „integrated“ and removes the „NEW“ tag as usual through the genre dialog in the song record.
- „NEW“ behaves like any other genre (filtering, renaming, managing in the genre manager).
- Automatically recognized genre suggestions (from the file name) come in addition to the „NEW“ tag – they no longer overwrite it.
- Migrated old stock (from the old version / SqView) is intentionally given none „NEW“, as these are not new arrivals.
Bug fixes
- ZIP import preview: Mouse wheel no longer changes selection fields: When scrolling up and down through the preview window, the value of a selection field (e.g., song type) previously jumped as soon as the mouse pointer hovered over it. The mouse wheel is now disabled for selection fields (song type & co.) in the window — just like in the other dialogs — and instead scrolls the window content.
0.107 — ZIP label import, more reliable lyrics matching & audio standard fix (2026-06-23)
New Features
- ZIP import for label deliveries (BL-157): In the import dialog, there is now the source „ZIP package (label delivery)…“. Callers Caddy unpacks the ZIP(s), automatically recognizes related songs, and shows a preview window for checking and adjusting.
- Main MP3 + variants: The instrumental version (without modifier in the filename) is suggested as the main song; additional tracks (e.g. „(V)“ = Vocal, „(NL)“ = No Lead) are shown as Variants offered. The order can be changed via Drag & Drop (top = main song).
- Lyrics in multiple formats: Included lyrics (HTML, PDF, DOCX, RTF, TXT) are found; you can select/deselect, set the primary file, and edit any label.
- Editable abbreviation table: By using „Edit abbreviations...“ you can manage the abbreviations (V→Vocal, NL→No Lead Instrument, NB→No Backup Vocals, NBL→No Backup Vocals/No Lead, …) yourself. The pre-filled variant labels are derived from this; unknowns are taken as is and can be overwritten.
- Preview Listening: Each music track has a preview column (▶/⏸) in the list — so you can directly play and compare instrumentals and variants before importing. The preview is „silent“: it does not trigger — like the preview in the Loop Finder — neither rules nor history tracking out.
- When adopting, the main MP3 + primary lyrics go into the master data, all other files as variants (Extended Data) of the song.
- Recognizes both common label naming schemes: Modifier at the end (
Title - LABEL (V)) and before the label (Title (V) - LABEL).
Bug fixes
- Lyrics files were not imported with the song if the filename did not exactly match the MP3 – fixed: Previously, a lyrics file was only automatically linked during import if its name exactly matched that of the MP3. However, label packages (e.g., as Word/DOCX files) often name the lyrics differently than the music file – they were overlooked as a result. The import now compares names tolerantly (as did the migration from the old version):
- Label at the end is recognized and ignored – even without surrounding spaces (e.g., MP3
Achy Breaky Heart-RYL 555, LyricsAchy Breaky Heart.docx). - Works in both directions: no matter if the label is attached to the MP3 or the lyrics file.
- Differences in spelling/special characters are handled through a normalized comparison.
- If multiple matching files are available, the higher quality format wins (RTF over HTML over Text over DOCX over PDF). An exact name match always takes precedence over a simply „label-cleaned“ one.
- No more silent starts on the wrong output: On the very first start, Callers Caddy selected the output device based on backend priority (WDM-KS over WASAPI over MME) — and often ended up with the digital SPDIF output, so nothing could be heard. Now the app starts with the Windows default playback device. („System Standard“), which is practically always audible. If you want lower latency, you can specifically select a device in the status bar (WDM-KS/WASAPI, optional Exclusive). (Previously saved device selections remain unchanged — you may need to select „System Standard“ once.)
Changed
- Import dialog adjusted: First, the source is selected (file / folder / ZIP). For file/folder, copying and song type come afterwards (type at the very end). ZIP packages go directly to the preview — no unnecessary preliminary dialog anymore. (Also fixes the issue where a pre-selected type setting did not match the ZIP preview.)
Technology
- New GUI-free analyzer
zip_import.py(can be tested independently) + preview dialogzip_import_dialog.py. Unpacking/analyzing runs in the background thread (audio priority is maintained), with performance benchmarks for unpacking, scanning, and committing. The existing import has been refactored into a reusable core (_import_single_audio); the normal import behavior remains unchanged. Fully translated (DE/EN/JA). - Lyrics matching during import: new helper
_build_lyrics_map()and revised_find_and_import_lyrics()— uses the proven 4-stage matcher from the SqView migration (SqViewReader.match_lyrics) plus label recognition_parse_filename(); the migration itself remains unchanged.
0.106 — Central icons, colors from the theme (2026-06-18)
New features / improvements
- Unified icon concept for all themes: All icons are now centrally located in a common
images/-folder instead of being duplicated in each theme. Geometry and design are maintained centrally; the color comes exclusively from the theme values. - New theme color key
icon_color(in addition to the existingtitle_icon). Icon colors can now be controlled per theme purely throughskin.json— completely without custom image files. Creating custom themes has become significantly easier. - All themes use the same icon set (modern, outline style); previously differing designs (win11, elegant) have been aligned.
- Semantic accent colors remain fixed (highlight yellow, text color red).
Bug fixes (theme refinement)
- Spinbox/combobox arrows were dark on a blue button background in light themes (light/win11) (poor readability) — they now follow
icon_colorand are white there. - Splitter line (e.g. planner between pool and playlist) was unstyled and appeared almost white — it now uses the theme separator color like the dock separators.
- „…“ buttons for file dialogs did not show the three dots (button padding cut off the text at fixed narrow width) — own narrow button variant, dots visible again.
- Notes widget: Zoom icons are displayed again (now using the central icon cache).
Technology
SkinManagercolors the central template SVGs when loading the theme with the theme colors (temp cache); QSS references icons via{{icon_path}}, code viaskin_mgr.icon_dir. Documentation:1_Source/docs/17_theming_icons.mdand `1_So
0.105 — Japanese as a third language (2026-06-18)
New Features
- Japanese programming language (日本語): Callers Caddy can now be switched to Japanese. The entire interface (menus, dialogs, tooltips, messages, tutorials, migration, and class designer — around 1,460 texts) has been translated.
- Selection on first start (third button „日本語で開始“) and anytime via Settings → Language or the language menu.
- Square Dance terminology remains intentionally in English (e.g. Patter, Singing Call, Tip, Loop, BPM, Pitch, Beat Snap) — just like it's common internationally and among Japanese Callers.
- German and English remain unchanged: The Japanese translation has been added purely additively, existing languages have not been altered at any point.
Improvements
- Lyrics toolbar breaks on narrow dock: The buttons at the top of the lyrics window (Auto-Scroll, Auto-Size, Auto-Width, Zoom, Edit) derive their width from their content and wrap to the next line when the widget becomes narrower than the button row can handle — instead of being cut off or enforcing a minimum width. Same wrapping behavior as already seen in song list and playlist.
Technology
- Log files remain language-neutral readable: Diagnostic/support logs (crash logs, rules.log, perf_log.txt, system report) were and remain independent of the UI language (technical/English). The migration detail log will now intentionally always be written in English (including live display during migration), so that it remains readable for support regardless of the chosen language — the rest of the migration tool's interface remains in the user's language.
0.104 — Bulk deletion of large song amounts (2026-06-17)
New Features
- New tab „Bulk Deletion“ in the potential window (BL-148): Removes a large number of songs from the database in one go — intended for cases where too many songs were accidentally loaded (e.g. a wrong folder during import).
- Multi-sortable list with columns Type (P/S/PS), Added (Date), Title, Label, Genre, ERR, and Quality — each column sortable by clicking on the header to quickly isolate the wrong momentum.
- Convenient multi-selection: Shift+Click marks a contiguous range, Ctrl+Click individual rows, Ctrl+A selects everything in the view.
- A single security query for the entire process (no follow-up per song), after which it will be deleted without further interruption.
- History data: If playback histories are available for the selected songs, you will be asked once whether they should be deleted as well (default: No — the history can be cleaned up later via „Orphaned History“).
- The music files on the hard drive will not be touched.
Technology / Performance
- The song list of the tab will only be loaded when opened (no start overhead) and the deletion runs in the background thread, so that a running song is never interrupted. With an active performance log, measurement points (DB query, genre assignment, table construction, deletion process) are logged.
0.103 — Lyrics: Display Word- (DOCX) and PDF files (2026-06-16)
New Features
- Display lyrics as Word document (.docx): Lyrics and cue sheets that are available as Word files can now be directly linked to a song and displayed in the lyrics window – including font sizes, large centered title, indentations, bold/italic/underlined text, and colored text and background highlights (e.g. the typical yellow/colored Tag highlights). No additional software (no Word) is needed.
- Display lyrics as PDF: PDF files can also be linked and displayed as lyrics – as a quick text reading view of the call text. Note: PDF is intentionally displayed only as text; colored highlights and the exact layout from the PDF are not retained. Those who need full formatting with highlights should use Word, RTF, or HTML.
- Editing Word/PDF lyrics: Word and PDF are purely display formats. If you want to edit such lyrics, Callers Caddy offers to create an editable HTML copy from it (just like before with RTF and Text). The original file remains unchanged.
Improvements
- File selection, automatic lyrics import when adding songs, and migration from the old version now also recognize
.docx– and.pdf-files.
0.102 — Startup issues fixed: „already running“, audio on ARM-Windows, theme switch (2026-06-16)
Bug fixes
- „Callers Caddy is already running“ despite the program being closed – fixed: In an installation in protected folders (e.g.
C:\Programs\…) Callers Caddy could not start – it showed the message that the program was already running, even though it was closed. The only workaround was to „Run as Administrator“. The cause was the internal lock file, which was placed in the program folder where normal users are not allowed to write. It is now located in a user-owned temporary folder that is always writable – the admin trick is no longer necessary. Multiple separate installations do not block each other. - Crash on startup on Windows-on-ARM (e.g. Apple-Mac with Parallels) – fixed: If Callers Caddy ran on an ARM-based Windows (like Windows 11 in Parallels on a MacBook), it crashed immediately on startup with
error 0x7ean error, because the audio system incorrectly looked for an ARM variant of the audio library that is not provided. Callers Caddy now correctly uses the supplied 64-bit library (via Windows emulation) and starts in this environment. Additionally, a non-loadable audio system no longer abruptly crashes the startup at this point, but is handled cleanly instead.
Improvements
- Theme/Skin now switches immediately: A change of „Skin / Theme“ in the settings is applied immediately – a restart is no longer required.
0.101 — Understandable message instead of crash when the audio system is blocked (2026-06-15)
Bug fixes
- No more raw crash at startup when the audio component cannot be loaded: On some computers, Callers Caddy crashed directly at startup with an incomprehensible Python error window (
PortAudio library not found,error 0x7e). The cause is almost always the computer, not the program — usually an antivirus scanner that blocks or quarantines the audio filelibportaudio64bit.dllor a downloaded ZIP file that wasn't „approved“ before unpacking (Windows block). So far, this error occurred so early that no hint window was possible. - Plain text hint with solution path: If the audio system cannot be loaded, a clear window now appears that names the likely cause and explains step by step how to fix it (antivirus exception or releasing ZIP before unpacking).
Improvements (Diagnostics)
- Crash logging now takes effect from the very first second: The crash logger is now activated very early — even before the audio components are loaded. This means that crashes at program startup are now written to a log file (
logs\crashes) that previously went unnoticed. - Targeted audio diagnostics: If loading the audio system fails, Callers Caddy automatically creates a diagnostic file. It checks, among other things, whether the audio file is still present and readable — this helps to determine whether the antivirus has deleted/moved it to quarantine or whether it is present but blocked (which the Windows error code alone does not reveal). The notification dialog indicates the file's location for follow-up with support.
- Detection of special characters in the installation path: The diagnostics now also check if the program path contains special characters (e.g., umlauts or diacritics in the username like
C:\Users\Tomáš\…). Such paths are a known, region-dependent cause of the audio library not being able to load under Windows — the diagnostics will point this out directly (solution: install in a path without special characters, e.g.,.C:\Callers_Caddy).
0.100 — Relative music paths: scattered libraries across multiple folders (2026-06-15)
New features
- Songs can now be placed in any number of nested subfolders: Until now, Callers Caddy only remembered the plain filename for each song and searched for it directly in the (up to four) music paths. If you sorted your music into many subfolders, you hit some limits. Now, for each song, the relative path within its music path is stored (e.g.,.
Singing Calls/Country/song.mp3). So the four music paths still suffice as roots — the subfolder structure beneath can be as large as you like. - Up to four root paths, even on different drives: The four music paths are considered independent roots and can be on different drives (e.g., C:, D:, E:, F:). A song is stored relative to its music path; when playing, the paths are tried in order.
- New tool „Re-index Music Library“ (Menu Paths): Searches all configured music paths recursively and automatically elevates existing songs whose file is in a subfolder to the appropriate relative path — this makes previously unfindable songs playable again. Runs in the background without disturbing a playing song. At the end, a report appears (updated / ambiguous / still missing). Files with the same name in multiple folders are deliberately not guessed but reported for manual assignment.
- Import retains the folder structure: When importing „leave in place“, the selected root folder is entered as the music path and each song is saved relative to it — including subfolders.
Improvements
- Uniform, portable path storage: Relative paths are uniformly stored with a slash
/(instead of mixed slashes). A one-time database migration automatically cleans up older entries. This makes the database more robust when moving to other computers or USB sticks. - File selection standardized everywhere: The file button in the song record, the variant management, and the lyrics selection now determine the relative path uniformly against all music paths.
Migration tool
- Copying or linking selectable: As with normal import, the migration now asks whether the music files should be copied to the destination or left in place and only linked. Linking saves space and is ideal for large, scattered libraries — the source folders are automatically entered as music paths in the target configuration.
- Root directory of the music library: The migration queries the root directory and saves each song relative to it — the subfolder structure remains intact.
- Subfolders are fully searched (CC1): The Callers-Caddy-1.0 migration now recursively searches the music folders including all subfolders (previously only the top level).
- No more lost files with the same names (SqView): Files with the same name in different folders were previously lost. Now both are retained; if there are multiple hits, the appropriate file is chosen based on the original path.
0.99 — Migration detail log and more robust SqView takeover (2026-06-14)
Bug fixes
- App reliably restarts after a crash: If Callers Caddy crashed, an internal lock file was left behind, blocking any further start with the message „Callers Caddy is already running“ — even a computer restart didn't help, as the file remained on the hard drive. The app now checks at startup whether the registered lock owner program instance is still running and automatically removes orphaned locks. If an instance is still running, the notification message appears as before.
Migration tool
- Detailed migration log: With every migration (SqView as well as Callers Caddy 1.0), a log file is now created in the target folder (
migration_log__). It logs step by step what was done for each song — record transferred, tags transferred, lyrics found and entered, MP3 found and linked — and is available for review at any time after the migration. The file is continuously written, so everything up to that point is preserved even in case of an interruption. - Three levels of messages: Each step is classified as
DONE,WARNINGorERROR. At the end of the log, there is a summary, categorized — easily recognizable at a glance what was successful and what wasn't. - Searchable double key (severity + topic): Each log line begins with a language-independent key of severity and topic, e.g.
ERROR MUSIC,DONE LYRIC,WARNING LYRIC,DONE LOOP. This allows specific topics in the log to be found through full-text search, regardless of the language of the description. - Clean live display: During migration, the window only shows the phase progress, all warnings/errors, and the final summary. The complete step-by-step list goes into the detailed log. A new button „Open Detailed Log“ opens the log file directly — even after an error interruption.
- Missing files are recognized as errors: If a file is present according to the source system but cannot be found during import (MP3 or lyrics), it now appears as
ERRORinstead of going unnoticed. The conscious blind import without a music folder remains a warning. - Lyrics assignments from SqView are prioritized: Explicit song-to-lyrics links from SqView (marry table) are now evaluated first before reverting to name-based search. This keeps manually maintained assignments intact.
- Log language follows the chosen language: The detailed log is written in German or English — depending on the chosen language. The level identifiers
DONE/WARNING/ERRORremain language-independent, so the log remains searchable.
SqView import: more complete and accurate transfer
- Entire song library is transferred: Previously, only songs from the current lists and playback history were imported (~1000). Now the complete song library from the source is lifted — including all songs with set loop markers that were no longer in any current list. Songs whose audio file can no longer be found are logged as blind entries with error notes and can be activated later via file import.
- Correct Patter/Singing classification: The classification as Patter, Singing, or both previously depended solely on the folder name — entire folders (e.g. „Singing Calls“) were incorrectly recognized as Patter. New rule: If loop markers are set, it's a Patter; if lyrics are present, the Singing marker is set; the folder path is now only considered as an indication. Songs that fulfill both criteria automatically count as Patter AND Singing. Without any signal, a song is classified as Singing.
- Apostrophes in titles are cleaned up: Song titles with apostrophes (e.g. „Ain’t Misbehaving“) were taken from the source with a placeholder special character. These are now automatically converted back to a normal apostrophe during import. Finding the associated audio and lyrics files works regardless of the spelling.
- Lyrics assignment from the source preferred: Explicit song-to-lyrics links from the source are used first; only if none exist does the name-based search apply.
0.98 — Edit lyrics directly in the app (2026-06-08)
New features
- Lyrics editor in the lyrics dock: Lyrics can now be edited directly in Callers Caddy — no external Word or editor session needed anymore. A new pencil button (✎) on the right in the lyrics toolbar toggles between display and edit mode. Alternatively, a double-click on the lyric text activates edit mode.
- Full rich text editing: In edit mode, a second toolbar appears with all important formatting — paragraph format (Normal / Heading 1–3), font size (6–96 pt), bold, italic, underline, font color, and background color (highlight). This allows you to highlight tag, break, and closer lines as you would like to see them in live operation.
- HTML as a uniform target format: When saving, the file is always stored as HTML. HTML covers all requirements (headings, formatting, font sizes, colors, background colors) losslessly and can be further edited by any browser or editor.
- Original files remain untouched: RTF and TXT lyrics are NEVER overwritten when editing. Instead, Callers Caddy creates a new
.html-File next to the original and pulls thelyrics_file-Entry of the song to the new file. The original remains as a backup in the lyrics folder. A short info message indicates this after the first save. - HTML originals will be overwritten with backup: When saving an HTML lyrics file for the first time, a
.bak-Backup of the original file is automatically created next to it — in case you need the old version later. - Keyboard shortcuts:
Ctrl+Ssaves and exits the edit mode,Escdiscards the changes (with a prompt if something was changed). - Safety when changing songs: If you change the song while lyrics are still being edited and not saved, you will get a prompt „Discard changes?“ — this prevents accidental loss.
- Font size is immediately visible: If you change the font size in edit mode using the spinbox field (arrow keys or input), you see the change live in the text. Without selection, the new size applies to the entire document; with selection, it only applies to the highlighted area.
- Per-word font sizes remain visible: A deliberately larger word (e.g., a particularly emphasized part in the lyric) remains visibly larger in the lyrics display after saving. Previously, font size specifications were standardized during display — not anymore.
- Zoom and Auto-Width scale the entire document proportionally: Even if individual words have different font sizes, the zoom buttons and auto-width scale the entire document proportionally — the size difference between highlighted and normal areas remains consistent at every display size.
- Auto modes make sense in edit mode: Auto-scroll and auto-size are disabled during editing (they would move the cursor or cause the text to jump while typing). Auto-width and manual zoom remain available — they only change the display, not the saved sizes. After saving, all modes are active again.
- Icons in all skins: The new toolbar buttons (pencil, save, B/I/U, font/background color, discard) are available as SVG icons in each of the four provided skins (Default, Elegant, Light, Win11). The icons follow the established skin pattern and adapt to the selected theme.
0.97 — Pitch change without delay, custom timer sound and label in the player (2026-06-03)
New features
- Custom sound for timer overflow (BL-137): Instead of the system beep, an MP3 or WAV can now be played when exceeding the pattern/singing time — for example, the famous donkey sound of a fellow caller. The sound is mixed into the ongoing audio stream (same output, same device, no second stream) and does not disturb the music. Configured via Settings → Audio: „Notification sound (timer overflow)“ with file picker and custom volume slider. If no path is set, the previous double beep remains active. Alternatively, the sound can also be specified individually for each rule (parameter
soundin thesystem_ping-action) — this allows you to distinguish patterns and singing with different tones. - New rule action „Play sound“: In the rule editor, the new action appears in the group „Info & Warnings“ directly above „System Ping (Beep)“. You can select an audio file via a file picker, and the volume is adjustable per rule. The file is mixed into the ongoing stream — no second channel, no dropouts in the main song.
- Record label in the player (BL-138): The record label of the currently playing song (e.g. „DGR 014") is now displayed at the top right in the player directly above the status — same font, no extra spacing. It will be hidden if no label is maintained.
- Rules in Loop-Finder preview paused: During the preview in the Loop-Finder (Audition), all Rules are completely disabled. This means Auto-Advance or other song_stopped Rules won't trigger at the end of the Audition. After finishing the Audition, Rules run normally again. Technically solved through a central suspend/resume mechanism in the Rule Engine — reusable for future preview functions.
Improvements for live operation
- Pitch slider now responds immediately: If you moved the pitch slider during playback, you previously heard the new pitch only after several seconds — and during the transition phase, the tempo was noticeably „sluggish“ (about 20 % fluctuation over 4 seconds). The audio engine now places the resampling behind the WSOLA stretcher (SoundTouch architecture for rate > 1), making pitch changes audible at the speaker within milliseconds, and the tempo practically stays on track with the change. Tempo slider (
set_today_tempo,set_tempo) remains unchanged according to AR-021 pattern. Measurement-wise: Carrier settling time from >3000 ms to 6 ms, RMS deviation from 188 Hz to 0.77 Hz.
Under the hood
- PitchShifter completely overhauled: Instead of block-wise FFT resampling, now a stateful Cubic-Hermite interpolator (Catmull-Rom, 4-point kernel) with fractional read position and 3-sample tail across calls. Pitch changes at runtime occur without reset/flush, only the ratio parameter is changed — similar to SoundTouch’s RateTransposer.
- Pipeline order: Stretcher now receives original audio (previously: pre-resampled audio in a 5-second buffer, which collided with the pitch change using the new tempo parameter). Resampling runs in the audio callback behind
stretcher.retrieve, with carry buffer for variable output lengths. - Diagnosis capture: New engine methods
start_output_capture/stop_output_capturefor diagnostic tools. In normal operation, a singleis None-Check per callback, no performance impact. Test tools in1_Source/src/tools/pitch_transition_test.pyandpitch_transition_analyze.pyfor AM-modulated sine measurements (carrier shows pitch, envelope shows tempo via zero-crossing analysis). - Rule engine suspend/resume: New API
rule_engine.suspend(reason)/rule_engine.resume(reason)and context managerwith rule_engine.suspended("xy"):. Counter-based, nestable — multiple simultaneous suspend calls only resolve when all resume() have been called. During the suspend, all triggers (exceptplay_timer) are logged in rules.log asSUSPENDEDlogged. - Settings dialog (BL-129): new fields appear automatically. The dialog now enumerates not only existing INI keys but also all keys from
SETTINGS_META— even if they have never been written. New widget typefilefor file picker (with configurable audio filter).
0.96 — Manage sequences and unified import (2026-06-01)
New features
- Universal sequence import (BL-098): A new menu item „Sequences → Import sequences...“ replaces the four previous import methods (MDB, JSON, CSDS, Free text). You simply select the file, the dialog automatically recognizes the format (file extension + content sample), shows a live preview of the first three sequences, and reports how many sets were recognized. The format can be manually overridden if needed. Multi-file selection works for JSON, CSDS, and Free text — all files are processed in one go. The old single entries have disappeared from the menu; the underlying routines will remain as a safety net until 1.8.2026 (BL-135).
- Free text format with three variations: The free text parser now understands (1) one sequence per line with comma-separated calls, (2) one call per line with a blank line as a separator between sequences, (3) like 2 but with
,or;at the end of the line. Additionally, Ceder website headers (... ID= Print) are recognized as sequence separators — so you can directly copy-paste and import the choreography database collections. - Bulk values or from the file (Type + Difficulty): For JSON and CSDS imports that provide type and difficulty per sequence, you can choose per field: either the bulk value set in the dialog for all sequences, or the values from the file (with bulk as a fallback if the file does not provide anything for a single sequence).
- Duplicate detection during import: Before writing, the importer checks via a 15-field comparison whether the sequence is already in the database or appears twice in the selected files. By default, this is enabled; the status line reports „X recognized — Y new, Z duplicates“. This saves you from having to clean up later via the deduplication dialog.
- Delete sequences (BL-136): Right-click on a sequence in the sequence list → „Delete“. You can also select multiple sequences (Ctrl-/Shift-click) and delete them together — either via the right-click menu or through the new „Delete“ button below the table. In the detail window (SequenceView), there is also a delete button in the navigation bar; after deletion, the next sequence from the filtered list automatically moves up. Each deletion prompts for confirmation before proceeding, with singular or plural text depending on the selection.
Improvements for live operation
- Lyrics automatically adjust after song change: Those who have „Auto-Size“ or „Auto-Width“ activated in the lyrics window previously saw the new file only in basic font size during a song change — the refit simply did not occur. Both modes are now persistent switches that exclude each other and are triggered again with each new song. The refit timing now depends on the actual layout end of the text browser (instead of a fixed 50 ms delay), so that slowly loading HTML or RTF files are scaled properly.
- Shift-/Ctrl-click no longer opens the SequenceView: Those who built a selection in the sequence list with multiple clicks found that each click reopened the detail view — which was disruptive when marking. Now: only a simple click (without modifier) switches the detail window.
0.95 — Better diagnosis for audio problems (2026-06-01)
Improvements
- Loaded songs in the Perf log: With every song change, a diagnosis line with filename, full path, sample rate, channels, and duration is now written. This allows you to immediately see which file was playing at that moment in case of problems (dropouts, sound issues, stream reopen) — previously, you had to reconstruct this cumbersome from the play history. Completely invisible during live operation; only noticeable during later troubleshooting.
0.94 — Tempo and pitch changes without stuttering (2026-05-31)
Improvements for live operation
- Tempo changes now sound clean (AR-021). Anyone adjusting the tempo or pitch control no longer hears a short dropout, and the song stays exactly where it was. Especially relevant for „HotHash“ situations, where the tempo is gradually increased — each individual click now leads to a seamless transition instead of an audible jump. Applies to all three input methods: song tempo (stored in the DB), today's tempo (session factor), and pitch.
- Some reaction latency during tempo changes: Until the new tempo is audible, it continues to play for up to nearly a second in the old tempo. This is the audio buffer responsible for general dropout freedom since v0.93 — we deliberately leave it alone because any intervention would create the stutters we want to avoid. In practice, this means: better to leave a small pause between two tempo clicks, then you can hear each step clearly.
0.93 — WSOLA stretcher decoupled: crackling at low latency fixed (2026-05-31)
Performance / bug fixes
- WSOLA-Passthrough at Tempo 1.0 (AR-020 Fix A): So far, the expensive coarse-to-fine cross-correlation ran in
time_stretcher.pyalso when the tempo control was set to 1.0. However, with COLA-compliant Hann windows with 50 % overlap and ana_hop == syn_hop, the nominal position is already mathematically exact — the correlation only returns the nominal result anyway. On a Celeron N3450, this unnecessary search cost up to 15 ms lock-hold per hop and was audible as crackling under WDM-KS at 11 ms hardware latency. Now: at Tempo == 1.0, the correlation is completely skipped. - PREPROCESS_OUTPUT_SECONDS 0.25 → 1.0 (AR-020 Fix B): The stretcher output buffer is now held at 1 s instead of 250 ms target state. This also absorbs maximum hop calculation peaks (e.g., during tempo drag) before they can hit the hardware buffer. Previously: Buffer fluctuated between 232–325 ms with a periodic dip to 209 ms → 23 ms reserve under WDM-KS. Afterwards: Buffer fluctuates between 998–1091 ms → ~1 s reserve across all host APIs.
- Stretcher with two locks (AR-020 Fix C):
time_stretcher.pyhad a single lock thatpreprocess()held during the entire expensive hop calculation. The audio callback waited inretrieve()for the same lock — even if it only wanted to read output frames. Now, a second, narrow_out_lockexclusively protects the output buffer;retrieve()it waits at most for the short append of a finished hop, no longer for the WSOLA calculation itself.
Diagnosis
- Stretcher stats line every 5 s: New
[Diag] Stretcher-Stats-line directly below each[AudioBuf]-Entry in the Perf log. Format:hops=N passthrough=N (X%) correlation=N lock_hold_ms avg=X.XX max=X.XX. This shows at a glance: whether Fix A is effective (Passthrough share), how costly the hop calculation actually is (Lock-Hold times), and when the user was on tempo (Correlation > 0). - Lock-Hold measurement: Each hop is framed in
time_stretcher.preprocess()viatime.monotonic_ns()— the statistics provide Avg + Max per 5-second window.
Background
- Thorsten's v0.92 trace 2026-05-31 (perf_24–27) showed: WDM-KS measurement perfectly (0 XRuns, hw_default=44100 Hz, distinct=1 in the frame histogram), but audible crackling like a cable break. AR-020 mechanism (a) and (c) definitely disproved. Code review in the stretcher:
min10s=209 msexactly constant corresponds to ~2 Callback blocks under the 250 ms target → the feeder could not deliver individual ticks in time because the only lock was held by the expensive hop calculation. The three fixes address this bottleneck directly.
0.92 — Audio Diagnosis: Sample Rate Mismatch and Callback Frame Histogram (2026-05-30)
Logs & Diagnosis
- Hardware Sample Rate in the Stream Diagnosis Log (AR-020 T1): Both
[Diag] Stream Init Attemptand[Diag] Stream startednow additionally showhw_default=XHz— the native sample rate of the audio device. If this does not match our requested rate (44100 Hz), the driver takes over resampling — on some hostapi/codec combinations (WDM-KS + Realtek HD is known) the quality is poor and audible as „weird sound“/„speed fluctuation“, without buffer underruns occurring. Ifhw_default ≠ requested SR, a clear⚠ SR-MISMATCH (we request NHz)-marker appears directly in the attempt line. - Callback Frame Count Histogram (AR-020 T1): For each stream, the first 200 calls of the PortAudio callback are counted and logged once as a compact histogram:
[Diag] Callback frames histogram (first 200): min=1024 max=1024 distinct=1 | top: 1024×200 (100%). If the driver delivers constant block sizes,distinct=1— if it wobbles (suspected WDM-KS), you can see the distribution immediately. The sampling is cheaplist.appendper callback, no lock, no I/O. - Background: Thorsten's test 2026-05-30 (perf_log_22, T-Lap, WDM-KS) showed 4 min
xRuns=0with perfect buffer — still audible pitch wobbles and vinyl-like noise. The directly following MME test (perf_log_23) sounded clean. The new two diag lines clarify in a single trace whether sample rate mismatch (mechanism a) or frame count fluctuation (mechanism c) is the cause.
0.91 — Fade-out stuttering fixed, new logs/-folder (2026-05-30)
Performance / bug fixes
- Fade-out vectorized (AR-018): The fade-out block in the PortAudio callback (
audio_engine.py) contained a Python-for-loop over 1024 samples per audio block. On weak hardware (Thorsten's Celeron N3450), this caused audible stuttering during the fade-out because ~4–10 % of the block time was spent just on the fade logic, and the GIL was held for the entire loop. Replaced by NumPy array multiplication (1 call instead of 1024 iterations). Factor 100–500× speedup, fade-out now runs smoothly even on weak CPUs.
Logs & Diagnosis
- Diagnosis Center (Help → Diagnosis Center…): New window with built-in tests that provides the developer with the necessary data for dropout issues — without you having to install external tools. Each test explains in plain text what it measures and what you should do. Available tests:
- A — System Snapshot: Key data Windows/CPU/RAM/Audio devices/Backends, Callers Caddy version, INI content.
- D — QTimer Inventory: lists all active timers in the program — helps in tracking down periodic dropouts.
- F — External Load Sampling (60 s): checks which other programs are using CPU during playback (antivirus, cloud sync, driver services).
- G — Stall Sentinel: shows the status of the ongoing background monitoring of main thread blocks during playback.
- H — Bundle „Send to Developer“: packs the latest logs into a ZIP for emailing.
- B/C/E — Audio Tests (in preparation): Silent playback, host API comparison, fade-out stress will come with v0.92.
- Central logs/-folder: All logs now go to
/logs/. This keeps the main directory tidy, and diagnostic data is at a place: logs/perf/perf_YYYY-MM-DD_HH-MM-SS.txt— Performance log with timestamp per session (previously fixed name,perf_log.txt, each start would overwrite the last). Automatic rotation: only the most recent 20 sessions are kept.logs/crashes/crash_*.log— Crash logs (previously in the root)logs/rules.log— Rules Engine Log (previously underrules/, now only the User Rules JSONs are located there)logs/system_report.txt— System report (previously in the root)- Automatic migration on first start v0.91: Existing
perf_log.txt,crash_*.log,rules/rules.logandsystem_report.txtwill be moved to the new structure once.
0.90 — Sequence Editor & Sequence Limit per dance program (2026-05-27)
New Features
- Sequence Editor (BL-015): New window „Sequences → Sequence Editor…“ for creating and editing sequences. Header area with type (required field) and difficulty (pre-filled, editable dropdowns), below an input field with one call per line. Buttons: „+ New“, „Save“, „Check for duplicates“ (warns if the input already exists) and „Close“. Limit of 15 calls is displayed live and enforced upon saving. Known calls are marked in green (mapped or exact match); a Double click click on a non-green line opens a slim mapping dialog with searchable call selection (matcher suggestion pre-selected). Exact matches are automatically mapped upon saving to calculate the level. From the Sequence View, a ✎-button leads directly to editing the displayed sequence. After saving, the new sequence is guaranteed to be visible (filter reset + selection).
- Sequence limit per dance program (BL-132): In the dance program manager, a „sequence limit“ can be set per program — any call from the teaching order (including program separators like „– Mainstream –„). When switching programs (loading location or manually in the player), the sequences filter automatically sets to this call. Each caller defines the limit themselves once — those switching to MS will only see MS sequences, those switching to A2 will only see A2. Opt-out in settings → sequences → „Automatically set filter to dance program.“.
0.89 — Mouse wheel protection, feedback suppression, call mapping bulk confirm, quality/ERR per context menu (2026-05-27)
New Features
- Context menu Quality/ERR ±1 (BL-127): Song list, playlist, and statistics dock (TOP/FLOP/Never) now show four new entries in the right-click menu: Quality +1/−1 and ERR +1/−1. Each entry displays the old and new value in the form
[5>6]. At the edge of the value range (Quality 0/10, ERR 0/4), the respective action is disabled. Changes are immediately written to the DB; the song data dock synchronizes live when it shows the same song. - Feedback dialog: Session suppression: New checkbox „Do not ask again in this session“ between the note field and buttons. When checked, the auto-feedback window is suppressed for the rest of the session — regardless of whether „Apply“ or „Cancel“ is pressed. This applies to both manual feedback calls and the automatic popup after the song ends. The INI standard remains untouched and will take effect again at the next app start.
- Call mapping: Bulk confirm: In the call mapping dialog, multiple lines can now be selected (Ctrl/Shift+Click, Ctrl+A) and written to the DB together using the „Confirm selection“ button. Source will be set to
manualset, table will be automatically reloaded from the DB.
Improvements
- Mouse wheel protection comprehensive: In the song data dock, player (including volume and position sliders) and in the settings dialog, SpinBoxes, ComboBoxes, DateEdits, and sliders ignore mouse wheel events. Accidental scrolling over fields no longer changes any values. In the settings dialog, the protection applies window-wide — even fields added in the future are automatically protected.
- Menu „General Settings“: The settings dialog call is now in the menu „Settings“ (previously under „App“) and is called „General Settings…“. Shortcut
Ctrl+,remains unchanged. The app menu now only contains „Exit“.
Bug fixes / diagnostics
- Stall detector is silent in idle mode: The main thread stall detector (AR-F) now only reports stalls while a song is playing. During title bar drag or window resize, apparent ‘stalls„ occur due to Windows“ modal move loop, which have nothing to do with audio dropouts — these false positives no longer appear in the perf log.
Cleaned up
- Dead translation key
menu_settingsremoved (replaced bymenu_general_settings) - Removed three NoScroll subclasses in the settings dialog (replaced by window-wide event filter)
0.88 — Audition channel + settings window + anti-stutter (2026-05-26)
New feature: Audition channel (BL-074)
- Audition button in the player: narrow button on the right next to Play, visually above Fade Out
- Song starts from the beginning on the secondary output (exclusive — no second stream)
- No history entry for Audition; rules are not triggered
- Stop / Play / song end terminate Audition and automatically restore the primary channel
- Primary / Secondary output now separate INI keys (
audio/primary_device,audio/secondary_device) with its own volume (audio/secondary_volume, Default 80 %) - Both device dropdowns appear in the settings dialog (Audio section)
- Migration:
audio/output_device→audio/primary_deviceruns automatically once - Bugfix: WASAPI fallback cache in
AudioEngine— when a device falls back to system default on startup, the cache entry is used on every channel switch (Audition → Primary) instead of trying WASAPI again
New feature: Settings window (BL-129)
- New window „Settings...“ in the app menu (Shortcut
Ctrl+,) - Reads all relevant INI sections generically and displays them in tabs
- Automatic widget selection based on value type: Checkbox, SpinBox, DoubleSpinBox, Path button, ComboBox, DateEdit, LineEdit
SETTINGS_META-Registration table for known keys with labels, tooltips, value ranges, and ComboBox options (Skin list, languages)- Tabs: Display, Paths, Audio, Loop, Player, Playlist, Feedback, Sequences, Notes, Lyrics, Debug, Rules (System)
- Buttons: OK / Cancel / Apply
- Note dialog when restart-required keys have been changed (Skin, Language, Debug, Audio flags)
- Live apply where possible: Zoom (Sequences/Lyrics/Notes), Minimum volume, Loop crossfade, Status bar player, Music paths
- Excluded:
[General],[Tutorials],[custom-filter], all*_dock-sections - New
settings_dialog.py— standalone, no bloating of main.py
Anti-stutter: Hostapi heuristic + header latency + playlist refresh storm (AR-015 / AR-002)
- L1 — WDM-KS-first heuristic: On first start (no saved device), the app automatically selects the best available audio backend: WDM-KS > WASAPI Shared > MME — DirectSound never as default. Background: Thorsten's Hostapi Matrix Test 2026-05-26 (10 sessions on Celeron N3450) shows WDM-KS = 0 stutters, MME = 7–10, DirectSound = 15–25 per 30-sec session. Heuristic runs in
_setup_audio_device_combo(), immediately saves the selected device in INI and logs[Diag] Auto-Device-Heuristic (AR-015 L1). - L2 — Perf-header both latencies:
[Sys]-Header now showsAudio Output (System Default)ANDAudio Output (configured)(if different).generate_compact_header(configured_device_index=...)takes the saved device index from INI. Prevents confusion: MME default latency 90 ms vs. actually active WDM-KS latency 11 ms (finding 5 from Hostapi Matrix). - G — Playlist refresh storm fixed (AR-002): New method
PlaylistWidget.add_entries_bulk(entries)internally attaches all entries and callsrefresh_display()+_notify_changed()exactly once — no matter how many songs. Auto-Fill now uses Bulk-Add instead of N×add_entry(). Previously: 24×refresh_display+ 24×_refresh_playlist_mirror; afterwards: 1× each.
0.87 — Dock-Open instrumentation + Stall detector 100 ms + Audio device routing diagnosis (2026-05-25)
Expands the diagnostic tools from 0.86 with two targeted measurement points for audio dropout causes that we have seen in the Thorsten logs (Desktop + Laptop) but could not narrow down. Background and suspected cases documented in 1_Source/docs/anti_ruckler_backlog.md (Tasks J, N).
Perf-Log: Dock toggle steps stamped individually
_toggle_dock(...)(central handler for all dock buttons in the status bar, including Planner, Lyrics, SongData) now stamps each Qt step individually:setFloating(True),show(),move(),raise_(),setFocus(),hide(). Plus aTOTAL-line.- Label contains the dock name so that Planner/Lyrics/etc. are distinguishable.
_on_manager_button_clicked(Planner button) additionally receives a stamp for thesetCurrentIndex(sort)-trigger (triggers_apply_filterit).- Aims at observing Thorsten's laptop (Celeron N3450): Underflow burst right after Planner click, with main thread stall of ~950 ms — so far without visible cause in the log. The known Qt trap
setFloating(True) ~90 ms(see CLAUDE.md) scales significantly on weak CPU.
Stall detector threshold lowered: 150 ms → 100 ms
- In Thorsten's logs from the morning, underflows occurred partially without the stall detector (from 0.86) reporting anything — probably because blocks were below the old cutoff between 100–150 ms.
- The new threshold of 100 ms is definitely above the normal scheduling jitter (~80–100 ms), but it reliably catches the blocks that prevent the Python PortAudio callback from grabbing the GIL.
Diagnostic consequence for AR-014
- The underflows in Thorsten's latest logs (Desktop perf_log_8, Laptop perf_log_14) show all
BUFFER FILLED(255–325 ms supply). The feeder is not the problem — it's the Python callback, because it needs the GIL on every call. This version makes the evidence more precise by also making smaller stalls + dock step costs measurable.
Audio device routing — attempt / fallback / final result (evening follow-up)
Background: in an afternoon test, it showed the [Diag] Stream started still hostapi=MME, although Thorsten clearly chose a WASAPI entry in the Combo according to the video. Suspected: silent fallback in _ensure_stream, because the try/except-chain has so far swallowed the cause there.
Three new [Diag]-lines around the stream start make the path from the Combo to the active stream traceable:
- Attempt (UI-side) —
_on_audio_device_changedlogs every Combo change:[Diag] Audio device change requested: idx=…, combo_label='…' - Attempt (Engine-side) —
_ensure_streamlogs before the first stream open:[Diag] Stream init attempt: device=…, name='…', hostapi=…, exclusive=… - Fallback paths — when the open fails with the user device:
[Diag] Stream init failed with device=… (…) — Fallback 1 to the same device without extra_settings[Diag] Stream init fallback 1 also failed (…) — Fallback 2 to system default (…). User-selected device=… is IGNORED!
The existing [Diag] Stream started-event continues to show the actually active device + host API (also after fallback). Pure diagnosis, no change in audio behavior.
0.86 — Anti-stutter diagnosis + MMCSS priority for audio feeders (2026-05-24)
Expands the root cause analysis for audio dropouts (TIC-0025 complex) with two new diagnostic tools in the perf_log.txt and a first attempt at a solution on a system level. Background and suspected cases documented in 1_Source/docs/anti_ruckler_backlog.md, user manual in 1_Source/docs/diagnose_ruckler_user.md.
Audio feeder runs with MMCSS „Pro Audio“ priority (solution attempt)
- The dedicated
AudioFeeder-thread (since 0.80) previously ran with normal Windows thread priority. PortAudio already gives its own callback thread MMCSS, our Python feeder did not — the Windows scheduler could therefore defer it behind UI threads, even when the GIL was free. - New: As the very first action in the feeder run loop,
AvSetMmThreadCharacteristicsW("Pro Audio")is called via ctypes. This allows the feeder to be prioritized over all UI applications in the scheduler. - Can be disabled via INI:
audio/mmcss_priority=falseif problems occur.
Perf log: Wall clock timestamp on all lines
- Each line in the
perf_log.txt(except[Sys]-header) now gets aHH:MM:SS.mmm-timestamp prefixed. This allows you to correlate stutter observations with timestamps or a video recording exactly with log events.
Perf log: System header at startup
- When the perf log is first opened, a
[Sys]-block is written with: Callers-Caddy version, Python/PySide6/Qt versions, OS, CPU, RAM, PortAudio version, default audio output, active hostapi (MME/DirectSound/WASAPI/WDM-KS), available hostapis, audio engine constants (FEED_AHEAD,PREPROCESS,BLOCK). Makes logs of different sessions and users comparable. - Costs: ~90 ms at startup (only if
debug/performance_logging=true); without subprocess calls.
Perf log: PortAudio underflow events with buffer snapshot
- So far, underflows have only been recorded as a counter (
xRuns=N). Now each underflow writes its own[Diag]-line with timestamp, buffer status, and diagnostic note: BUFFER EMPTY → Feeder/GIL suspicion(our code could not refill)BUFFER FILLED → Driver/Hostapi/DPC suspicion(PortAudio reports despite full data — e.g. WASAPI shared glitch or driver DPC stall)- Events are pushed into a deque in the callback (no I/O in the callback itself) and written to the log by the feeder loop.
- At stream start additionally
[Diag] Stream started: '' hostapi= sr=... blocksize=... latency=.... - Can be disabled via INI:
audio/log_underflows=false.
New user documentation
1_Source/docs/diagnose_ruckler_user.mddescribes for affected users in three steps how to collect logs (activate Perflog, LatencyMon, optional video sync). Can be forwarded directly to users with stutter reports.
WASAPI Exclusive Mode as opt-in (AR-008)
- The Research identified a documented glitch in Windows WASAPI Shared Mode (PortAudio Issue #303) as the most likely cause for seemingly random mini dropouts. This version allows users to use WASAPI in Exclusive Mode — completely bypassing the bug.
- In the audio device selector, the Hostapi per device is now displayed (
"Speakers (WASAPI)","UR22 mkII (ASIO)"). This way, the user can see directly which backend Windows is using. - New Checkbox „Exclusive“ in the status bar next to the device combo. Activates WASAPI Exclusive Mode for the selected device; automatically falls back to Shared in case of init errors. Only affects WASAPI devices — other host APIs (MME, DirectSound, ASIO) ignore the flag.
- Tooltip warns: Exclusive Mode blocks other audio programs system-wide (no YouTube/Spotify in the background).
- INI key:
audio/wasapi_exclusive=true/false(Default off). - If you have an ASIO interface (e.g., Steinberg UR22 mkII): just select the ASIO device from the list — PortAudio automatically routes through the ASIO host API without additional switches.
Main thread stall detector in the perf log
- The existing 50 ms
_update_all-Timer now measures the gap between its ticks. If the gap is greater than 150 ms, the UI thread was blocked — for example, by a heavy Python operation that occupies the GIL. - Logged as
[Diag] Main thread blocked: NNNms (expected 50ms) (last [Perf] event before XXXms: ...). Directly correlatable with wall clock timestamp and underflow events: was just before a[Diag] PortAudio output_underflowmain thread stall, GIL contention is the likely cause. - The attached „last [Perf] event“ note indicates the last instrumented operation that was running before the stall — immediately points out the suspect without having to scroll through the log.
- Pure logging, no behavioral change.
Improved AudioBuf classification
- In the first live test, it became clear that the previous
⚠ CRITICALoften falsely alarmed:min10s=0occurs with every tempo/pitch change because the stretcher is briefly flushed during this — but the 5 s pre-roll catches that, so PortAudio does not report an underflow and nothing becomes audible. - New label levels in the
[AudioBuf]line: ⚠ XRUN (+N actual dropout)— the PortAudio xRun counter has increased since the last sample, which indicates an audible dropout at the driver level.△ Buffer-Dip (probably Stretcher-Flush, harmless)—min10swas briefly at 0, but no new xRun (typical with tempo/pitch changes)△ low—min10s50–120 ms (pre-warning)- When reviewing a log, this is enough to search for
⚠ XRUNand[Diag] output_underflow— the rest is noise.
Note
This version contains only diagnostic improvements plus the MMCSS fix attempt. The additional levers found in the research (WASAPI-Exclusive/ASIO selection, stall detector, Numba/CFFI) are recorded in the anti-stutter backlog and will be prioritized based on the results of the first test round.
0.85 — Filter Header + Critical Bugfix Loop Data Loss (2026-05-23)
Bugfix: Loop values were overwritten when clicking on the song list
- Symptom: 33 songs had identical
loop_in=0.34values with differentloop_out(clustered by source song). Original loops were lost. - Cause:
_save_current_songran in_on_file_loadedwith the new_current_song, but the engine loop snapshot of the old song. When clicking through the song list, each new song has inherited the loop values of the previous one. - Fix (Variant C+ — Direct Persistence + Dirty Flags):
- Every loop change (Set Loop In/Out, Beat Snap, Clear Loop) writes immediately into the DB — no more collective save when switching songs.
- Tempo and pitch use a dirty flag and are persisted when leaving the field (Enter / focus change) or before the next song switch. During a slider drag none DB write — protects the audio buffer.
- Snapshot mechanism (
_snapshot_loop_values,_saved_loop_in/out,on_before_load) completely removed. - New helper method
_flush_player_values()is called at all song switch points (song list, playlist, preview, drag & drop, closeEvent). - DB cleanup: 33 affected songs on
loop_in=0, loop_out=0reset (loops need to be set up again). - Backups: DB under
2_Test/callers_caddy.db.backup_20260522_225318, source under1_Source/src/_fallback/*.bak_loop_fix_20260522_231059. - Test plan:
5_Tickets/loop_data_loss_testplan.md - Follow-up ticket: TIC-0027 — Audio buffer underrun during tempo drag (standalone performance topic)
Feature: SongFilterBar — unified filter/sort area (BL-101 + BL-121)
- New shared component
SongFilterBarreplaces the previous separate filter areas in the song list and planner. - Song list now has full parity with the planner:
- Type filter: RadioButtons All / Patter / Singing
- Genre filter: ComboBox with all available genres
- Sorting: Alphabetical / Quality / Recently played / Recommendation (new)
- Custom filter: Button to load saved playlists as pre-selection (BL-097)
- Search field: Live filter by title, label, filename
- Planner remains unchanged — now also uses
SongFilterBarinternally. - No more duplicate code: Filter logic, custom filter dialog, persistence, and sorting live in one single place.
Feature: Random tiebreaker in case of a tie (BL-113)
- In Sorting by quality and Sorting by recommendation songs with identical scores will no longer always be displayed in DB order, but will be randomly sorted within the tie group.
- New „Random“ checkbox next to the sort dropdown to toggle on/off — grayed out automatically for Alphabetical and Recently Played.
- The order is stable within a session — no reshuffling with every key press or filter change.
- Alphabetical sorting and Recently Played sorting remain unchanged and deterministic.
- Applies everywhere it
SongFilterBaris used: song list, planner pool, auto-fill.
Feature: Status bar — mini playback progress (BL-128)
- New widget
_StatusBarPlayerBarthe status bar permanently shows the playback progress: - Progress fill (semi-transparent, accent color from skin)
- Loop-In / Loop-Out as vertical lines (like in the main player slider)
- 7 equally wide section stripes (Singing-Call colors O/1/2/M/3/4/C) at the bottom
- The widget is skin-aware — colors change automatically when the skin changes.
- Toggleable via INI:
display/statusbar_player = true(default) /false - No performance overhead: update only when values actually change (
update_statewith dirty check).
Refactoring: development guideline documented
- New Refactoring completeness rule in
1_Source/docs/12_experiences.md: - Two-phase approach: first build (create new), then after testing dismantle (remove old)
- Mandatory checklist: build list + dismantle list before coding
CLAUDE.mdnow refers to all sub-documents with a table (when to read which)
0.84 — Evening Planner transfer dialog + audio device selector + crash fix (2026-05-22)
Feature: Evening Planner — transfer dialog with confirmation (BL-124)
- „To Playlist“ and „To Notes“ now always show a confirmation dialog — even if no songs are confirmed.
- The dialog informs about the number of confirmed and unconfirmed songs and offers three options: Transfer all / Only confirmed / Cancel.
- If all songs are already confirmed, the selection option is omitted and the transfer runs directly through.
- After the transfer, feedback appears with the number of transferred songs.
- Bugfix: If nothing was confirmed, clicking on the transfer buttons simply did nothing — no dialog, no message. Fixed.
Bugfix: Evening Planner — incorrect order in notes export
- Songs appeared in reverse order after exporting to notes.
- Cause: the notes widget always adds new entries at the top (
index=0), which caused the last song to end up on top during sequential insertion. - Fix: The export list is reversed before insertion, so the order from the Evening Planner is preserved.
Feature: P/S marking in notes shortcodes
- When exporting to notes, songs are now marked as P (Patter) or S (Singing Call) marked:
[load_song title="..." mode="P"]. - Prevents confusion with songs that are registered for both types.
- Backward compatible: Songs without type assignment continue to use the old format
[load_song "..."].
Feature: Select audio output device (BL-126)
- New ComboBox permanently in the right status bar for selecting the audio output device.
- Displays all available output devices of the system (filtered to output-capable devices).
- First entry: System standard (previous behavior).
- Device switching works even during playback — the stream switches immediately to the new device.
- Selection is saved in the INI and automatically restored at the next start.
- Fallback: If the saved device is not available (e.g., USB sound card not connected), the app automatically starts with the system default.
Bugfix: Crash after audio device disconnect (TIC-0026)
- Crash „Cannot operate on a closed database“ occurred when an audio device was disconnected: The feeder stopped playback, and a queued timer callback then tried to access the already closed database.
- Fix:
timer.stop()is now the very first action incloseEventexecuted. Additionalis_open()-Guards in_do_auto_advanceand_get_current_target_durationprevent access to a closed DB. - Audio Recovery: If a device is disconnected during playback (USB, HDMI), playback automatically continues on the next available device (usually the internal speaker) after a brief interruption. The stream is checked for activity every 2 seconds and restarted if necessary.
0.83 — feedback notes + location tips + AI metadata for quality/ERR (2026-05-21)
Feature: Note field in the feedback dialog
- New text field „Notes for the Future“ in the feedback dialog (after the Quality and ERR buttons), 3 lines.
- When a location is selected: Entry is directly added as a new note when OK is pressed to the end of the note list of the current location — ideal as a memory aid for the next evening.
- If no location is selected: Field is disabled with an explanatory placeholder text („First select a location“).
- Storage directly in the DB (robust against lazy-init of the Notes dock) + subsequent refresh of the NotesWidget.
Feature: Planned number of tips per location
- New settings field in the location settings dialog (under the tempo spinner): Number of planned tips per evening.
- SpinBox 0–40, 0 = no specification (displayed as „– (no specification)“).
- When changing locations, the value is automatically taken over in two places:
- Autofill dialog (Magic wand in the planner):
spin_tipsstarts with the location value instead of the hardwired default value 8. - Evening Planner:
_spin_tipsis set to the location value. - DB migration: new column
planned_tips INTEGERin thelocations-table.
Feature: AI metadata export for Quality and ERR (Potential widget)
- Quality and ERR are now selectable fields in the „Export gaps“ dialog.
- „Missing“ means:
quality = 0or.err = 0. - AI prompt explains Quality and ERR with complete instructions:
- Quality: Caller self-assessment (AI cannot judge this) → AI always sets it to 6, Caller corrects it themselves.
- ERR: Dancer reaction (1 = peak to 4 = calming) → AI estimates based on familiarity, participation factor, emotional impact. Field is mandatory, never leave it out.
- Import processes quality and ERR as integer fields (
update_song_simple_field). Value 0 is skipped during import. - Buttons in the FlowWidget: all buttons are now side by side and automatically wrap to the next line when there isn't enough space — reusable
_FlowWidget-class for the entire app.
0.82 — Feedback dialog + music and lyric variants + Pattern→Patter (2026-05-20)
Feature: Song feedback after playback (BL-119 + BL-035)
- New modal feedback dialog appears after each song ends (natural end, fadeout, manual stop), when
feedback/enabled = trueset in the INI (default: off). - Quality buttons 0–10 with a color gradient from white (0 = not rated) to light green to forest green (10 = excellent). The currently set value is highlighted.
- ERR buttons 0/4/3/2/1 in the order of weakest → strongest dancer reaction, colored with the Evening Planner colors (Gray/Blue/Green/Amber/Red). Tooltips explain the meaning on hover.
- Adaptive text color: Dark text on light buttons, white text on dark — automatically via luminance formula.
- Esc or „Cancel“ closes without saving. Only changed fields will be written to the DB.
- Auto-advance waits automatically until the dialog is closed (modal dialog blocks the main thread).
- Manual call at any time via the new „Feedback“ button in the song data dock (next to „Advanced Data“ and „Delete Song“).
Feature: Multiple music and lyric files per song (BL-XXX)
- Variant management in the „Advanced Song Data“ dialog (new tab „Variants“).
- About + Music variant or. + Lyric variant any number of alternative files per song can be entered — with a descriptive name (e.g. „Live Version“) and file selection dialog.
- Variants are stored in the
song_properties-table (music_2_name,music_2_file, etc.), no schema change needed. - Delete a variant with the ✕-button; remaining variants will be automatically renumbered.
- If variants are present, they appear in the song data dock directly below the filename or the lyrics line selection buttons: „Default“ / „Standard“ is always the first and pre-selected option.
- Clicking on a music variant loads it immediately in the player (PathManager searches all configured music slots like with main files).
- Clicking on a lyric variant shows it immediately in the lyrics widget.
- The active lyric variant is retained when editing song fields (autosave) and changing skins. When switching to another song, it always resets to „Standard“.
- File dialogs start by default in the respective music or lyrics folder; portable filename is saved relatively.
- Bugfix: Variant buttons jumped back to „Standard“ after each player feedback. The active variant is now remembered in the widget and correctly restored during button rebuild.
Renaming: „Pattern“ → „Patter“
- At the recommendation of an American caller: The entire UI now uses the correct term „Patter“ instead of „Pattern“ — in all German and English texts (checkbox, radio button, import dialog, evening planner, statistics, column headers, tooltips, tutorial texts).
- Internal code variables and DB fields (
is_patternetc.) remain unchanged.
0.81 — Bugfix: Slider display on tempo change and loop audition (2026-05-18)
Bugfix: Time display inconsistent with changed tempo
label_time_currentshowed original seconds,label_time_totalon the other hand, real-time duration — different units. Example with a 3-minute song, tempo 1.5×, after 1 minute: Labels showed „1:30 / 2:00" (implies 75 %), slider was correctly at 50 %. Now the running time also shows real-time:pos × dur / orig_dur. Labels and slider are in sync again.
Bugfix: Slider freezes during loop audition
- Slider remained at the -position during the 5-second preview phase
loop_in(before the first loop jump). Cause:_estimate_playback_pos()stuck the position atmax(loop_in, ...), as soon as the feed pointer was already behind after the feed-ahead wraploop_in— even though the audio callback was still playing in the pre-loop segment. Fix: Whenpos < loop_inis now_playback_sampleused as an approximation (exact at tempo 1.0; slight deviation at other tempos).
0.80 — Audio architecture: Dedicated feeder thread (2026-05-15)
Audio dropouts finally fixed (TIC-0025)
- Dedicated audio feeder thread in the
AudioEngine. Until now, the WSOLA stretcher was filled from the UI main thread (every 50 ms via QTimer fromPlayerWidget.update_display). This made audio feeding completely dependent on the UI thread: any GIL blockage > 500 ms (loop finder completion, DB operations, restoreState) led to audible dropouts. Now a dedicated daemon thread runs (AudioFeeder), which refills the Stretcher independently of the Main Thread every 20 ms. FEED_AHEAD_SECONDS: 0.5 s → 5.0 s. The Stretcher now buffers 5 seconds of audio ahead. Even if the Main Thread is blocked for several seconds, the audio callback has enough data to play.- Thread-safe state updates via
threading.Lock:load(),seek(),play()and_flush_and_refeed()hold the lock while they_feed_pos,audio_dataor thestretcherare modified. No race conditions possible between the feeder thread and the main thread. - Result: An active AudioStream now has absolute priority — it will no longer be starved by UI operations.
Further rule actions decoupled
dual_view_toggledeferred viaQTimer.singleShot(0, ...)— same pattern aslayout_loadin v0.79. The toggle paths withrestoreState/restoreGeometryblocked for up to 105 ms.system_pingasynchronous in the daemon thread —winsound.Beepblocked the main thread synchronously for the full tone duration (~300 ms). The trigger is now immediate, the beep plays in parallel.
0.79 — Performance: layout_load deferred (2026-05-15)
Bugfix: Audio dropouts during layout changes due to Rules (TIC-0025)
layout_load-Action deferred —restoreState/restoreGeometryblocked ~75 ms synchronously on the main thread (GIL), right at thesong_started-trigger. WithQTimer.singleShot(0, ...)the layout change is postponed to the next event loop tick, so the audio callback runs first. Identical pattern as the already deferredplay-action.
0.78 — Performance: Audio dropouts (2026-05-15)
Bugfix: Song dropouts during live operation (TIC-0025)
- Song list:
set_last_played_mapoptimized — previously, all 2401 table rows were rewritten at song start (144 ms GIL block on the UI thread). Now only the actually changed rows are updated (typically: 1 row, ~0 ms). Fixes the main cause of audio dropouts on weaker machines. _apply_filterbuilds_row_by_id-Dict (song_id → row index) for direct access without linear search.
Rule Engine: Action timing in log
- Each rule action now logs its execution time in
rules/rules.log(e.g.song_list_refresh({}) [2.1ms]). It makes diagnosing performance issues in live operation easier.
0.77 — Permanent Custom Filter (2026-05-14)
Planner — Permanent Custom Filter Slots
- „Permanent“ toggle button in each of the 4 custom filter slot lines (behind the remove button)
- If the button is pressed, the file path of the loaded playlist is saved in the INI (section
custom-filter) - When removing a slot, the permanent status is automatically reset.
- When you first open the planner in a session, permanent entries are read from the INI and the playlists are automatically loaded as custom filters.
0.76 — Planner Custom Filter (BL-097) (2026-05-12)
Planner — Custom Playlist Filter
- „Custom“ button in the filter line (after All/Pattern/Singing, before Genre): opens the new custom filter dialog
- Custom Filter Dialog: up to 4 fixed slots, each with [Load] and [Remove] button; loads saved playlist TXT files (current and old format)
- Preview Table in the dialog shows the intersection of all loaded slots in real time
- Display Name can be changed by double-clicking on the slot name (playlist data remains unchanged)
- Extra Line in the Planner appears after applying with checkboxes for each loaded slot — only visible if at least one playlist is loaded
- Checkboxes on/off filters the song pool immediately to the intersection of the active playlists
- All other filters (search, sorting, type, genre) remain effective
- Filter is session-only (no persistence at app exit)
0.75 — Quality + ERR Filling, Evening Planner Fixes (2026-05-11)
New tab in the Potential widget: Quality + ERR Filling
- Single record run-through: Songs with missing Quality or ERR rating will be displayed individually — no more list jumping
- Double-clicking on the loops column opens the loop count dialog (playlist + planner): Title (bold), below type (Pattern / Singing / Pattern + Singing), label, current quality and ERR value
- Quality Buttons (1–10): only visible when quality is not set; current value highlighted
- ERR Buttons (1–4): in ERR colors (Red / Orange / Green / Blue); only visible when ERR is not set
- Auto-Advance: As soon as both values are set, the display automatically jumps to the next song
- „▶ Preview“ / „⏹ Stop“ Button next to the title: loads the song into the player and starts playback; second click stops
- Navigation with „◀ Back“ / „Next ▶“ (easy to read) + Counter „Song X of Y“
- Badge count in the tab title
Evening Planner fixes
- ERR bar never appeared: Songs with
err=0(not rated) deliveredpatter_err=0→_draw_bardrew nothing. Fix: Songs witherr=0but existing slot get a gray bar at target ERR height (consistent with table behavior) - Dock not dockable: Evening Planner dock is now only closable (not movable/floatable) — remains even after
restoreState()fest
More fixes
- AI prompt in the metadata tab is now always in English
- Statistics texts fully translated after export/import/CSV reconciliation (no hardcoded German strings anymore)
0.74 — Metadata tools: Song properties, CSV matching, metadata export/import (2026-05-11)
New feature: Extended song data (BL-094)
- Generic
song_properties-table: Stores any key-value pairs per song (initial:original_artist,release_year) - Button „Advanced Data“ in the song dataset opens a generic editor with an editable key-value table
- Label field renamed to „Label + No.“ with example placeholder „e.g. SQR 123"
New widget layout in the potential widget
- Converted to QTabWidget: Each of the 10 tests gets its own tab (badge count in the tab title)
- First tab is automatically loaded upon opening
- Tab scroll buttons widened (24 px minimum width)
- New Tab „Fill Metadata“ (BL-114) with three tools:
Metadata Tools (BL-114)
Match with Music CSV
- CSV Match Button (in first place): Automatically matches missing song metadata with a provided CSV database
- Three-stage matching: 1) exact title, 2) label code + number, 3) fuzzy (difflib, threshold 0.80)
- Preview Table with checkbox per song, „All / None“ selection
- Green cells = unique match, yellow cells = ambiguous → Double-click opens selection list
- Supported fields: Artist, Label/No., Genre, Original Artist, Release Year
music-extended-data/music_extended_data.csvis automatically included with each release
Export gaps (JSON)
- Field selection dialog (which empty fields to export?)
- Exports songs with missing data as JSON with
genres_available-Liste - Statistics after export (number of songs, missing fields)
Show AI prompt
- Ready-to-use guide for AI assistants, always in English
- Includes all genres available in the system as allowed values
Import data (JSON)
- Loads enriched JSON back, shows preview table with checkbox selection
- Unknown genres will be marked and skipped
- All statistic texts fully translated (no more hardcoded German strings)
Playlist compatibility
- V1 playlists (only titles, old format) will be loaded correctly again
- New playlists are saved with title instead of filename (Format V3: Type + Loop-Count + Title)
- Loader automatically recognizes all three formats (V1/V2/V3)
0.73 — Evening Planning: Evening Planner Widget (2026-05-10)
Potential Widget: New Checkers
- Without ERR (BL-115): Lists songs where the ERR value has not yet been set (
err = 0). Double-click navigates directly to the song. - Without Genre (BL-116): Lists songs without genre assignment. Double-click navigates directly to the song.
- Incompatible Format (BL-117): Checks if audio files can be read by the internal decoder (soundfile/libsndfile). Recognizes MP3s with non-standard conforming frames that can only be read by ffmpeg-based players. Runs like BPM and loop check with time estimation (5 sample files → extrapolation → confirmation → full check in background thread). Double-click navigates to the affected song; ignore function available.
Bug fix
- Import of new songs failed (
You did not supply a value for binding parameter :err):errwas missing in theinsert()-Dict — the column was added when adding BL-111 in SQL, but not in the Python dict. New songs are always imported witherr = 0(not set).insert()andupdate()now usedataclasses.asdict()instead of manual Dicts — new fields in the song model will now be automatically considered. - Fixed crash during song import (
TypeError: '>' not supported between instances of 'str' and 'int'):quality-Values that were stored as text or decimal numbers in the DB (e.g., from older migrations) could completely block the app on startup._row_to_songconvertedqualitynow robust toint; an automatic DB migration cleans up existing legacy data on the first start of the new version.
New feature: Evening Planner
- New dock „Evening Planner“ parallel to the existing planner (view menu)
- Emotional tension arc: Bezier curve with Catmull-Rom interpolation as a visual target
- Sawtooth blocks: CurveEngine automatically segments N tips into blocks (configurable min/max, default 3–5 tips), each block with ERR pattern 3→4→2→1
- ERR bar: Patter (saturated color) and Singer (bright color) as separate bars per tip; height = emotional intensity
- Drag handles: Move ERR targets with the mouse; handle distance configurable (per tip / 30 / 45 / 60 / 90 min)
- Break support: Breaks displayed as gray blocks on the timeline, proportional to duration; hard block boundaries
- Song suggestions: SongScorer evaluates based on
quality × days_since_last_played × err_match; best suggestion automatically pre-selected in gray - Compensation rule: Singer-ERR complementary to Patter-ERR (sum ≈ 5)
- 4 strategies: Alternating Pattern+Singing, Singings only at the beginning/end, Only Pattern, Only Singings
- Detail List (PlannerTable): Tabular view of all tips with time, song title, label, ERR; breaks movable via drag & drop
- Zoom & Pan: Zoom in/out/fit buttons, QScrollArea for horizontal panning
- Location Integration: Automatic update of suggestions when changing locations
song_db.py: New methodget_planner_candidates()for ERR-filtered candidate query- Candidate dialog: Double-clicking on a tip slot opens a dialog with all matching candidates (Score, ERR, Label, Filename); for the Pattern slot, optional bonus columns for Genre Match and Label Match; double-click or OK confirms the song for this slot
- Genre filter: Checkbox + button restricts song candidates to selected genres (applies to Auto-Fill and candidate dialog); button shows a compact summary of the chosen genres
- Planning rules dialog: Configurable rules for suggestion calculation
- Balance: Patter-ERR complementary to Singing-ERR (sum ≈ 5)
- Same-genre boost / Same-label boost: multiplicative score bonus (factor configurable) when Patter and Singer are from the same genre / label
- First-tip soft: First tip prefers baseline/relaxation
- Last-tip strong: Last tip prefers climax or preparation
- Export button (green check): Transfers all confirmed slots as a new playlist (only confirmed, no gray suggestions)
- Two fill algorithms:
_fill_optimal(global optimization, minimizes repetitions) and_fill_greedy(faster, greedy per slot)
0.72 — Potential: Without MP3 / Without quality, Crash handler Qt extension (2026-05-07)
Potential widget: Two new data quality checks (BL-027)
- Without MP3: Shows songs whose MP3 file cannot be found in any configured music folder
- Lazy Load: File check starts only when clicking the button, not at app start
- Progress dialog during the check („Checking MP3 files… x/n“)
- Runs in a background thread (QThread), UI remains usable, can be canceled
- Double-click navigates to the song in the song list; Ignore function available
- Without quality: Shows songs with
quality = 0(Default value = never rated) - Double-click navigates to the song; Ignore function available
Crash handler: Qt message handler (BL-103)
qInstallMessageHandlerregistered: Qt's own Critical and Fatal messages are now intercepted- In
QtCriticalMsgandQtFatalMsg: immediate writing of a crash logfile (including ring buffer) - Protects against a class of internal Qt errors that
sys.excepthookcannot be reached
0.71 — ERR field, planner search, auto-fill, button wrap (2026-05-07)
ERR field: Emotional Response Rate (BL-111)
- New field
errin the song database (INTEGER, 0–4): rates the emotional impact of a song during the dance evening - Values: 0 = not rated, 1 = peak, 2 = preparation, 3 = baseline, 4 = calming
- ComboBox in the song data widget; only the number is saved, no texts
- DB migration: new field will be automatically added to existing databases
Auto-fill in the planner (BL-112)
- New magic wand button (3rd position in the middle bar) automatically fills the playlist
- Dialog: Number of pattern and singing tips selectable + one of 4 strategies:
- Random — Songs are drawn randomly
- Rarely played — prefers less frequently played songs
- Quality — Songs sorted by quality rating
- ERR sequence — Songs according to emotional curve (Preparation→Climax→Baseline→Calm)
- Dual-type songs (Pattern + Singing) correctly maintain the selected mode
- Total duration of the playlist considered in loop=∞ the preset pattern duration of the program/Clubs
Planner search (BL-106)
- Search field at the top of the pool (left column of the planner): filters by title, label, and filename simultaneously
- Use the X button to clear; search works together with the other filters (genre, type, etc.)
Button bar with line break
- New help class
_WrapButtonBar: Buttons are arranged side by side, but automatically wrap to a second line in narrow dock windows - Song list and playlist now use this bar — no more cut-off labels
- All buttons in a row are brought to a uniform height (row maximum)
- Button texts more compact: „→ Note“ → „+Note“, „→ Playlist“ → „+Playlist“
Miscellaneous
- Default dance program at startup: Button shows „MS“ (Mainstream) instead of „—“
0.70 — Potential Widget: Bulk Actions; UI Bug Fixes (2026-05-05)
Potential Widget: Bulk Actions (Extension BL-027)
- Auto-Loop for all: New button in the „No Loop“ check — automatically sets a loop for all affected patterns via Loop Finder. If there are more than 5 songs, a time estimate is measured based on 5 samples and shown to the user before confirmation.
- Beat Snap for all: New button in the „Without BeatSnap“ check — snaps loop in and loop out of all affected songs to the nearest beat. Same timing principle: for > 5 songs preliminary estimate, otherwise just get started.
- Delete empty locations: New button in the „Empty Locations“ check — removes all locations without playback history upon confirmation.
- All bulk operations run in the background thread (no UI freeze), with a cancellable progress dialog („Cancel“ button).
- SQLite thread safety: Workers open their own DB connection via
db_path, instead of sharing the main thread's connection.
Bug fixes
- Loop Finder Widget: Segment bar (7 Singing Call sections) was cut off at the bottom after the player redesign — corrected height from 14 px to 28 px.
- Loop Widget Buttons: Under-lengths (p, g) in two-line buttons („Loop\nFinder“, „Beat\nSnap“ etc.) were cut off — QPushButton padding in all themes reduced from 10 px to 5 px vertically.
0.69 — Rules: BPM conditions + auto-detect action; central path resolution (2026-05-03)
Rules — new conditions
- BPM set: checks if the current song has a BPM value set (
base_bpm > 0) - BPM not set: counterpart — song has not yet set a BPM value
Rules — new action
- Auto-detect BPM (Group „Audio“): Starts the automatic BPM detection for the currently loaded song in the background — identical to the „Auto BPM“ button in the song data widget, but can be triggered as a rule action (e.g., via trigger „Song Changed“ with condition „BPM Not Set“)
- Result is saved in the DB and the BPM field in the song data widget is updated immediately
- Runs idempotently: second call during ongoing detection is ignored
- „BPM is being determined …„-Overlay during detection (similar to the auto-loop overlay)
Central path resolution (BL-104)
PathManager.find_lyric_file(filename)new — searches for lyric file in the configured lyrics folder (equivalent tofind_song_file())SongDataWidget._on_auto_bpm(): now usesfind_song_file()instead of directmusic_dir-Join — finds songs in all 4 music slotsLyricsWidget._load_lyrics_file(): now usesfind_lyric_file()instead of directlyrics_dir-Join
Bug fixes
- TIC-0016: Auto-BPM button did not respond to click — the cause was
music_dir-Join that only searched Slot 1; fixed byfind_song_file()(part of the central path resolution) - TIC-0023: Functions ignored alternative music/lyric paths (Slots 2–4) — fixed by central path resolution (BL-104)
- TIC-0007 / TIC-0022: Crashes without details could no longer be analyzed — structurally fixed by crash handler (BL-103): automatic logfile on every unhandled crash
0.68 — Player Widget Redesign (2026-05-02)
Player Widget: New Layout
- Info Bar (top row): 4 equally wide columns with labels on top and values below — Duration / BPM / Loops / Program
- BPM Display: now shows only the numerical value, „BPM“ is the column title above it
- Loop Count: now shows only „3/8„ or “∞„, column title is “Loops”
- Song Title + Status in a single line: title left-aligned, status right-aligned
- Song title dynamically scaling: uses all available vertical space of the player card, font grows from the theme base size up to +13 px — with line break when space is limited
- Status Text remains permanently in a small fixed font size (font_size − 2), does not scale with the title
Section Bar New
- 7 QPushButton segments instead of custom paintEvent
- Shape-based coloring: O/M/C (structural markers) in red, 1/3 in light gray, 2/4 in dark gray — the pattern of the Singing Calls is immediately visually recognizable
- Colors via new skin keys
sec_o,sec_1,sec_2,sec_m,sec_3,sec_4,sec_c— stored in all 4 skins (default, light, win11, elegant)
Transport buttons: SVG icons
- Play, Pause, Stop, and Fade-Out receive SVG vector symbols
- Color of the icons dynamically follows the theme setting
button_text— no separate SVG files needed per theme - Fade-Out arrow points to the right (→)
- Play button: full width, minimum height 44 px, accent color from the theme
Theme-relative font sizes in the info strip
- All font sizes relative to
font_size- Skin settings - Label text:
font_size − 2px - Value labels (BPM, Loops):
font_size + 1px - Duration timer:
font_size + 2px, monospace bold
Space-saving adjustments (Laptop optimization)
- Loop widget: Button heights reduced from 52 px to 38 px, NEW button from 38 to 32 px, spacing from 6 to 4 px,
addStretch()removed from the bottom edge, bottom margin shortened to 4 px — saves ~100–120 px total height - Program button in the info strip: height limited to max. 24 px, internal padding reduced
- Song title area: maximum height capped at 52 px (prevents excessive whitespace between title and playtime)
- Minimum height player widget: 380 px (previously 420 px)
0.67 — Crash handler, media keys, bug fixes (2026-05-01)
New: Crash handler (BL-103)
- New module
crash_handler.py: automatically catches unhandled Python exceptions - On every crash, it will
crash_YYYYMMDD_HHMMSS.logsaved in the app directory - Log contains: timestamp, song, location, full stack trace, the last 25 user actions (ring buffer)
- On the next app start, a hint dialog will appear with a „Show Log“ button (opens text editor)
- Logged actions: song loaded from list, song loaded from playlist, play started, location changed, planner confirm
Media and Fn keys as rule trigger
- Volume+, Volume−, Mute, Media Play/Pause, Media Stop, Media Next, Media Previous, Brightness+, Brightness− are now available as triggers in the Rule Engine
- Intercept via app-wide EventFilter (similar to F13–F24) — works when the OS doesn't swallow the keys system-wide
- New diagnostic script
2_Test/key_monitor.py(+.bat): shows the key code, trigger name, and whether Callers Caddy would process it for each pressed key — helpful when setting up Stream Deck / wireless remotes
Statistics dock: context menu (BL-102)
- Right-clicking on a song in the TOP / FLOP / Never played lists opens a context menu
- „Add to Playlist“ → Song goes directly into the current playlist
- „Add to Notes“ → adds a
[load_song "Title"]-shortcode as a new note
Bug fixes
- TIC-0019 Planner: Loop data was not updated after rule execution — loop count dialog now reads data fresh from the DB
- TIC-0020 Manage dance programs: column header „Target Duration (min)“ was cut off — column now automatically adjusts to the header text
- TIC-0021 Statistics dock: alternating row colors had too little contrast —
alternate-background-colornow defined for all 4 skins - Statistics dock → „Add to notes“ crashed when the notes dock had never been opened before (
notes_widgetnot yet lazy-initialized) — Fix: synchronous init before access (found by the crash handler in its own session)
0.66 — Bug fixes (TIC-0015, TIC-0017, TIC-0018) (2026-04-30)
Bug fixes
- TIC-0015 Lyrics zoom level is now correctly restored at app startup — zoom value and auto-size state are saved in the INI and applied immediately at the next startup
- TIC-0017 Loop Count Dialog in the Planner now finds songs in music folders Slot 2–4 — Function
show_loop_count_dialognow usesfind_song_file()instead of just Slot 1 - TIC-0018 Rule action „Load Layout“: Dropdown now shows all saved layouts from the
skins/folder —layout_names_providerconnected, TODO stub replaced
0.65 — Statistics Dock (BL-019) (2026-04-29)
New Dock: Statistics
- New dockable, lazy-loaded window „Statistics“ in the view menu (tabbed with Reports)
- Filter (top): Location (All or individual), Type (Both / Pattern / Singing), Time period (All time / 5 years / 1 year / 3 months / 1 month)
- Three columns (scrollable, all songs without limit):
- TOP — all played songs, most played first, with play count
- FLOP — all played songs, least played first, with play count
- Never played — all songs without play in the current filters, alphabetically
- Double click jumping to a song goes directly to the song list
- Histogram (full width): Distribution of all songs by play count
- Bin 0 is always fixed for „never played“, then 9 logarithmically distributed bins
- Color gradient from blue (cold = rarely) to orange-red (hot = often played), regardless of the skin
- Tooltip on each bar shows bin range, number of songs, and up to 5 example titles
- Translations DE + EN are fully available
0.64 — First Steps package, tutorial overhaul, playlist improvements (2026-04-28)
Example project for newcomers (first-steps/)
- first-steps/-folder is included with every new installation
- Contains „YRR 049 – Electro Blues.mp3„ by Jon Hansell Nilsson (kindly provided) and the corresponding lyrics sheet “YRR 049 – Electro Blues.htm". Yellow Rock Records offers free pattern music. Definitely give it a try.
- The lyrics sheet humorously addresses the functions of Callers Caddy
build.py: Step 3 copies1_Source/first-steps/automatically into the app folder
Tutorial: New Songs Tour (completely revised)
- Renamed from „Loop Tour“ to „New Songs Tour“
- Menu order: New Songs Tour now directly after Player Tour (Priority 97), Loop Finder directly below (Priority 96), Beat Snap afterwards
- Step 1 (Import button): Explicit call to action with step-by-step guide through the three import dialogs — Song type „Both“, copying, individual files from first-steps/
- Step 2 (Auto-Loop): Loop Finder as the second step instead of manual in/out setting — manual buttons and beat snap removed from the tutorial
- Song data tutorial expanded to Step 4: „Link lyrics sheet“ with reference to first-steps-HTM
Song list: Add song to playlist
- → Playlist button below the song list (next to „Update list“ and „→ Note“)
- Right-click context menu of the song list: new entry „Add to playlist“
- „→ Note“ button moved down from the search bar to the button bar
Playlist: Remove songs
- ✕-Button next to the arrow keys ▲ ▼ removes the selected song immediately
- Right-click context menu: „Remove from Playlist“ at the top (before separator)
- Delete key: QShortcut with
WidgetWithChildrenShortcut-context — works independently of which child widget has focus
0.63 — LoopFinder Lazy Init, Mapping Export/Import, Sequence Export (2026-04-27)
LoopFinder: Lazy Initialization
LoopFinderWidgetis no longer created at startup, but only when the window is first opened- Saves ~100ms startup time on weak hardware (Notebook: addDockWidget was 106ms)
- Waveform + jump areas are displayed immediately upon opening (no manual „analyzing“ needed for the preview)
- Song info will be provided if a song is already loaded when opening
setFloatingandrestoreGeometryof the dock window also viaQTimer.singleShotbyshow()moved
Mapping Export/Import (Sequence Menu)
- Export mapping…: Saves all
call_text_mappingsas a JSON file (call_text,entity_id,mapped_by) - Importing mapping…: Reads JSON, adds new entries (
INSERT OR IGNORE), skips already existing ones - Feedback: „X new mappings imported, Y already existing (skipped)“
- For new entries, remapping is automatically triggered
Export sequences (JSON)
- New menu item Export sequences (JSON)… after the three import points
- Exports all sequences in exactly the same format as the JSON import expects (
id,calls,level,seq_type,difficulty) - Exported file can be directly imported again via „Import sequences (JSON)“
UI detail
- Arrow buttons (◀ ▶) and note button in the sequence detail window now have a uniform height (40px) — better accuracy on laptops
Project documentation
CLAUDE.md:setFloating(True)on Windows takes ~90ms (once per floating dock context) — only moves between buckets when deferred, does not save overall time
0.62 — CallMatcher & sequence UI improvements (2026-04-27)
Call mapping: Intelligent auto-suggestion (CallMatcher)
- Three-stage matching fully in
sequence_mapper.pyoutsourced — no API costs, runs locally in milliseconds - Stage 1: Exact match after normalization (prefixes/suffixes removed) → Score 1.0
- Level 2: Bidirectional Token-Overlap (geometric mean of Precision × Recall) → Score up to 0.92
- Level 3:
difflib.SequenceMatcheras fallback (only if Token-Score ≥ 0.30) → Score up to 0.85 - Color coding of the call text lines in the mapping dialog:
- 🟢 Green (Score ≥ 0.85): safe suggestion
- 🟡 Yellow (Score 0.50–0.84): uncertain suggestion, manual review recommended
- 🔴 Red (Score < 0.50): no usable suggestion
- Green also for already mapped entries
- Old
_normalize_call_text/_norm_index-System inmain.pythroughCallMatcher-Import replaced
Sequence table: UX improvements
- Level, Type, and Difficulty columns hidden (
setColumnHidden) — Sequence fills the full table width - Type filter dropdown starts with „Singer (Corner progression)“ as default value (most common type)
- Bugfix:
ResizeToContentsin Type column allowed the Sequence column to shrink when many rows had the same long type
Performance logging
- New measurement points:
SequencesWidgetandSequenceViewWidgetmeasured separately - New measurement point:
_build_menu(was previously insong_list.refreshhidden) - New measurement point:
_init_sequencesintern divided (load_sequences+sequence_view prefill) - Bugfix: LoopFinder-Split incorrectly displayed notes time (
_td10→_td10b)
0.61 — Sequences Import & Call Mapping (2026-04-26)
Sequence table expanded
- New columns
typeanddifficultyin thesequences-table (Migration idempotent) insert_sequence()now takesseq_typeanddifficultyin- New DB methods:
get_sequence_type_values(),get_sequence_difficulty_values()
Sequence UI expanded
- Table: from 3 to 4 columns — Sequence (Stretch, immediately visible), Level, Type, Difficulty
- Second filter row with Type– and Difficulty-Dropdown
- All filters (Contains, Limit, Type, Difficulty) apply consistently in table, navigation, and shortcodes
New import formats in the „Sequences“ menu“
- JSON import (
import_from_json): loads one or more JSON files, appends sequences - CSDS Import (
import_from_csds): loads Vic Ceder’s.in/.csds-export format; parses#EASY#/#REC=/#SEQTYPE=-metadata and cleans uptext-markup automatically - Deduplication via Ceder record ID during multiple imports
- Last import directory is remembered in the settings
Call Mapping Dialog
- New menu item „Call-Mapping…“ in the sequences menu
- Table of all unmapped call texts, sorted by Frequency (most frequent first — an entry can heal many sequences at once)
- Right column: editable ComboBox with Contains-autocomplete — opens only on click (Delegate, no pre-rendering)
- Lazy Loading: only 20 rows initially, more when scrolling to the end
- Yellow highlight for texts without auto-suggestion
- Auto-suggestion through normalized text comparison: prefixes (Heads/Sides/Centers/Boys/Girls…) and suffixes (numbers, fractions, brackets) are trimmed
- Special option „→ Split at comma“: Calls like
"Flutter Wheel, Sweep 1/4"are split directly in the sequences — subsequent fields automatically shift to the right - Special Entry „Filler Words“ (TO=0.001) for filler phrases that have no real level — prevents NULL in level calculation without distorting the result
- After saving, it will automatically
recompute_sequence_max_to()trigger
0.60 — F13–F24 Key Triggers (2026-04-25)
Enhanced F-Key Support
- F13–F24 are now fully functional rule triggers — appear in the trigger dropdown of the rule editor
- Capture dialog correctly recognizes F13–F24 when pressed and displays them as „F13" etc.
- Intercept via the app-wide EventFilter (more reliable than QKeySequence strings, which Qt does not parse for F13+)
- Useful for USB remote controls and macro pads that send extended function keys
0.59 — Shortcodes in notes & Rule Editor groups (2026-04-24)
Shortcodes in notes (BL-093)
- Shortcode syntax in notes:
[load_song "Title"]loads a song;[sequence_view id=42]/[sequence_view contains="Swing Thru" limit="MS"]opens the sequence view with optional filter - Shortcodes are triggered when manually checking off a note as well as via
notes_tick_top-rule - New module
shortcode_parser.pywith robust regex parser (positional and named parameters, integer detection) - → Note button in song list, playlist, sequence overview, and sequence detail: adds the current entry as a shortcode to the note list
- → Filter button in sequence overview: adds the active contains/limit filters as
[sequence_view]-shortcode - Right-click menu (context menu) in song list, playlist, and sequence table: „Add to notes“
- Warning when no location is selected and a note is to be added
- Song title is taken into the shortcode without display suffixes (type, label, quality)
Rule editor: actions grouped
- The 43 rule actions are now organized into 10 categories : Transport · Audio · Layout & Docks · Lyrics & Scroll · Sequence View · Notes · Workflow · Photo · Genre · Info & Warnings
- Non-selectable group headers in the action dropdown for better clarity
- Order of actions within the groups logically sorted
- Existing rules remain fully compatible — only the display changes
0.58 — Sequence Detail as a real dock (2026-04-24)
Sequence Detail as QDockWidget (BL-092)
dock_sequence_viewis now a fully functional dock widget — no more temporary popup dialog- Can be treated like all other docks:
dock_open,dock_close,dock_fullsize,dock_focus,dual_view, Layout-Save/Restore - Clicking on a line in the sequence overview updates the detail dock and brings it to the front
- In the rule editor under the short name
sequence_viewavailable (e.g.dual_viewwithdock_left=sequences+dock_right=sequence_view) sequenceview_maximizeopens the dock as a floating 90 % window — no more conflict with the dual view- Navigation (◀/▶, Keyboard ← →) remains intact;
sequenceview_prev/sequenceview_next-Rule actions control the dock directly - All rule action names in English:
sequenceview_*(instead ofsequenzview_*) - Filter Sync: If the user changes the Contains or Limit filter in the sequence view, the detail dock automatically jumps to the first sequence of the new result list (only if the dock is visible)
- Startup pre-fill: When the app starts, the detail dock is immediately filled with sequence 1 — no empty window on first opening
0.57 — SequenceView Navigation & Fullscreen (2026-04-24)
SequenceView — Navigation without closing the dialog (BL-089)
- ‹ / › buttons in the sequence view: scrolls through the currently filtered list
- Position display „3 / 12″ between the buttons — Caller sees immediately where they are in the list
- Keyboard support: ← / → arrow keys also navigate (ideal for hands-free operation)
- Buttons are automatically disabled at the beginning or end of the list
- Navigation always refers to the complete filtered list (not just loaded rows)
- New DB method
get_filtered_sequence_ids()returns all matching IDs for navigation
SequenceView — Auto-Zoom & free window size (BL-090)
- Freely resizable: Dock can be resized as needed
- Growing text: Font size of the calls automatically adjusts to the available window height — sequence optimally fills the window
- ◀ / ▶ Buttons in uniform size (font-size 16px)
- Position Label „X / N“ uses the font color of the active theme
SequenceView — Rule Actions (BL-091)
sequenceview_open: shows the detail dock with the current table selectionsequenceview_close: hides the detail docksequenceview_prev/sequenceview_next: scrolls by rule/Shortcut to previous/next sequencesequenceview_focus: brings the detail dock to the frontsequenceview_maximize: makes the detail dock a floating 90% window- Auto-zoom bidirectional: font size is also corrected upwards if the first estimate was too conservative
0.56 — Dual-View & Song List Quick Navigation (2026-04-23)
Dual-View: two widgets side by side (BL-077)
- New Rule Action
dual_view: Opens any two docks as floating windows side by side — together 90 % screen width and height, centered with 4 px spacing - Flexible aspect ratio: Choose from
50:50,33:67or67:33directly in the rule editor - New Action
dual_view_close: Closes both dual view windows and docks them back - New Action
dual_view_toggle: A key press opens the dual view (layout is automatically saved), a second key press restores the original layout exactly — ideal as a keyboard shortcut - All three actions appear with English display names in the rule editor; parameters
dock_left,dock_rightandsplitas familiar dropdowns - Most common combination: Lyrics left + sequences right, 50:50
0.55 — Planner Loop Dialog & Double Click Fix (2026-04-22)
Planner: Loop Dialog pre-filled with target pattern length (BL-085)
- Loop Count Dialog in the Planner and Playlist Widget now automatically takes the target pattern length of the active dance program as the default (instead of fixed 7 min)
- If no dance program is set, the default value remains 7 min
Playlist Widget: Double click on Loops column (BL-085)
- Double click on the Loops column in the Playlist Dock now opens the same Loop Count Dialog as in the Planner — number and time settings directly editable
- Reliable triggering via
mouseDoubleClickEvent-Override in_PlaylistTable, which bypasses a known Qt-6 timing conflict between DragDrop mode andcellDoubleClicked-signal
0.54 — Dance Program System & Location Extensions (2026-04-22)
Dance program display in Player (BL-083)
- New button
btn_programin the player info line (next to BPM): shows the currently set dance program abbreviation (e.g.MS,A1 Class) - Quick Selection Dialog: Clicking the button opens a grid of all configured programs as buttons — Button width automatically adjusts to the longest text
- 14 Default Programs: MS, MS Class, PL, PL Class, A1, A1 Class, A2, A2 Class, C1, C1 Class, C2, C2 Class, C3A, C3A Class — each with configurable target pattern length (default 7 min)
- Management Dialog via Menu Database → Manage Dance Programs: Create, rename, adjust order and target pattern length, delete programs
- New DB Table
dance_programs; existing installations will automatically receive the default programs at the next start (INSERT OR IGNORE)
Location Settings: Dance Program & Temporary Tempo (BL-084 + BL-086)
- New „Settings“ Button in the location dialog: opens a settings dialog for the selected location
- Dance Program Assignment per Location: When selecting a location, the saved dance program is automatically set in the player
- Temporary Tempo per Location: SpinBox (50–150 %, default 100 % = no influence). When changing locations, the saved value is automatically transferred to the „Temporary Tempo“ field — practical for classes and beginner groups with fixed tempo brakes
- New DB Columns
dance_program_idandtemp_tempoin thelocations-table (migration for existing installations)
0.53 — Class Designer: Review & Optimize, Notes Refinement (2026-04-20)
Class Designer — Review & Optimize (new)
- „Review“ button in column 3: explicitly triggers overload/underload coloring of the day headers and spacing rule check
- Orange marking for teaches that violate the Prereq-Delay rules (previously red) — clearly separated from the red overload day header
- „Optimize“ button: iterative Local Search (Best-Improvement Hill Climbing) on the existing plan — does not replace generator reassignment, but retroactively resolves violations and load imbalances
- Objective function:
Violations × 10,000 + Σ(Load − Ø)²— Constraint violations dominate strongly, load variance is fine-tuned underneath - Respects manual drag changes in column 3
- Hard constraints are checked per move: Prereq-Delay, successor delay, repeat after teach, no double repeats on the same day
- Converges deterministically (max. 200 iterations); typically significantly faster
- Algorithm classification (RCPSP / Sprint Rebalancing) documented in
docs/16_class_designer.md
Class Designer — UX improvements
- Effort fields as a row of buttons instead of ComboBox: all Fibonacci values (1, 2, 3, 5, 8, 13 or 0–13 in info) as toggle buttons directly visible — one click instead of opening a dropdown
- New entries behind marked element: With „+ Call“ and „+ Info“, the new element is inserted behind the currently selected one (instead of at the end) and automatically marked — sequential insertion flows naturally
- Effort filter in column 2: Toggle button row
0 | 1 | 2 | 3 | 5 | 8 | 13between the toolbar and the planning table. By default, all active — allows you to quickly check if calls with the same effort are also similarly demanding n_eveningsis stored in the Col3 widget so that optimization works with the correct frame even after manual changes
Notes widget — Display & Editing
- Top open note enlarged 4× (BL-079): The currently most important note is prominently displayed as a large, bold heading — enlargement factor configurable in INI (
notes/first_note_factor, Default 4.0) - Compact line spacing for long multi-line text: The label now renders word breaks itself (instead of using Qt’s standard line height) and uses about 90 % of the font size as line spacing — saves significant space in the large first line without cutting off descenders
- Word wrap for very long notes: text wraps neatly within the line, line height increases with
- Double-click to edit: Left double-click on a note line opens an edit dialog with a multi-line text field — styled according to the theme, language follows UI setting (DE/EN),
Ctrl+Enterconfirms - Zoom buttons +/− still active — the new rendering logic respects the zoom level
- New DB method
update_note_text(note_id, text)insong_db
Rule system
- New Action
notes_tick_top(BL-080): Checks off the top open note of the active location — useful for keyboard shortcuts or timer events. Silently ignored if the list is empty (no error message)
Internal cleanup
- New helper widget
_ValueButtonRowfor exclusive value selection (reusable for other discrete selections) - Helper
_insert_after_selected()in Col2 — centralizes insert logic - New QLabel subclass
_TightLabelwith its ownpaintEvent+ manual word wrapping for precise line spacing control - New modal dialog
_NoteEditDialog
0.52 — Class Designer (prototype) & tracking fix (2026-04-17)
Class Designer — First prototype
- Note: This is the first prototype of the Class Designer — further refinement is definitely needed
- More even point distribution per day: Switching to greedy bin filling. Each day will be filled up to the target budget (total points / number of days) before the next day is filled
- Respects repeat constraints: Repeating the same figure still maintains at least 1 day gap; prereq delays remain intact
- Avoids underfilled days: If a repeat jumps forward due to
earliest-constraint, the day pointer stays back — subsequent teaches fill the remaining day instead of leaving it empty
Loop Finder — time display under search areas
- Play times under the percentage fields: Under each of the 4 percentage fields (Loop-In Start/End, Loop-Out Start/End), the actual playtime of the loaded song is now displayed in the format
m:ss) (e.g.0:53). This way, the caller can quickly see where in the song the search area is - Display updates live when entering percentage values and when dragging the waveform handles
- Uniform line height: Preset ComboBox and Load/Save buttons now use the same height as the percentage SpinBoxes
Bugfix — Playback History
- Tracking only on actual play: Previously, the „Last Played“ column was updated when simply selecting/loading a file. Now, the timestamp is only set when the Play button is actually pressed. The song does not need to play through completely
- The DB entry in
play_historywas already correct, only the UI column was ahead
0.51 — Notes Widget Improvements (2026-04-15)
Notes Widget — Redesign & new features
- Export folder
notes/: New subfolder will be created automatically; is the default location for loading/saving JSON files - Background color: „Done“ list now has the same background color as „Open“ list — uniform appearance
- Export marking: Selection checkbox replaced by
_SelectToggle(○ / ✓) — no more Qt-QSS issue with invisible checkmark - Drag highlight: Dragged row gets colored background + left border (accent color) while moving
- Select all / Deselect all: Two new buttons
All ✓andAll ○for quick export selection - Zoom controls:
−/100%/+top right — only changes the font size of the list entries; icons from the active skin - Zoom persistence: Zoom setting is saved in INI (
notes/zoom_pct) and restored at the next start - Timestamp when done: Completion time is displayed in the format
[DD.MM.YY HH:MM]behind the text - Import order: Notes loaded from JSON are inserted at the top in the correct order
- Done toggle: ☐ (open) / ☑ (done) — pen experiment undone
Loop active checkbox — accessibility
- Visible checkmark: All 4 skin QSS files extended —
QCheckBox::indicator:checkednow shows a white check mark (check.svg) on a colored background
Sequences Widget
- Zoom persistence: Zoom setting is saved in INI (
sequences/zoom_pct) and restored on startup
Performance
- Notes Dock lazy: Widget is created only on first opening (like Reports, Potential, Photo) — no startup overhead
0.50 — Freely assignable key triggers (2026-04-09)
Create key triggers yourself (BL-064)
- New button „+ Key“ in the rules dialog next to the trigger selection
- Click opens mini-dialog: User presses any key — the trigger name is automatically determined
- Supported keys: A–Z, 0–9, F1–F12, Space, Return, Delete, Tab, Escape, Insert, Backspace, Home, End, PageUp, PageDown
- After creation, the new trigger immediately appears in the trigger list and can be assigned to a rule
- Persistence: New triggers are automatically restored at app startup if at least one rule is linked to them
- Focus Safety: Key triggers do not fire when a text field or search is active — these always take priority. This automatically applies to all future triggers.
- Dynamic eventFilter: No longer hardcoded — all registered
key_*-triggers are automatically recognized and forwarded
0.49 — Label recognition (bidirectional), Lyrics co-import (2026-04-08)
Label recognition — bidirectional file naming
- Format 1 (Title-Label):
Ring Of Fire-RYL818.mp3→ Title: „Ring Of Fire“, Label: „RYL818“ - Format 2 (Label-Title):
RYL818-Ring Of Fire.mp3→ Title: „Ring Of Fire“, Label: „RYL818“ - With spaces in the label:
YRR 043a-Dunderklumpen.mp3orDunderklumpen-YRR 043a.mp3 - Regex pattern: letters + optional space + digits + optional suffix (a/b/+)
- Supported label formats:
BVR113,RYL818+,YRR 043a,RBS 1326
Lyrics co-import
- When importing MP3s, a file with the same name (without extension suffix) is automatically searched for.
- Source folder (Import folder): RTF/HTML/TXT file is copied to
lyrics/-folder - Lyrics folder: Already exists → will be linked directly
- Supported lyric formats:
.rtf,.htm,.html,.txt - Log output:
[Import] Lyrics linked:upon successful assignment
0.48 — SqView Migration, Blind Import, Theme Fix (2026-04-08)
SqView Migration (BL-011)
- Folder Selection: User selects the SqView folder directly via Explorer —
sqview.db,MP3/andtext/are automatically recognized - Blind Import: Songs are fully entered into the DB even without existing MP3 files (filename as placeholder). MP3s can be added later via normal file import — existing entries will be automatically activated instead of skipped as duplicates
- Complete Song Recognition: Reads all ~200 songs
markext1/2/3+track-table (not just the ~10 with explicit settings in themusic-table) - Recursive MP3 Index: Searches all subfolders (
patter/,singer/,Karaoke/etc.) - Lyrics-Matching: 4-stage regex strategy — exact title, label strip (
- RBS 1234), normalization (alphanumeric), combination - Loop and pitch takeover: values from the SqView-
music-table are taken over - Playback History: Off
track-Table with date/time and location assignment - Music folder is optional (blind import works without it)
- MP3 count in the status display is now recursive
Activate blind import (file import)
- During normal MP3 import: If a DB entry for the filename already exists, but the file is still missing in the
music/-folder → file will be copied and the song activated (instead of skipped as a duplicate)
Bugfix: Song Data — light background in the default theme
QScrollArea-Viewport and its content did not receive a dark background (Qt stylesheet inheritance does not cross viewport boundaries)- Fix in all 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 replaces the old reset button: shows all saved presets, „Standard“ cannot be overwritten
- Load-Button: Applies the selected preset to search areas, comparison windows, and strategy
- Save-Button: Always active — for „Standard“, an input dialog for a new name appears, for user presets it directly overwrites
- Presets as JSON files in the folder
loop_presets/— portable and editable - Strategy ComboBox in the analysis line: shows all available selection strategies (currently: „Best Multiple of 64 Beats“), saved and loaded with the preset; additional strategies can be added at any time
- Rules action „Auto-Set Best Loop“ now has parameters
preset(Dropdown of all saved presets) - Loads search areas, comparison windows, and strategy completely from the selected preset
- New
preset_choice-Parameter type in rule_widget.py withpreset_names_provider
CrossFade in Beat Snap (BL-067)
- New toggle button CrossFade between snap and preview
- When active: preview of the loop jump with the same crossfade as in normal operation
- Automatically deactivated with every load and every waveform change
Taskbar icon laptop fix
cc-logo.pngis copied to the app root during build (previously only available on build machine)
0.46 — Live volume (BL-070), UI equal grid player (2026-04-07)
Live volume / minimum volume (BL-070)
- New Live vol slider in the player (4th column next to current tempo / song tempo / pitch)
- Artifact-free volume change via Windows WASAPI (pycaw) — outside the audio stream, no crackles during fast movements
- Reset to 100% on each song change (not persistent)
- INI setting
audio/min_volume(Default0.0): Slider cannot be lowered below this value - Will be automatically written to INI on app start if missing
- Graceful Degradation: without pycaw (no Windows device) the function remains silent, app continues to run normally
Rules action: change live volume
- New Action „Change Live-Volume (±)“ with adjustable
deltain percentage points (−100 to +100, Default −10) - Automatically respects the
min_volumelimit from the INI
UI: Player rows in a uniform 4-column grid
- Row „Current Tempo / Song Tempo / Pitch / Live Volume“:
QGridLayoutwithcolumnStretch=1+QSizePolicy.Ignored→ exactly equal-width columns - Row „Location / Planner / Lyrics / Loop active“: also transferred to the 4-grid, aligned with the row above
- Labels with
setWordWrap(True)— no text expands its column
0.45 — Genre system, Rules Drag&Drop, Bug fixes (2026-04-06)
Bug fix: Reports and potential dock crash on first opening
setFloating(True)invisibilityChanged-Handler triggered re-entrant signal call → crash- Fix: immediately disconnect signal + initialization via
QTimer.singleShot(0, ...)reset - Affects
_on_reports_visibilityand_on_potential_visibility
Genre / Tags (BL-063)
- Songs can have multiple genres/tags (Many-to-Many)
- 65 default genres from Square Dance labels + musicforcallers.com (decades, styles, artists, themes, Square Dance specific, NEW)
seed_default_genres()is idempotent — only adds missing genres, existing ones remain- Genre management (Menu Database → „Manage genres...“):
- List of all genres with song count
- Create, Rename, Delete
- When deleting with assigned songs: option to „Redirect to another genre“ or „Simply remove“
- Song record: Genre tags as clickable display + „…“ button opens checkbox dialog
- Create new genre directly in the dialog possible
- Changes are saved immediately
- Import keyword matching: When importing, genres are automatically suggested from the filename (e.g. „Christmas“ from „Xmas Song.mp3“)
- Rules actions: „Add Genre to Song“ and „Remove Genre from Song“
- Parameter as dropdown of all existing genres (no free text → no duplicates)
- New
genre_choice-Parameter type in rule_widget.py withgenre_names_provider
Rules: Rearrange actions via drag & drop
- Each action line has a ≡-Handle (cursor ↕) on the left
- Dragging moves the line live to the new position
- Order of actions is saved immediately
- Bugfix:
_on_action_type_changedhad wrong index after handle insertion (combo was removed instead of params)
0.44 — Multi-music paths, import copy/keep (2026-04-05)
Multiple music directories (up to 4)
- Up to 4 music paths configurable (Slot 1 = main folder, Slots 2–4 optional)
find_song_file()searches in order Slot 1 → 2 → 3 → 4, returns first hit- New dialog „Manage Music Paths“ (Menu Paths) with browse + clear per slot
- Menu text: „Change Music Directory“ → „Manage Music Paths“
- Migration: Old INI key
paths/music_dirwill be automatically transferred topaths/music_dir_1transferred - Good for callers with program data on one drive and music files on another drive
Import: Copy or leave in place
- New intermediate dialog after song type selection: „Copy files?“ or „Leave in place“
- Copy: previous behavior — files go into the music/-main directory
- Leave: files stay where they are, only a DB entry is created
- When leaving: if the source folder is not yet registered as a music path, ask if it should be added as a free slot
- If all 4 slots are occupied: notification message referencing the management dialog
Single-instance lock more robust (Race condition on double click)
- Replaces QLocalServer/QLocalSocket with atomic QLockFile
- Double-clicking run_test.bat or EXE no longer starts a second instance
Minimum width for player and loop dock
- Player dock: min. 340px — prevents unreadable squeezing
- Loop dock: min. 400px — all 4 buttons remain readable side by side
Performance optimization on startup (−22% on laptop)
- Reports dock:
setFloating(True)is no longer set at startup, but only when first opened (lazy) → −318ms on laptop - Potential dock: same optimization → −137ms on laptop
- Total savings on laptop: ~526ms (2415ms → 1889ms)
- Note for customers: On the first start after an update, the app may take a few seconds longer — Windows Defender scans the new files. From the second start, everything is normal.
0.43 — UI minimum heights, song data scroll, initial voice query, quick win bundle (2026-04-04)
New rule action: Change song tempo (persistent)
song_tempo_changeadded to the previoustempo_change- tempo_change (renamed to „Change Today’s Tempo (±%)“): today's tempo, not persistent
- song_tempo_change („Change Song Tempo (±%, persistent)“): changes the song tempo and saves the value through the existing auto-save chain on the song in the database
- Parameter:
deltaas integer percent, clamp 50-150%
Import/Migration fault-tolerant (BL-065)
- Manual import: Per-file try/except — defective/unreadable files are skipped, session continues
- CC1 migration:
shutil.copy2per MP3 encapsulated, error logged, report at the end - SqView migration: same error resilience
- Also
player._load_file()at the end of the import fault-tolerant — a defective last file no longer interrupts the summary
Folder import with subfolders (BL-032)
- New intermediate dialog „Import source“: Individual files or folders (including subfolders)
- When selecting a folder, it searches recursively for .mp3/.wav/.flac/.ogg/.aiff/.aif
- Thorsten's long-term feature request fulfilled
Active tab more recognizable (BL-060)
QTabBar::tab:selectedin all themes withfont-weight: bold- Win11: Border increased from 2px to 3px, explicit
widget_bg-background - Default: additional 2px top border in selection color
- Light: Bold added, elegant was already bold
Import notice: where the songs end up (BL-062)
- After a successful import, the song list dock is automatically brought to the foreground
- Import summary contains new notice: „The new songs have been added to the song list.“
TIC-0014: Minimum player height on app resize
MainWindow.setMinimumSize()increased from (1100, 650) to (1100, 720)- Sum of player (350) + loop (240) + title bars + menu + status bar now fits in the minimum height
- The lower button row (Location, Planner, Lyrics) will no longer be cut off when resizing the main window
First start language query (BL-058)
- On the very first start (no language in INI), a dialog appears: „Start in English“ / „Start in German“
- Language is then saved in the INI, dialog appears only once
UI: Minimum heights against squeezing (TIC-0008, TIC-0013)
- Player buttons (Play, Pause, Stop, Fade Out, Location, Planner, Lyrics): minimum height 34px
- Player spin boxes (Tempo, Pitch): minimum height 24px with labels 16px
- Player widget overall: minimum height 350px, enforced again after layout restore
- Loop widget („New Songs“): minimum height 240px, buttons 52px, fixed spacing 6px
- Prevents unreadable UI on small screens or with high DPI scaling (e.g. 1.8x)
Song Data: ScrollArea (TIC-0012)
- The song data widget now has a vertical scrollbar instead of squeezing with a small dock
- All fields remain readable regardless of the widget height
Bugfix: „Title“ column not translated (TIC-0009)
- The „Title“ column in the playlist and planner is now correctly output through the translation system („Title“ in English)
Bugfix: Show/Hide buttons are now a real toggle (TIC-0010, TIC-0011)
_toggle_dock()was previously only show + raise — second click did not hide- Planner and lyrics buttons now hide the respective dock on the second click
- Special case for the back tab in the stack: dock is only brought forward, not hidden
- Sort preselect in the planner only runs when opening, not when closing
0.42 — Rules extensions, planner deletion, app menu & song display without file (2026-03-28)
New rule actions
- Go To Position (BL-044): Jumps to start, loop in, loop out, or end of the song. Position selectable via dropdown, uses crossfade parameters for a smooth transition
- Toggle Loop Active (BL-045): Toggles the loop checkbox on/off — controllable via keyboard shortcut or rule
Planner: Delete playlist completely (BL-049)
- New red ✖-button above the confirmation button in the planner
- Deletes the entire playlist after a confirmation dialog
Song data without audio file (BL-051)
- Song data and lyrics are now displayed even when no MP3/audio file is available
- Filename field is highlighted in red as a visual cue
- Warning now only in the status bar (no blocking popup anymore)
- Allows manual linking of a file or viewing migration data
App menu (BL-052)
- New first menu entry „App“ with „Exit“ — clean closing via the menu instead of just the X
Rules widget
- New parameter type „choice“ for dropdown selection in rule actions (e.g., GoTo position)
0.41 — Song management, photo widget, RTF cleanup & MDB extension tables (2026-03-27)
Delete song (BL-039)
- Songs can be deleted individually from the database
- Security query with option to delete history data (play_history, song_location_stats)
- Also accessible via the Delete key in the song list
Multi-file import with type selection
- When importing new songs, the song type is queried beforehand (Pattern / Singing / Both)
- Multiple files can be selected at once (Multi-File Dialog)
- Selected type is applied to all imported songs
Photo widget (BL-041)
- New dock widget with camera preview (QtMultimedia: QCamera + QMediaCaptureSession)
- RAM-only: Photos are only held in memory, no file system, no DB
- Lazy-init: Camera is initialized only when the dock is first visible
- QStackedWidget for switching between camera preview and captured photo
- Rules actions: photo_capture (start camera + timer) and photo_show (90% Screen)
RTF cleanup (BL-043)
- Lyrics import: Word junk from RTF files is automatically removed (datastore, themedata, colorschememapping, xmlnstbl, latentstyles etc.)
- Whitelist approach: Only known RTF groups (fonttbl, colortbl, stylesheet) are retained
- Up to 48% file size saved for affected files
MDB migration: Extended tables (BL-047)
- Access-parser monkey patches for extended CC1 tables (Off-by-One, Row-Count, Primary-Key)
- History-based reconstruction: If normal song fields are unreadable, songs are reconstructed from history
- Case-insensitive fallback for table and column names (access-parser delivers inconsistent casing)
- Windows Console: Unicode-safe log outputs (ASCII instead of special characters)
Bug fixes
- SqView migration ready for larger test data
0.40 — Loop count, performance optimization & multiple start protection (2026-03-26)
Loop count / time-controlled loop (BL-042)
- New feature: Caller sets desired pattern duration, Callers Caddy calculates the necessary number of loops
- Two options (one loop more / one loop less) with resulting total duration
- Loop count is displayed in the player (Loop X/N or Loop infinite)
- Singing Calls show „1“ instead of infinity symbol in the loops column
- Loop count per playlist entry (not per song), persisted in playlist files
- Backward-compatible playlist format: automatically recognizes old and new format
- Double-clicking on the Loops column opens the Loop Count dialog (Playlist + Planner)
Player improvements
- Song title on its own line (16px bold), info line below with timer + loop count + BPM
- Loop markers (Loop In / Loop Out) are displayed as vertical lines on the position slider
Playlist + Planner
- New column „Duration“ with calculated runtime per song (takes loop count into account)
- Total duration sum under the playlist — Caller can plan the whole evening
- Planner: Left and right areas can be resized using QSplitter
Performance optimization (Startup −55%)
- App start: 1724ms → 780ms through lazy initialization of reports, potential, and planner
- Song list: set_last_played_map now only updates the date column instead of table rebuild
- Playlist duration: Negative cache + inline sum (250 songs: 367ms → 5ms)
- Performance logging system:
perf_start()/perf_log()/perf_split() - Activatable via INI switch
debug/performance_logging = true
Multiple start protection
- Double app start is prevented (QLocalServer/QLocalSocket)
- Error message when Callers Caddy is already running
- Wait cursor (hourglass) during app startup
Translations
- New keys: header_duration, playlist_total, loop_count_per_loop, loop_count_before, loop_count_after, already_running
0.39 — SqView Migration, Song Volume & Improvements (2026-03-26)
SqView Migration (Beta)
- New migration path: SqView → Callers Caddy 2.0
- Reads sqview.db: Songs (Tempo, Pitch, Volume, Loops), playback history, lyrics assignments
- Auto-Detect: Music and lyrics folders are recognized from SqView INI
- Detailed log per song: MP3 status, lyrics, loop points, pitch, volume
- Post-processing report at the end: missing MP3s and lyrics listed
- Beta warning: „Still in testing phase. Use at your own risk!“
- Filename parsing: „Title-Label.mp3“ is automatically split into title + label
Song volume
- Volume field in song data is now applied to the audio engine (multiplicatively)
- Smooth ramp on volume change (~50ms), no crackling or popping
- Debounced DB save: only volume column, no lyrics reload on change
- Range limited to 0.0–1.0 (0%–100%)
Rules actions
- New action: „Change Pitch“ (±semitones, configurable step size)
- New action: „Change Volume“ (±factor, configurable step size)
Tutorial Menu
- New menu item „Finish All Tutorials“ (counterpart to „Reset All“)
- Ends the ongoing tutorial and marks all as completed
Potential widget
- FlowLayout for check buttons: buttons have full text width, wrap automatically in narrow dock
- Double-clicking on „Empty Location“ opens location dialog with the affected location pre-selected
Bug fix
- Keys P and L now work in song list/playlist for type-to-search
(previously swallowed by the app-wide event filter, even with rules disabled) - Tempo/pitch change no longer causes audio crackling (debounced save without lyrics reload)
0.38 — Lyrics Redesign, Tutorials & Bug Fixes (2026-03-25)
Lyrics Widget: As-Is Rendering (Architecture Simplification)
- Lyrics are now displayed 1:1 as original — just like in the browser or Word
- White background, regardless of the selected theme
- All colors (text color, background color, highlights) remain original
- Sanitizer radically simplified: now only CSS link resolution + font-size removal
- External CSS files (e.g. cuesheet2.css) are automatically inlined
- RTF Converter: Support for \highlight (background colors)
- RTF Converter: Correct handling of *\background and other header groups
- New button „Auto Width“: Scales text so that it fits the window width
- Auto Width also available as a Rules action („Lyrics Auto-Width“)
Tutorials
- New tutorial: Loop Finder (6 steps: waveform, search area, search window, analysis, results, apply)
- New tutorial: Rules (7 steps: rule list, new rule, name/active/once, trigger, conditions, actions, import/export)
Song Restart
- Play button during a running song = restart from the beginning (seek 0)
- No more need for stop + start, also usable via F5 rule
Bug fixes
- HTML lyrics with external CSS are now displayed correctly (TIC-0001)
- RTF lyrics with colors and highlights are displayed accurately (TIC-0002)
- App icon in title bar and Windows taskbar (TIC-0004)
- CP1252 encoding fallback when loading playlists (utf-8 error)
Ticket system
- New ticket system under 5_Tickets/ for error reports and questions
- TICKETS.md as an overview, one folder per ticket with attachments
0.37 — Rule engine & automation (2026-03-24)
Rule engine (new system)
- Completely new automation system: Triggers → Conditions → Actions
- 26 triggers: App lifecycle (start, song started/paused/stopped/resumed/changed), periodic timer, keyboard (F1–F12, Space, L, P), manager closed
- 9 conditions: Song type (Singing/Patter), Lyrics available/not, Loop set/not, Location chosen/not, Playtime over threshold
- 25 actions: Open/close dock/fullscreen/focus, Load layout, Play/Pause/Stop/Fade-Out/Toggle, Auto-Advance, Auto-Scroll Start/Stop, Change tempo, Status bar message, Log message, System ping, Warning background (traffic light), Location dialog, Manager toggle, Auto-loop finder
- Conditional logic: Flexible AND/OR groups (e.g. „Singing AND Lyrics available OR Patter AND Loop set“)
- „Once per song“ option: Rule triggers at most once per song
Rule editor (new widget)
- Dockable editor widget with split layout (rule list on the left, editor on the right)
- Search field to filter by name or trigger
- Sortable table: Active checkbox, Name, Trigger, Source (System/User)
- Dynamic parameter input fields depending on action/condition type
- Buttons: Add, Duplicate, Delete, Up/Down, Export, Import
System vs. User rules
- 13 pre-installed system rules (only active toggle editable, not editable):
- Singing Call → Lyrics fullscreen with auto-scroll (Start + Resume)
- Singing Call Stop/Pause → Return to default layout
- Song Stop → Auto-Advance
- Manager closed → Focus on playlist
- Keyboard shortcuts: F5=Play, F6=Pause, F7=Stop, F8=Fade-Out, Space=Play/Pause, L=Location, P=Manager
- User Rules: Fully editable, Import/Export as JSON, freely sortable
Rule Logging
- Own Log File
rules/rules.logwith categories: TRIGGER, MATCH, NO_MATCH, ACTION, ERROR, BLOCKED - Automatic rotation at 1 MB (keeps 500 lines)
- Helps diagnose why rules fire or not
Auto Loop Finder (Rule Action)
- New Action
auto_set_best_loop: Analyzes the song automatically and sets the best 64-beat loop - Prefers 64-beat loops, fallback to highest score
- „Please wait“ overlay during analysis (semi-transparent, disappears automatically)
- Can be triggered automatically by rule, e.g., at song start
Performance optimization
- Lazy waveform: Loop finder waveform is loaded only when visible (saves ~100-400ms during song change)
- Targeted song update: After playback, only the last-played column is updated instead of rebuilding the entire song list (~4-22ms instead of ~400-1200ms)
Loop widget: new button layout
- All 4 buttons (Set In, Clear, Set Out, Test Loop) in a flat row
- Buttons shrink when space is limited with automatic text wrapping
- Player column can now be pulled much narrower
Dock widget improvements
- Feature persistence: Dock capabilities (move/dock/close) are retained after layout restoration (Qt bug fixed)
- Smaller window sizes: Docks can now also be docked when the app is not in full screen (minimumSize fix)
Bug fixes
- Loop guard: Snapshot values of 0.0 are correctly recognized as invalid — prevents overwriting good loop values when closing
- Audition/beat snap: Playback in loop finder and beat snap is no longer logged in the play history
- Close Loop Finder: Automatically stops ongoing playback
- Resume Rule: Works reliably again after layout change (Focus-Restore after restoreState)
0.36 — Loop Finder & UI Reorganization (2026-03-21)
Loop Finder (new widget)
- New dockable window „Loop Finder“ — automatically searches for suitable loop points
- Similarity-based analysis: Compares phrases in the front and back song sections
- 8-beat numbering: All beats are counted 1-8, jumps only between the same beat positions
- Downbeat detection: Prefers candidates on estimated beat 1 (kick energy heuristic)
- Chroma-based harmony score (FFT → 12 semitones, purely with scipy/numpy)
- Adjustable comparison window: 4, 8, 16, 32 or 64 beats per ComboBox
- Adjustable search ranges: 4 percentage fields (default 7%/21%/64%/79%) with reset button
- Waveform overview with colored search areas (green = Loop-In, orange = Loop-Out)
- 4 movable handles (both sides per region adjustable with mouse)
- 7 Singing Call segments above the waveform (Opener, 1-4, Middle Break, Closer)
- White dashed marks indicate the selected suggestion in the waveform
- Sortable results table: Click on column header sorts by score, beat, time
- Audition function: Starts 5 seconds before Loop-Out, jumps, stops 2 seconds after Loop-In
- Budget-based loop mechanism: Callback counts output samples, no stretcher access from UI thread lag as loop in/loop out in the player
- Analysis runs in QThread (non-blocking)
- No new dependencies — everything with scipy + numpy
UI reorganization (Loop widget)
- Loop Active → Player: Checkbox moved from the Loop widget to the Player toolbar (right next to Lyrics)
- 3-column layout: Loop-In time and Loop-Out time are centered above their buttons
- Button row: Set Loop-In | Set Loop-Out | Test Loop next to each other
- New button row: Loop Finder | Beat Snap next to each other
- Fixed line height in 3-column grid (does not stretch with larger widget)
Loop Finder Dock
- Custom dock widget, cannot dock with other widgets (Qt.NoDockWidgetArea)
- Opens via the new „Loop Finder“ button in the Loop widget
0.35 — Guided Tutorials & Improved Loop Guard (2026-03-20)
Tutorial system (13 tutorials)
- New guided tutorial system with tooltip overlays and highlight frames
- 11 widget tutorials: Player, Layout, Song list, Song data, Planner, Playlist, Loop, Lyrics, Sequences, Reports, Potential
- 2 dialog tutorials: Locations, Beat Snap
- Priority-based order: Player → Locations → Layout → Song list → … → Potential
- Automatic chaining: After completing one tutorial, the next one is offered
- Tutorial offer can be declined: „Not now“ pauses tutorials for the session
- Step navigation: Next, Back, Skip + step display (e.g. „3 / 5“)
- Enter = Next, Escape = Skip
Tutorial Menu
- New submenu „Tutorials“ with all tutorials in priority order
- Checkmark (✓) before completed 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 all 4 themes
Beat Snap: „Adjust“ → „Snap“
- Button label changed from „Adjust“ to „Snap“ (including tooltip and status text)
Improved loop guard (database)
- Extended protection against accidental overwriting of loop values
- New guard 2: Detects the engine reset pattern (loop_in=0 + loop_out=Song duration) and protects saved values
- Previous guard only protected against 0.0, not against the song duration as loop_out
Win11 theme
- Zoom SVG icons: Stroke color changed from dark (#1b1b1b) to white (#ffffff) (better visibility on blue background)
0.34 — Keyboard Shortcuts & Elegant Gold Theme (2026-03-19)
Keyboard Shortcuts (App-wide)
- L-Key: Opens location selection dialog (focusing on location list)
- P-Key: Opens/closes Planner (focusing on pool table)
- App-wide EventFilter instead of QShortcut (also works with focused tables/lists)
- Modal dialogs automatically block shortcuts
- Text fields/SpinBoxes are recognized and not intercepted
- Planner sorting is automatically pre-selected (recommendation for location, quality otherwise)
Elegant Gold Theme
- New theme „Elegant Gold“: Anthracite base with radiant gold (#d4a017)
- Golden title bars, buttons, active tabs, header separators, and tooltips
- Disabled elements in a medium gold tone (#7a6a2e)
- Input fields and list areas with a light gold tone (#2e2a1f)
- SVG icons: arrows and dock buttons in black (#000000), magnifying glasses/gear in dark brown (#2a2518)
- Section bar segments (Singing Call 1/2/3/5) in medium gold tone
Focus management
- Startup focus on song list (prevents shortcut blockage by SpinBox)
- Floating dock activation:
activateWindow()beforesetFocus()for keyboard input - Location dialog: focus on list when entries are present, on add button when list is empty
Tooltip improvements
- Location and Planner buttons show shortcut hint in the tooltip (L) / (P)
0.33 — Potential Widget & Menu Redesign (2026-03-18)
Potential Widget (data quality)
- New dockable window „Potential“ — shows optimization potential in the song database
- 5 checks with badge counter on the buttons:
- Singing Calls without lyrics
- Patterns without loop marks
- Loops without BeatSnap optimization
- Locations without playback history
- Orphaned history entries (deleted locations)
- Double-click navigates to the affected object (song data, Beat Snap, location)
- „Ignore“ button: Mark individual entries as consciously accepted
- „Clean All“: Delete orphaned history entries in batch
- Lazy Loading: Data is loaded only when displayed
- DB: New table
potential_ignored(check_type + entity_id)
Delete location
- Delete function now works correctly (previously blocked by foreign key)
- Checkbox „Delete history data as well“ in the confirmation dialog
- Without checkbox: History remains as orphaned entries (visible in potential)
- With checkbox: History and stats are completely deleted
Menu redesign
- „Renamed “Design„ to “Settings„ / “Settings"
- Date format setting moved from view to settings
- Language setting moved from info to settings
- „Renamed “Skin„ to “Theme" (menu, dialogs)
- Date format label: „DE“ changed to „EU“ (valid across Europe)
Default layout (3-column)
- New 3-column layout as default on first installation and layout reset
- Column 1: Player on top, Loop/New at the bottom
- Column 2: Song list and playlist as tabs (song list active)
- Column 3: Lyrics, song data, and sequences as tabs (lyrics active)
- Planner, reports, potential hidden (can be revealed via menu)
Technical
- Layout version 3 (new dock requires layout reset)
- Dock setup order: First 3 columns horizontally, then split column 1 vertically
(prevents player from stretching across full width)
0.32 — Keyboard, File Selection & Loop Improvements (2026-03-18)
Keyboard & File Selection
- ENTER key: Load song from song list, add song from planner pool to playlist, remove song from playlist
- F-keys (F5-F8, Space) now also work with undocked windows (ApplicationShortcut)
- File selection button („…“) in song data: Change audio file afterwards
- For already assigned file: Copy dialog with automatic copy creation
- Extended audio format support: WAV, FLAC, OGG, AIFF alongside MP3
- Audio format filter also expanded in the import dialog
- New DB method
update_filename()with UNIQUE constraint check
Loop crossfade
- Seamless loop transition through crossfade instead of hard cut
- Crossfade duration configurable via INI
loop/crossfade_ms(Default 46ms) - Eliminates WSOLA ramp-up artifacts at the loop point (no flush/warmup needed)
- Budget-based loop mechanism: Callback counts output samples, no stretcher access from UI thread
- Fallback safeguard: Feed-level loop-back if UI timer misses the seek
Loop offset (per song)
- Automatic offset measurement via FFT-based cross-correlation (low pass <200Hz)
- Finds optimal offset between loop end and loop start in the bass range
- Search range ±2 seconds, selects the smallest offset with good correlation (>= 0.1)
- Offset is stored per song in the DB (
loop_offset_ms) - Manual fine-tuning via SpinBox in song data (±3000ms, 0.5ms steps)
- Auto-measurement at beat snap and loop test, result in DB + SpinBox
- DB migration: New column
loop_offset_msis created automatically
Bug fixes
- Play position display (time + slider) no longer gets stuck at pattern start with loop
- Loop markers are no longer reset to 0 when changing files
0.31 — Beat snap audition (2026-03-16)
- Beat Snap Dialog: Previewing the loop jump with waveform visualization
- Double waveform display (Loop-Out on top, Loop-In on the bottom) with cursor synchronization
- Playback sample counter (
_playback_sample) in audio engine for precise positioning - Engine loop is disabled during audition (prevents double jump due to feed-ahead)
- Layout versioning:
_LAYOUT_VERSIONprevents corrupt dock states during changes - Versioned
saveState()/restoreState()— altered state will be discarded automatically - Bugfix: Dock widgets could no longer snap after P30→P31 dock change
0.30 — BPM detection, reports, lyrics contrast (2026-03-14)
- Auto-BPM detection via comb filter bank (scipy/numpy, no new packages)
- Sub-harmonic correction: check integer multiples, prefer higher tempos
- BPM detection runs in QThread (non-blocking)
- Reports widget: setlist/music follow list for GEMA with TXT export
- Bidirectional combo box filtering (location ↔ date)
- Lyrics contrast: WCAG-based color detection for Word-HTML (bgcolor, background, color)
- Sanitizer removes block backgrounds, retains inline highlights, replaces poor text colors
- Default stylesheet is updated with every skin change and setHtml()
0.29 — release preparation (2026-03-12)
- Internationalization: i18n module with JSON translations (German/English)
- 5-level folder structure: 1_Source, 2_Test, 3_Build, 4_Release, _archive
- Build pipeline: PyInstaller spec + build.py (full package, update, source ZIP)
- Clean-DB script: Removes user data, retains reference data (sequences, Teaching Order)
- Migration EXE: separate access import process
- Portable paths: app directory next to EXE instead of prototypes folder
0.28 — Sequences Window + Design Menu + Audio Fix (2026-03-11)
- New dockable window „Sequences“ (Dock 9, tabbed with Lyrics)
- Import of 885 Singing Call sequences from Access-MDB (caller.mdb)
- Cached Live Mapping against Burleson Vocabulary (Teaching Order)
- Contains Filter: Autocomplete search for contained calls
- Limit Filter: Only sequences up to a certain program level
- Lazy Loading (50-blocks) for fast scrolling
- Detail dialog with all calls and program tags
- Remapping button (gear) for teaching order recalculation
- Zoom [-/+] with percentage display (like Lyrics widget)
- New module: sequence_mapper.py (Burleson mapping logic)
- DB extension: sequences + sequence_calls tables with indexes
- Design menu: load/save/restore layout + skin change at runtime
- Named layouts: Callers can save „Live.ini“, „Workshop.ini“, etc.
- Playlist manager renamed to „Planner“ (shorter, renamed everywhere)
- Caller workflow guidance: Location → Planner button red → Planner confirmed → Playlist focus
- Audio fix: Persistent stream (no crackling/humming at song start)
- WSOLA warmup: 200ms ramp-up phase is output as silence
0.27 — Performance optimization (2026-03-11)
- Performance measurement framework with Phase A (baseline) and Phase B (stress test with 10k songs)
- Testing methodology: 10 repetitions, statistics (Mean/StdDev/Min/Max), CSV export
- Pool table in the playlist manager: 40% faster through optimized table pattern
- Song list: 7% faster through the same optimization
- Insight: QTableWidget rebuild is the bottleneck, not DB or sorting
- Optimized pattern:
setRowCount(0)+setRowCount(n)+setItem()insteadinsertRow()
0.26 — Lyrics display (2026-03)
- Lyrics widget as a dockable window (tabbed with song data)
- Supported formats: HTML/HTM, RTF, TXT
- Auto-Fit: Font size is automatically adjusted when text fits on one page
- Auto-Scroll: Proportional to song progress
- Smart color cleanup: Backgrounds removed, section colors retained
- Toolbar with Auto-Scroll/Auto-Size toggle and Zoom +/-
- Light Blue Skin: Second color scheme (light surface, blue accents)
- Muted and indicator colors for better contrast in both skins
- Loop-Save-Bugfix: Snapshot mechanism saves loop values before song change
- Shared data folders (music/, lyrics/, playlists/) save disk space
0.21 — Playlist and Playlist Manager (2026-03)
- PlaylistWidget: Slim, tabbed next to song list, load/save as .txt
- PlaylistManagerWidget: Two-panel view with song pool and playlist mirror
- Song transfer: Double click, arrow buttons, drag & drop
- 4 sorts: Alphabetical, quality, recently played, recommendation
- Filter: All / only patterns / only singing
- Auto-advance: Next song at song end, stop or fade-out
- Fade-out: Configurable linear volume ramp (default 3s)
- Recommendation system integrated (orig. P25)
- Playlist builder integrated (orig. P24)
0.20 — Playback history (2026-03)
- Three-layer architecture: play_history, song_location_stats, on-the-fly calculation
- „Recently played“ column in the song list
- Location-related statistics (when which song was played where)
- Renaming: „Club“ becomes „Location“ (generalized for club + special)
- INI setting for date format (German/American)
0.19 — Locations (2026-03)
- Club and Special Management as selectable contexts
- Location selection influences song recommendations and history
0.18 — Pattern/Singing Mode (2026-03)
- Songs can be marked as Pattern, Singing, or both
- Type abbreviation (P/S/PS) in song list and pool display
- Filter in the playlist manager by mode
0.17 — Today's Tempo (2026-03)
- Saved tempo per song for tonight
- Tempo is automatically restored when loading a song
0.16 — Song list with search (2026-03)
- Song list as QTableWidget with real-time search filter
- Search by title, label, and filename
0.15 — Portable paths (2026-03)
- Relative paths for songs and data
- Application can be moved to USB stick or between computers
0.14 — Auto-save (2026-03)
- Automatic saving of all changes (song data, settings)
0.13 — Song data model (2026-03)
- SQLite database for songs, locations, history
- Song fields: title, filename, label, quality, pattern/singing, tempo
0.07 — Dock window system (2026-03)
- QDockWidget-based window system with free arrangement
- Move, dock, stack, resize windows
- Layout is saved and restored on restart
- Resize rules per window type
- Integrated: P8 (show/hide), P9 (move), P10 (resize rules), P11 (docking), P12 (layout persistence)
0.06 — Loop with tempo adjustment (2026-03)
- Loop region remains stable during tempo changes
- Custom streaming WSOLA algorithm (no Rubber Band/SoundTouch)
0.05 — Loop-In / Loop-Out (2026-03)
- Markable loop region with start and end point
- Seamless loop during playback
0.04 — Tempo and Pitch simultaneously (2026-03)
- Independent simultaneous tempo and pitch control
0.03 — Pitch control (2026-03)
- Change pitch continuously, independent of tempo
0.02 — Tempo control (2026-03)
- Change playback speed continuously
0.01 — MP3 playback (2026-03)
- Download and play MP3 files stably
- Basic transport controls (Play, Pause, Stop)
- Position display and seek slider