//! 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(None, Some(jack.transport())))); let focus_cursor = (1, 1); let clock = transport.read().unwrap().clock.clone(); let transport = self.transport.then_some(transport); let editor = PhraseEditor::new(); let phrases = Arc::new(RwLock::new(PhrasePool::new())); let sequencer = Sequencer { jack: None, focus_cursor, clock, transport, editor, phrases }; 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; //} } let sequencer = Arc::new(RwLock::new(sequencer)); let jack = jack.activate(&sequencer.clone(), Sequencer::callback)?; let jack = Some(jack.into()); if let Some(ref transport) = sequencer.read().unwrap().transport { transport.write().unwrap().jack = jack.clone(); } sequencer.write().unwrap().jack = jack.clone(); Tui::run(sequencer).map(|_|()) } }