here is a more prose design document articulating the same ..
Here are some ideas for how one Record button could handle three categories of tracks in any improvised order:
“Persistent” tracks (beds / masters that never get stopped by section switching).
Switched tracks (song‑section tracks that start/stop at musical boundaries and are slaved to the clock‑source or MIDI).
Bounced sub‑loops (shorter loops captured from within a longer switched track into the next empty track).
Instead of assigning different Record buttons for different jobs, LP3 might use track status (empty / recording / playing, etc.), whether a track is switched or persistent, plus a few simple toggles (for example, New Clock Source ON or OFF, Bounce ON or OFF) to decide which existing Looperlative command to fire under one “Smart Record” control (Rec/Dub vs Switch Record vs Bounce). The goal is to make song‑form looping practical to execute improvisationally, even while reading a chart or taking cues from a bandmate.
Creating Paralell / Persistent Tracks with Single Record Function
A single button push to create “persistent” tracks at any point in a given workflow and on any track.
LP3 might use track status plus a Clock Source toggle to determine whether Rec/Dub follows the current clock‑source / master or promotes the new recording to be the clock‑source / master.
Track Status / Condition:
Some tracks may be empty, some may have audio, some may be switched or not.
Toggle:
New Clock Source = OFF or ON.
Behavior:
When Record is pressed and New Clock Source = ON, LP3 issues Rec/Dub on the selected track and then sets that track as the clock‑source / master (“persistent” track). If all tracks are empty and no track selection is made, Track 1
When Record is pressed and New Clock Source = OFF, LP3 finds the next empty non‑switched track and issues Rec/Dub there, adding a new “persistent” layer locked to the current clock‑source / master.
Example Logic
onRecordButtonPress():
t = getSelectedTrack()
if NewClockSourceToggle == ON:
// If nothing is selected and all tracks are empty, default to Track 1
if t == NONE and allTracksEmpty():
t = 1
issueCommand(REC_DUB, track = t)
setClockSourceTrack(t)
else:
m = findNextEmptyNonSwitchedTrack()
if m != NONE:
selectTrack(m)
issueCommand(REC_DUB, track = m)
Creating Switched Tracks with Single Record Function
Using the same track status awareness and toggles, the same single Record button might also create switched tracks that slave to the internal clock‑source track or MIDI.
Track Status / Condition:
Some tracks may be empty, some may have audio, some may be switched or not. Clock source may be the internal clock‑source / master track or MIDI.
Toggle:
Switched Track = OFF or ON.
New Clock Source = OFF or ON.
Behavior:
When Record is pressed and Switched Track = ON and New Clock Source = OFF, LP3 issues Switch Record on the selected track, creating a switched track slaved to the current internal clock‑source / master or MIDI clock.
When Record is pressed and Switched Track = ON and New Clock Source = ON, LP3 issues Switch Record on the selected track and then sets that track as the clock‑source / master.
Example Logic
text
onRecordButtonPress():
t = getSelectedTrack()
if SwitchedTrackToggle == ON:
if NewClockSourceToggle == ON:
issueCommand(SWITCH_RECORD, track = t)
setClockSourceTrack(t)
else:
issueCommand(SWITCH_RECORD, track = t)
Creating Bounced Sub‑Loops with Single Record Function
A Bounce toggle might reuse the same Record button so that one press starts a bounce from point A and the second press ends it at point B, capturing a subset of a longer switched loop into the next empty track. This is essential for quick creation of tags, vamps, outros, solo sections etc…
Track Status / Condition:
A switched track is playing a longer loop.
At least one track is empty.
Toggle:
Bounce = OFF or ON.
Behavior:
When Bounce = ON, the same Record button no longer calls Rec/Dub or Switch Record; it calls a bounce function instead:
First press (point A) starts a bounce from the next boundary cycle from the switched tracks output.
Second press (point B) ends the bounce (at cycle boundary) and writes the captured sub‑loop into the next empty track, creating a new switched loop that stays synchronized with the current clock source (internal or MIDI, depending on which bounce variant is used).
Example Logic
text
onRecordButtonPress():
if BounceToggle == ON:
if bounceActive == FALSE:
// First press: start bounce from current switched track
issueCommand(SYNC_BOUNCE_START, track = getSelectedTrack())
bounceActive = TRUE
else:
// Second press: end bounce and write subset into next empty track
issueCommand(SYNC_BOUNCE_END)
bounceActive = FALSE
return
So with three toggles (Switched Track, New Clock Source, Bounce) plus track status, a single Record button might:
Create, extend and add persistent tracks.
Create/extend and add switched song‑section tracks.
Bounce a sub‑loop from a switched track into the next empty track to create outro/tag/vamp etc…