include!("lib.rs"); use tek_core::clap::{self, Parser}; pub fn main () -> Usually<()> { ArrangerCli::parse().run() } /// Parses CLI arguments to the `tek_arranger` invocation. #[derive(Debug, Parser)] #[command(version, about, long_about = None)] pub struct ArrangerCli { /// 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, /// Number of tracks #[arg(short = 'x', long, default_value_t = 8)] tracks: usize, /// Number of scenes #[arg(short, long, default_value_t = 8)] scenes: usize, } impl ArrangerCli { /// Run the arranger TUI from CLI arguments. 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())))); let phrases = Arc::new(RwLock::new(PhrasePool::new())); let mut arrangement = Arrangement::new("", &phrases); if let Some(name) = self.name.as_ref() { *arrangement.name.write().unwrap() = name.clone(); } for _ in 0..self.tracks { let track = arrangement.track_add(None)?; //for _ in 0..self.scenes { //track.phrases.push( //Arc::new(RwLock::new(Phrase::new("", true, PPQ * 4, None))) //); //} } for _ in 0..self.scenes { let _scene = arrangement.scene_add(None)?; //for i in 0..self.tracks { //scene.clips[i] = Some(i); //} } transport.write().unwrap().jack = Some( jack.activate( &transport.clone(), |state: &Arc>>, client, scope| { state.write().unwrap().process(client, scope) } )? ); let mut app = Arranger { focus_cursor: (0, 1), transport: self.transport.then_some(transport), show_sequencer: Some(tek_core::Direction::Down), modal: None, editor: PhraseEditor::new(), arrangement, phrases, }; app.update_focus(); Tui::run(Arc::new(RwLock::new(app)))?; Ok(()) } }