Context aware section switch

Over the years I’ve worked on song sections and implemented different ways of handling them. The LP1 and now the LoopPad are exceptionally difficult due to their 8 tracks and tons of flexibility. So, I want to capture some of my thoughts.

  • The goal is 1 button operation.
  • Possible state transitions:
    • empty → record → play → switch
    • empty → record → switch and play → switch
    • On switch, we would do either empty → record or stopped → play
  • On the LP2 and the MOD Plugin, I felt that there was pretty good switching, but due to the limited number of tracks, there were only 2 parts. What happens if there are more than 2 parts?
    • Cycle through all tracks in a designated group? 1 button could be select group N → switch
    • Other?
  • Sync, MIDI Sync, Async could be selected modes rather using different buttons for the different record modes

I can update this if anybody has thoughts on this.

1 Like

Thanks Bob for opening up this subject. Its near and dear to many workflows in the song form looping scene…

Consider this approach:

One Smart Record Function (broader than just switched tracks), driven by:

  • Context awareness (sensed per track):
    EMPTY / RECORDING / PLAYING / OVERDUBBING / STOPPED

  • Resolver layer (toggles/parameters):
    Switched Track = OFF / ON (persistent vs switched)
    New Clock Source = OFF / ON
    Bounce = OFF / ON

Context + resolver together determine which record‑type command to fire (Rec/Dub, Switch Record / Switch Play, or Bounce).


Context = EMPTY

  • EMPTY – Switched Track = OFF, New Clock Source = OFF, Bounce = OFF
    → Rec/Dub on a non‑switched track (persistent bed/master following current clock).

  • EMPTY – Switched Track = OFF, New Clock Source = ON, Bounce = OFF
    → Rec/Dub and promote that track as new clock‑source persistent bed/master.

  • EMPTY – Switched Track = ON, New Clock Source = OFF, Bounce = OFF
    → Switch Record on the current track (new switched song‑section slaved to current clock).

  • EMPTY – Switched Track = ON, New Clock Source = ON, Bounce = OFF
    → Switch Record and set that switched track as new clock‑source section.

  • EMPTY – Switched Track = ON, New Clock Source = OFF, Bounce = ON
    → choose Bounce: next Smart Record press will start a boundary‑aligned Bounce from the playing switched track, and the following press will end it into the next empty switched track.


Context = RECORDING

(First‑pass close / section close behavior)

  • RECORDING – Switched Track = OFF, Bounce = OFF
    → Smart Record closes Rec/Dub and goes to Play or Play+Overdub according to LP3’s After Record setting.

  • RECORDING – Switched Track = ON, Bounce = OFF
    → Smart Record closes Switch Record on that section and goes to section Play (or Play+Overdub, per After Record).

  • RECORDING – Switched Track = ON, Bounce = ON
    → Smart Record closes a recording that was started as part of a bounce‑style workflow; the created loop becomes the new bounced section on the target switched track.


Context = PLAYING

  • PLAYING – Switched Track = OFF, Bounce = OFF
    → Smart Record = Rec/Dub (classic overdub on the current persistent track).

  • PLAYING – Switched Track = ON, Bounce = OFF
    → Smart Record = Switch Play or Switch Record on the switched set, depending on how sections are configured (e.g., jump sections vs create new).

  • PLAYING – Switched Track = ON, Bounce = ON
    → Smart Record = Bounce Start at the next musical boundary on the playing switched track (a later press in this context will do Bounce End and write the sub‑loop to the next empty switched track).


Context = OVERDUBBING

  • OVERDUBBING – Switched Track = OFF, Bounce = OFF
    → Smart Record can either stop overdub and leave in Play, or continue overdub, depending on LP1/LP3‑style Rec/Dub cycling (record → overdub → play).

  • OVERDUBBING – Switched Track = ON, Bounce = OFF
    → Smart Record ends overdub on the active switched section and returns it to Play, keeping section timing intact.

  • OVERDUBBING – Switched Track = ON, Bounce = ON
    → Smart Record may be disabled or treated as a guarded state to avoid mixing active overdub with Bounce; implementation choice, but explicitly defined.


Context = STOPPED

  • STOPPED – Switched Track = OFF, Bounce = OFF
    → Smart Record = Play‑Overdub on that persistent track (resume and overdub in one hit).

  • STOPPED – Switched Track = ON, Bounce = OFF
    → Smart Record = Switch Play to that stopped switched section and bring it back in on the grid.

  • STOPPED – Switched Track = ON, Bounce = ON
    → arm Bounce so that when this switched section is next PLAYING, Smart Record can do Bounce Start / Bounce End without changing buttons.

So the idea is: one Smart Record Function plus a small resolver layer of toggles, applied across all transport contexts, not only switched tracks, to unify Rec/Dub, Switch Record / Switch Play, and Bounce into a single record control

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…

One refinement to the context‑awareness idea:

  • Context = OVERDUBBING, Switched Track = ON, Bounce = OFF
    → Smart Record may need to end overdub and return the section to Play at a boundary before starting Switch Record on the next press, rather than jumping straight from overdub into Switch Record.

Whether a direct “overdub → Switch Record” transition is safe on LP3 is an implementation detail, but the Smart Record concept assumes this is either guarded or explicitly supported so section behavior stays predictable.

The logic is simple. I’m trying to figure out how the UI will work with the toggles. Are they per track values? Are they preprogrammed with the configuration application or are they toggled using button presses? If they are button presses, I’m assuming that means that they need to be displayed which will be interesting. This suggestion also implies that behavior of the multi-function button will be dependent on what the current track is. I was originally thinking that the button took us through a pattern that didn’t require us to select a track, but I may do a couple of different multi-function buttons to satisfy different needs.

1 Like