From 10f191282e197aa1c64df82502d9fab73d5b2df8 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 9 Aug 2024 00:31:23 +0300 Subject: [PATCH] wip: fix one batch of errors, unlock another --- Cargo.lock | 21 +++++++++++- crates/tek/Cargo.toml | 1 - crates/tek/src/app.rs | 10 +++--- crates/tek/src/cli.rs | 2 +- crates/tek/src/main.rs | 5 ++- crates/tek/src/modal.rs | 5 --- crates/tek_core/Cargo.toml | 1 + crates/tek_core/src/lib.rs | 1 + crates/tek_sequencer/src/lib.rs | 1 + crates/tek_sequencer/src/main.rs | 2 +- crates/tek_sequencer/src/midi.rs | 1 - crates/tek_sequencer/src/phrase.rs | 26 +++++++-------- crates/tek_sequencer/src/sequencer.rs | 4 +++ crates/tek_sequencer/src/sequencer_cli.rs | 40 +++++++++++++++++++++++ 14 files changed, 92 insertions(+), 28 deletions(-) delete mode 100644 crates/tek/src/modal.rs create mode 100644 crates/tek_sequencer/src/sequencer_cli.rs diff --git a/Cargo.lock b/Cargo.lock index 6d030ba6..e3c86da1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -448,6 +448,15 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +[[package]] +name = "clojure-reader" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe72db90a90a91de4a9fbd79542538caa0445ebdebcd3112589cab4c1e0e10b" +dependencies = [ + "ordered-float", +] + [[package]] name = "colorchoice" version = "1.0.1" @@ -1653,6 +1662,15 @@ dependencies = [ "libredox", ] +[[package]] +name = "ordered-float" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ff2cf528c6c03d9ed653d6c4ce1dc0582dc4af309790ad92f07c1cd551b0be" +dependencies = [ + "num-traits", +] + [[package]] name = "owned_ttf_parser" version = "0.24.0" @@ -2491,6 +2509,8 @@ checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" name = "tek" version = "0.1.0" dependencies = [ + "clojure-reader", + "microxdg", "tek_chain", "tek_core", "tek_jack", @@ -2517,7 +2537,6 @@ dependencies = [ "better-panic", "clap", "crossterm", - "microxdg", "midly", "ratatui", "toml", diff --git a/crates/tek/Cargo.toml b/crates/tek/Cargo.toml index 9189e4ef..c578d97d 100644 --- a/crates/tek/Cargo.toml +++ b/crates/tek/Cargo.toml @@ -4,7 +4,6 @@ edition = "2021" version = "0.1.0" [dependencies] -clap = { version = "4.5.4", features = [ "derive" ] } clojure-reader = "0.1.0" microxdg = "0.1.2" diff --git a/crates/tek/src/app.rs b/crates/tek/src/app.rs index d3c4a541..d73c8435 100644 --- a/crates/tek/src/app.rs +++ b/crates/tek/src/app.rs @@ -32,10 +32,12 @@ pub struct App { impl App { pub fn new () -> Usually { let xdg = Arc::new(XdgApp::new("tek")?); - let first_run = crate::config::AppPaths::new(&xdg)?.should_create(); - let jack = JackClient::Inactive(Client::new("tek", ClientOptions::NO_START_SERVER)?.0); + let first_run = AppPaths::new(&xdg)?.should_create(); + let jack = JackClient::Inactive( + Client::new("tek", ClientOptions::NO_START_SERVER)?.0 + ); *MODAL.lock().unwrap() = first_run.then(||{ - Exit::boxed(crate::devices::setup::SetupModal(Some(xdg.clone()), false)) + Exit::boxed(SetupModal(Some(xdg.clone()), false)) }); Ok(Self { entered: true, @@ -95,7 +97,7 @@ render!(App |self, buf, area| { &self.transport, &self.arranger, &If(self.arranger.selected.is_clip(), &Split::right([ - &ChainView::vertical(&self), + &tek_chain::ChainView::vertical(&self), &self.sequencer, ])) ]).render(buf, area)?; diff --git a/crates/tek/src/cli.rs b/crates/tek/src/cli.rs index 845ba389..a49f1531 100644 --- a/crates/tek/src/cli.rs +++ b/crates/tek/src/cli.rs @@ -1,6 +1,6 @@ //! Command line option parser. -use clap::{Parser, Subcommand}; +use tek_core::clap::{self, Parser, Subcommand}; #[derive(Debug, Parser)] #[command(version, about, long_about = None)] diff --git a/crates/tek/src/main.rs b/crates/tek/src/main.rs index f15e0d8a..5b12c852 100644 --- a/crates/tek/src/main.rs +++ b/crates/tek/src/main.rs @@ -20,10 +20,13 @@ submod! { control edn help - modal setup } +/// Global modal dialog +pub static MODAL: Lazy>>>> = + Lazy::new(||Arc::new(Mutex::new(None))); + /// Application entrypoint. pub fn main () -> Usually<()> { run(App::from_edn(include_str!("../../../demos/project.edn"))? diff --git a/crates/tek/src/modal.rs b/crates/tek/src/modal.rs deleted file mode 100644 index 76a2044c..00000000 --- a/crates/tek/src/modal.rs +++ /dev/null @@ -1,5 +0,0 @@ -use crate::*; - -/// Global modal dialog -pub static MODAL: Lazy>>>> = - Lazy::new(||Arc::new(Mutex::new(None))); diff --git a/crates/tek_core/Cargo.toml b/crates/tek_core/Cargo.toml index 1cc66919..5e80bc3f 100644 --- a/crates/tek_core/Cargo.toml +++ b/crates/tek_core/Cargo.toml @@ -10,3 +10,4 @@ backtrace = "0.3.72" toml = "0.8.12" better-panic = "0.3.0" midly = "0.5" +clap = { version = "4.5.4", features = [ "derive" ] } diff --git a/crates/tek_core/src/lib.rs b/crates/tek_core/src/lib.rs index 163a6381..6273b7b9 100644 --- a/crates/tek_core/src/lib.rs +++ b/crates/tek_core/src/lib.rs @@ -1,6 +1,7 @@ pub use ratatui; pub use crossterm; pub use midly; +pub use clap; pub use std::sync::{Arc, Mutex, RwLock}; pub use std::collections::BTreeMap; pub use crossterm::event::{Event, KeyEvent, KeyCode, KeyModifiers}; diff --git a/crates/tek_sequencer/src/lib.rs b/crates/tek_sequencer/src/lib.rs index c83e3a50..a83f1b05 100644 --- a/crates/tek_sequencer/src/lib.rs +++ b/crates/tek_sequencer/src/lib.rs @@ -12,6 +12,7 @@ submod! { midi phrase sequencer + sequencer_cli sequencer_control sequencer_track arranger diff --git a/crates/tek_sequencer/src/main.rs b/crates/tek_sequencer/src/main.rs index c93a9078..ba1d7fb1 100644 --- a/crates/tek_sequencer/src/main.rs +++ b/crates/tek_sequencer/src/main.rs @@ -1,6 +1,6 @@ //! Phrase editor. include!("lib.rs"); pub fn main () -> Usually<()> { - tek_core::run(Arc::new(RwLock::new(crate::Sequencer::new())))?; + tek_core::run(Arc::new(RwLock::new(crate::Sequencer::from_args())))?; Ok(()) } diff --git a/crates/tek_sequencer/src/midi.rs b/crates/tek_sequencer/src/midi.rs index 21f04107..23e7f1db 100644 --- a/crates/tek_sequencer/src/midi.rs +++ b/crates/tek_sequencer/src/midi.rs @@ -1,5 +1,4 @@ use crate::*; -use tek_jack::jack::*; /// MIDI message serialized to bytes pub type MIDIMessage = Vec; diff --git a/crates/tek_sequencer/src/phrase.rs b/crates/tek_sequencer/src/phrase.rs index 09fce8a1..5578f083 100644 --- a/crates/tek_sequencer/src/phrase.rs +++ b/crates/tek_sequencer/src/phrase.rs @@ -1,18 +1,5 @@ use crate::*; -/// Define a MIDI phrase. -#[macro_export] macro_rules! phrase { - ($($t:expr => $msg:expr),* $(,)?) => {{ - #[allow(unused_mut)] - let mut phrase = BTreeMap::new(); - $(phrase.insert($t, vec![]);)* - $(phrase.get_mut(&$t).unwrap().push($msg);)* - phrase - }} -} - -pub type PhraseData = Vec>; - #[derive(Debug)] /// A MIDI sequence. pub struct Phrase { @@ -24,6 +11,8 @@ pub struct Phrase { pub percussive: bool } +pub type PhraseData = Vec>; + impl Default for Phrase { fn default () -> Self { Self::new("", 0, None) @@ -91,3 +80,14 @@ impl Phrase { } } } + +/// Define a MIDI phrase. +#[macro_export] macro_rules! phrase { + ($($t:expr => $msg:expr),* $(,)?) => {{ + #[allow(unused_mut)] + let mut phrase = BTreeMap::new(); + $(phrase.insert($t, vec![]);)* + $(phrase.get_mut(&$t).unwrap().push($msg);)* + phrase + }} +} diff --git a/crates/tek_sequencer/src/sequencer.rs b/crates/tek_sequencer/src/sequencer.rs index c704b9c7..975fe39c 100644 --- a/crates/tek_sequencer/src/sequencer.rs +++ b/crates/tek_sequencer/src/sequencer.rs @@ -2,11 +2,13 @@ use crate::*; /// Phrase editor. pub struct Sequencer { + pub name: String, pub mode: bool, pub focused: bool, pub entered: bool, pub phrase: Option>>, + pub transport: Option>>, pub buffer: BigBuffer, pub keys: Buffer, /// Highlight input keys @@ -34,6 +36,7 @@ handle!(Sequencer |self, e| handle_keymap(self, e, KEYMAP_SEQUENCER)); impl Sequencer { pub fn new () -> Self { Self { + name: "".into(), buffer: Default::default(), keys: keys_vert(), entered: false, @@ -44,6 +47,7 @@ impl Sequencer { phrase: None, now: 0, ppq: 96, + transport: None, note_axis: FixedAxis { start: 12, point: Some(36) diff --git a/crates/tek_sequencer/src/sequencer_cli.rs b/crates/tek_sequencer/src/sequencer_cli.rs new file mode 100644 index 00000000..3a0ddafb --- /dev/null +++ b/crates/tek_sequencer/src/sequencer_cli.rs @@ -0,0 +1,40 @@ +//! Command line option parser. + +use tek_core::clap::{self, Parser, Subcommand}; +use tek_timer::TransportToolbar; +use crate::*; + +#[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)] transport: Option +} + +impl Sequencer { + pub fn from_args () -> Self { + let args = SequencerCli::parse(); + let mut seq = Self::new(); + if let Some(name) = args.name { + seq.name = name.clone(); + } + if let Some(ppq) = args.ppq { + seq.ppq = ppq; + } + if let Some(length) = args.length { + if let Some(phrase) = seq.phrase.as_mut() { + phrase.write().unwrap().length = length; + } + } + if args.transport == Some(true) { + seq.transport = Some(Arc::new(RwLock::new(TransportToolbar::new(None)))); + } + seq + } +}