Show Tempo Sections - mjcmatrix/qlcplus GitHub Wiki

Show Tempo Sections

The newest and most involved feature on the fork, so testing feedback is especially welcome.

The problem

A Show that plays several songs one after another, each at its own BPM, can't keep Beats-tempo Chasers in time with the music: the Show's BPM ruler and every Beats-tempo Function follow one global master BPM, with no way to say "this song is 128 BPM and its first downbeat is here." This affects band/artist playback, theatre and dance numbers, recitals and fitness classes, music-synced displays, and anywhere a Chaser needs to land on the beat of pre-known music.

Features and improvements

Nothing on this page has been merged upstream yet.

Tempo sections lane. (Fork #56) A lane under the ruler holds sections, each with a start, length, BPM (decimals allowed), beats-per-bar and a name β€” normally one per song, lined up with its audio item by hand.

Two tempo sections on the lane, each named and showing its own BPM and bar numbers

How to use it:

  1. Click the drum-icon toolbar button to show the tempo lane under the ruler (a Show that already has sections shows it automatically).
  2. Add a section at the cursor (lane header button) β€” it runs up to the next section, or one minute β€” or select one or more audio items on the timeline first and click Add sections from the selected items to create one section per item, matched to its start and length. If a new section would overlap an existing one, a dialog offers to let it take over from its start, cutting the old section short; the tempo always changes right at the start of the next song.
  3. A new section opens its editor immediately, since a tempo always needs setting β€” enter its name, BPM (decimals allowed, e.g. 127.5) and beats per bar. Tap a section any time to select it, then use the lane's Edit, Split at cursor or Delete buttons; double-click or right-click a section to jump straight to its editor.
  4. Drag a section's body to move it, or its edges to resize it. Sections stop at their neighbours and snap to Show item edges, so a section can sit back to back with the next and line up exactly with its audio item.

Note: moving or re-timing a section never moves the Show items themselves β€” only the beat grid and playback timing change.

Beat clock from Show time. (Fork #56, #59) While a section is active, Beats-tempo Chasers and Sequences in the Show step on that section's beat grid, computed from Show time so there's no drift and the global beat generator is never involved. This now also applies to Beats-tempo Chasers reached through Collections, not just ones placed directly on a track.

πŸ”§ Follow-up fix: at the end of a Beats-tempo Chaser item, the Chaser could flash its next step for one tick before the Show stopped it: its steps ended on the tick nearest their end time, up to half a tick early, while Show items end on the first tick at or after theirs. Steps now end the same way as the items, still with no drift. The Chaser's fade out when stopped also ran its value in beats as milliseconds (a 1 beat fade out took 1000 ms at any tempo), and is now converted at the section's BPM. (Fork #107) A similar one-tick flash without tempo sections has a separate cause in upstream code, fixed in #108 (see Engine and Playback Fixes).

Items converted to milliseconds, once. (Fork #56) A Show gets a saved flag the first time it gets a tempo section; its Beats-tempo items are converted to milliseconds at that point (nothing moves on screen) and never converted back. The ruler stays purely a display choice β€” switching between Time and BPM markers never moves or converts anything.

Chaser tempo converter. (Fork #56, #59, #61) Turns Time-tempo Chasers (and EFX) into Beats-tempo (and back) at a section's BPM, with a full step-by-step preview and one undo. Can convert in place or as a clone; can now also convert Chasers reached through Collections (copying the Collection chain rather than mutating a shared Collection), across a selection, the whole Show, or all Shows at once, and skips Chasers already at the target tempo.

How to use it:

  1. Open the converter from the Show Manager toolbar (enabled once the selection includes at least one Chaser) or from the button next to the tempo type selector in the Chaser editor itself β€” both open the same dialog.
  2. Pick a BPM source: the tempo section under each item's start (the default), a specific section chosen from a list, or a typed BPM.
  3. Check the preview β€” every step's hold, fade in and fade out is shown rounded to the nearest ΒΌ beat by default (β…›, Β½ or whole beat also available), e.g. "300 ms β†’ ΒΎ beat". Nothing non-zero ever rounds down to 0, and infinite holds stay infinite.
  4. Choose in place (changes the Chaser itself, everywhere it's used β€” the dialog lists those uses first) or as a clone (creates a new "Name (beats)" Chaser and repoints only the chosen Show items to it).
  5. If the selection spans songs at different tempos, choose one Beats Chaser per tempo (each song keeps its original feel) or one Beats Chaser for all at a single chosen BPM.
  6. Apply β€” the whole thing, including any repointed items, is one undo step.

Note: if a target Chaser is linked to a Virtual Console Speed Dial, the dialog warns β€” a Speed Dial writes its time straight into the Function's fade/duration fields without checking tempo type, so it would write beats where it means milliseconds once the Chaser converts.

EFX follow tempo sections. (Fork #92, builds on #89) A Beats-tempo EFX started by a Show steps on the active section's beat grid, the same as Beats-tempo Chasers, and follows sections edited while the Show plays without a jump. An EFX started between beats locks onto the grid by briefly speeding up or slowing down (0.5x to 1.5x) rather than jumping. The tempo converter below now converts EFX (loop duration and fade in) as well as Chasers.

Show master tempo. (Fork #92) A per-Show option, off by default and toggled in the tempo lane. While a Show with it on is playing or paused, it sets the global BPM and beats from its sections, so Beats-tempo Functions started elsewhere (e.g. from a Virtual Console button) stay in time with the Show's music. It never overrides an external beat source. If several Shows have it on, the one started last is followed, and the other takes over again when that one stops.

How to use it: tick the master tempo toggle in the Show's tempo lane, then play the Show. Beats-tempo Functions started from anywhere now follow the section the Show is in.

BPM auto-detect from audio (experimental). (Fork #57) When adding tempo sections from selected audio items, BPM can now be detected automatically from the audio rather than defaulting to 120. Multiple items are analysed in the background; results are listed for review (with Β½/Γ—2 corrections for octave errors) before anything is added. Reuses the existing beat-tracking engine code β€” no new dependency. Marked experimental: accuracy is best on steady, clearly percussive tracks; a wandering or beat-light song may need manual correction.

How to use it: select the audio items to add sections for, then Add sections from the selected items with Detect the BPM of each item from its audio ticked (remembered across restarts). Detection runs in the background over all selected items; a review dialog then lists each result with its agreement percentage β€” a wandering or live-band track gets its average β€” and a Β½ / Γ—2 button to correct an octave error before anything is added. Untick an item to skip adding a section for it. A track with no detectable beat is flagged "not found" and defaults to the current global BPM for review rather than being silently skipped.

1. Adding the sections, with detection ticked:

The Tempo sections dialog with "Detect the BPM of each item from its audio" ticked

2. Reviewing the results β€” agreement percentages, the Β½ / Γ—2 octave corrections, and one track with no detectable beat:

The Detected tempos review dialog listing 12 tracks with their detected BPM

3. The sections placed on the tempo lane, each carrying its detected tempo and its own beat grid:

The tempo lane showing two sections at 128 BPM and 123.37 BPM with their beat rulers

Toolbar beat/bar indicator. (Fork #65) A "Tempo: " label and a flashing beat/bar indicator in the main toolbar, driven by the currently open Show's active tempo section during playback β€” separate from, and independent of, the existing global BPM indicator.

The toolbar's global BPM indicator next to the new Tempo indicator, showing the active section's BPM and beat number during playback

Delete all tempo sections. (Fork #58) Shift+click the tempo lane's delete button removes every section in the current Show in one undo step, after confirmation.

Insert/remove time range interaction. (Fork #67) Removing or inserting a time range (see Show Manager) correctly moves, crops and splits tempo sections that fall across the edited range, re-anchoring the beat grid of whatever's left on its own downbeat.

Re-detect existing sections. (Fork #57) Sections already covering an audio item's start can be re-detected in place without deleting them first.

More ways to open the tempo section editor. (Fork #56) The tempo section editor is reachable from the lane or by selecting a range directly in the section editor.

BPM auto-detect choice remembered. (Fork #57) The BPM auto-detect choice (on/off) is remembered across restarts.

⚠️ **GitHub.com Fallback** ⚠️