Skip to content

Songs and bouncing

Three apps make a track together, on one clock. The Sequencer records the pads as patterns, in scenes. Song arranges those scenes as blocks with repeats. Arrange lays audio clips on four tracks and plays them as a song. Pad Mixer sets each pad’s level and pan for all of them.

  • The Sequencer’s scenes and the Song arrangement are in one file for every kit, crosspad/sequences.json. Changing kits keeps the groove: it plays on the new kit’s pads, at the same tempo.
  • Each Arrange song is a folder in SONGS/: song.json and a clips/ folder with its audio.
  • A song is saved to a new file first and then swapped in, with the previous version kept as a backup, so a song file is never half-written. A song saved by newer firmware opens as Unreadable, and the CrossPad leaves it as it is.
  • Changes in Arrange are saved 400 ms after the last one. Changes made while a song plays are saved when it stops.

Bounce turns a Sequencer scene into an audio clip. The CrossPad plays the scene once, from its first beat, and records exactly the scene’s length. The recording is the pads as the Mixer plays them, with their faders, pan, mute and solo, and never the inputs. The clip lands after the last block on the track you chose. An empty song takes the scene’s tempo; a clip recorded at another tempo keeps its own.

  • Loop region: with LOOP on, the song plays round the region, and PLAY starts there.
  • Copy, paste, duplicate: by bars, everything that sounds inside the region on every track. Paste and duplicate insert time, so nothing is written over.
  • Cut: splits a track’s block at the playhead.
  • Merge: mixes the chosen tracks, at their volumes, into one new clip.
  • Import: puts a Recorder loop into the song. See Recorder and Slicer.
  • The tempo is one value: the top bar’s BPM, the Sequencer’s BPM field and Arrange’s tempo dial all show and change it. A playing song sets its own tempo. When a DAW sends a clock, the CrossPad follows it (see MIDI clock).
  • The metronome key on the top bar and the Sequencer’s M are one switch. REC and STOP leave it as it is. A count-in is heard either way.
  • A recorded press keeps its length: playback holds the note as long as you held the pad. This matters for a sample in Hold mode and for chords.

The song engine is PlatformServices::songEngine (ISongEngine) in crosspad-core.

  • A call that needs the card (open, list, save, bounce, merge, import) is a request. It returns at once; read the answer from openState(), projects(), clips() with listGeneration(), playing() and bounceStatus() in your UI timer.
  • Edit the song model through song() while you hold songMutex(), then call commit(). Playback picks the change up at once.
  • The sequencer presses pads as its own event source. Pad logic that has to tell a finger from a take reads PadManager::pressSource(pad).