songbird-record/src/
├── lib.rs — Public API, recording state machine
├── audio_recorder.rs — Audio recording (cpal input → ring buffer → WAV file)
├── midi_recorder.rs — MIDI recording (midir input → timestamped events → clip)
└── loopback_recorder.rs — Loopback recording (capture engine output)
let mut recorder = AudioRecorder::new(sample_rate, channels);
recorder.start("/path/to/recording.wav");
// ... audio callback feeds samples via push_samples() ...
recorder.stop(); // Finalizes WAV file
let mut recorder = MidiRecorder::new();
recorder.start(bpm, time_sig);
recorder.record_event(MidiEventKind::NoteOn { note: 60, velocity: 100, channel: 0 }, beat_position);
let clip = recorder.stop(); // Returns a Clip with MidiNote data
let mut recorder = LoopbackRecorder::new(sample_rate, channels);
recorder.start("/path/to/loopback.wav");
// ... engine feeds output samples ...
recorder.stop();
cargo test -p songbird-record