tek/crates/tek_sequencer/src/sequencer_cli.rs
2024-10-18 22:53:53 +03:00

51 lines
2 KiB
Rust

//! 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<String>,
/// Pulses per quarter note (sequencer resolution; default: 96)
#[arg(short, long)] ppq: Option<usize>,
/// Default phrase duration (in pulses; default: 4 * PPQ = 1 bar)
#[arg(short, long)] length: Option<usize>,
/// 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<RwLock<TransportToolbar<Tui>>>, 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(|_|())
}
}