SUPERB
Flows

track

Tracks: add, name, fader, pan, mute, solo, arm, monitor, route, meter, archive.

Example

use superb::primitives::buffers::PlanarBuffer;
use superb::primitives::session::{Input, TrackKind};
use superb::primitives::{Result, SampleRate, TimePosition};
use superb::{clip, session, track, transport};

fn main() -> Result<()> {
    let rate = SampleRate::HZ_48K;
    let mut session = session::create(std::env::temp_dir().join("tracks"), rate, 256)?;
    let vox = track::add(&mut session, "vox", TrackKind::Audio)?;
    let keys = track::add(&mut session, "keys", TrackKind::Midi)?;
    let room = track::add(&mut session, "room", TrackKind::Bus)?;

    let mut tone = PlanarBuffer::new(2, rate.hz() as usize);
    tone.fill(0.25);
    session.audio.insert("audio/tone.wav", tone);
    clip::add(&mut session, vox, "audio/tone.wav", TimePosition::ZERO)?;

    for db in [-2.0, -4.0, -6.0] {
        track::volume(&mut session, vox, db)?;     // one undo step: moves within half a second merge
    }
    track::pan(&mut session, vox, -0.3)?;          // a little left
    track::route(&mut session, vox, Some(room))?;  // vox → room bus → master
    track::volume(&mut session, room, -3.0)?;

    track::mute(&mut session, keys, true)?;        // state: saved, not an undo step
    track::arm(&mut session, vox, true)?;
    track::input(&mut session, vox, Some(Input::Mono(0)))?;
    track::monitor(&mut session, keys, true)?;     // keys sounds when MIDI arrives
    track::midi_channel(&mut session, keys, Some(0))?;

    transport::start(&mut session)?;
    session::steps::render_blocks(&mut session, 8)?;
    if let Some([l, r]) = track::peak(&session, room) {
        println!("room: L {l:.3} R {r:.3}");
    }

    track::rename(&mut session, vox, "lead vocal")?;
    track::color(&mut session, vox, Some(0xff8800))?;
    track::move_to(&mut session, keys, 0)?;        // first in the list
    track::archive(&mut session, keys)?;           // off the mixer, kept with its clips
    track::restore(&mut session, keys)?;
    Ok(())
}

cargo run --example mix_session does the same with the numbers printed.

Verbs

verbdoesundo
add(session, name, kind) -> TrackIdAudio, Midi or Busone
archive(session, track) / restore(session, track)off the mixer and back; nothing is deletedone
rename(session, track, name)merges
color(session, track, Option<0xRRGGBB>)merges
move_to(session, track, index)position in the track list, 0 firstone
volume(session, track, db)the fader; heard at oncedrag
pan(session, track, pan)-1.0 left to 1.0 rightdrag
route(session, track, Option<bus>)into a bus, or None for the masterone
mute / solo(session, track, on)heard at oncestate
arm(session, track, on)gets a clip when a recording stopsstate
monitor(session, track, on)MIDI track: a synth so incoming notes become audio; audio track: the audio inputstate
input(session, track, Option<Input>)Input::Mono(ch), Input::Stereo(l, r), or None for everything capturedstate
midi_channel(session, track, Option<0..=15>)which channel the track listens to; None for allstate
peak(session, track) -> Option<[f32; 2]>the strip's peak since the last read

Every signature, argument, error and undo step: track reference.

Notes

  • The master is a track: session.memory.master(). volume, pan, mute, rename and peak work on it; archive, solo, arm, monitor, input, routing and sends are refused.
  • Solo silences every other track; buses ignore solo.
  • A monitoring MIDI track gets MonoSynthNode, a simple synth for hearing that MIDI arrives. Instrument plugins come later.
  • Monitoring an audio track needs the input open (devices::input).
  • Pan law is a live-strip setting, StripParams::set_pan_law (session.mixer.strip(track)): tracks default to constant power, buses to balance. It survives a rebuild; it is not saved.

On this page