tek/crates/tek_sequencer/src/arranger_cli.rs

65 lines
2.5 KiB
Rust

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<String>,
/// 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<RwLock<TransportToolbar<Tui>>>, 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(())
}
}