//! Phrase editor. include!("lib.rs"); use tek_core::clap::{self, Parser}; pub fn main () -> Usually<()> { SequencerCli::parse().run() } #[derive(Debug, Parser)] #[command(version, about, long_about = None)] pub struct SequencerCli { /// Name of JACK client #[arg(short, long)] name: Option, /// Pulses per quarter note (sequencer resolution; default: 96) #[arg(short, long)] ppq: Option, /// Default phrase duration (in pulses; default: 4 * PPQ = 1 bar) #[arg(short, long)] length: Option, /// Whether to include a transport toolbar (default: true) #[arg(short, long, default_value_t = true)] transport: bool } impl SequencerCli { fn run (&self) -> Usually<()> { Tui::run(JackClient::new("tek_sequencer")?.activate_with(|jack|{ let transport = TransportToolbar::new(jack, None); if let Some(_) = self.name.as_ref() { // TODO: sequencer.name = Arc::new(RwLock::new(name.clone())); } if let Some(_) = self.ppq { // TODO: sequencer.ppq = ppq; } if let Some(_) = self.length { // TODO: if let Some(phrase) = sequencer.phrase.as_mut() { //phrase.write().unwrap().length = length; //} } Ok(SequencerApp { jack: jack.clone(), focus_cursor: (1, 1), entered: false, phrases: Arc::new(RwLock::new(PhrasePool::new())), editor: PhraseEditor::new(), clock: transport.clock.clone(), player: PhrasePlayer::new(jack, &transport.clock, "tek_sequencer")?, transport: self.transport.then_some(Arc::new(RwLock::new(transport))), }) })?)?; Ok(()) } }