//! 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<()> { let jack = Client::new("tek_arranger", ClientOptions::NO_START_SERVER)?.0; let jack = JackClient::Inactive(jack); let transport = Arc::new(RwLock::new(TransportToolbar::new(Some(jack.transport())))); transport.write().unwrap().jack = Some( jack.activate( &transport.clone(), |state: &Arc>>, client, scope| { state.write().unwrap().process(client, scope) } )? ); let seq = Sequencer { focus_cursor: (1, 1), transport: self.transport.then_some(transport), editor: PhraseEditor::new(), phrases: Arc::new(RwLock::new(PhrasePool::new())), }; if let Some(_) = self.name.as_ref() { // TODO: seq.name = Arc::new(RwLock::new(name.clone())); } if let Some(_) = self.ppq { // TODO: seq.ppq = ppq; } if let Some(_) = self.length { // TODO: if let Some(phrase) = seq.phrase.as_mut() { //phrase.write().unwrap().length = length; //} } Tui::run(Arc::new(RwLock::new(seq))).map(|_|()) } }