include!("./lib.rs"); pub fn main () -> Usually<()> { SequencerCli::parse().run() } /// Launches a single interactive MIDI sequencer. #[derive(Debug, Parser)] #[command(version, about, long_about = None)] pub struct SequencerCli { /// Name of JACK client #[arg(short, long)] name: Option, /// Whether to include a transport toolbar (default: true) #[arg(short, long, default_value_t = true)] transport: bool, /// MIDI outs to connect to (multiple instances accepted) #[arg(short='i', long)] midi_from: Vec, /// MIDI ins to connect to (multiple instances accepted) #[arg(short='o', long)] midi_to: Vec, } impl SequencerCli { fn run (&self) -> Usually<()> { let name = self.name.as_deref().unwrap_or("tek_sequencer"); let engine = Tui::new()?; let state = JackConnection::new(name)?.activate_with(|jack|{ let mut app = SequencerTui::try_from(jack)?; let jack = jack.read().unwrap(); let midi_in = jack.register_port("i", MidiIn::default())?; let midi_out = jack.register_port("o", MidiOut::default())?; connect_from(&jack, &midi_in, &self.midi_from)?; connect_to(&jack, &midi_out, &self.midi_to)?; app.player.midi_ins.push(midi_in); app.player.midi_outs.push(midi_out); Ok(app) })?; engine.run(&state) } } #[test] fn verify_sequencer_cli () { use clap::CommandFactory; SequencerCli::command().debug_assert(); }