diff --git a/.gitmodules b/.gitmodules index 50fe8c6d..04c3bcce 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,11 +3,11 @@ url = https://codeberg.org/unspeaker/rust-jack branch = timebase [submodule "tengri"] - path = tengri - url = https://codeberg.org/unspeaker/tengri + path = deps/tengri + url = ../tengri/ [submodule "deps/rust-jack"] - path = rust-jack + path = deps/rust-jack url = https://codeberg.org/unspeaker/rust-jack [submodule "deps/dizzle"] - path = dizzle + path = deps/dizzle url = ssh://git@codeberg.org/unspeaker/dizzle.git diff --git a/Cargo.toml b/Cargo.toml index 81945851..84c082bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [workspace] resolver = "2" members = [ "./app", "./engine", "./device" ] -exclude = [ "./tengri", "./dizzle" ] +exclude = [ "./deps/tengri", "./deps/dizzle" ] [workspace.package] edition = "2024" @@ -15,14 +15,14 @@ inherits = "test" lto = false [workspace.dependencies.tengri] -path = "./tengri/tengri" +path = "./deps/tengri/tengri" features = [ "tui", "dsl" ] [workspace.dependencies.tengri_proc] -path = "./tengri/proc" +path = "./deps/tengri/proc" [workspace.dependencies.jack] -path = "./rust-jack" +path = "./deps/rust-jack" [workspace.dependencies] tek = { path = "./tek" } diff --git a/app/tek.rs b/app/tek.rs index cdb057e9..11cb8652 100644 --- a/app/tek.rs +++ b/app/tek.rs @@ -908,66 +908,50 @@ pub mod glue { midi_from, midi_from_re, midi_to, midi_to_re, left_from, right_from, left_to, right_to, .. } = &self.action { - - // Connect to JACK - let name = name.as_ref().map_or("tek", |x|x.as_str()); - let jack = Jack::new(&name)?; - - // Collect MIDI IO: - let midi_ins = Connect::collect(&midi_from, &[] as &[&str], &midi_from_re).iter().enumerate() - .map(|(index, connect)|jack.midi_in(&format!("M/{index}"), &[connect.clone()])) - .collect::, _>>()?; - let midi_outs = Connect::collect(&midi_to, &[] as &[&str], &midi_to_re).iter().enumerate() - .map(|(index, connect)|jack.midi_out(&format!("{index}/M"), &[connect.clone()])) - .collect::, _>>()?; - - // TODO: Collect audio IO: + let name = name.as_ref().map_or("tek", |x|x.as_str()); + let jack = Jack::new(&name)?; let empty = &[] as &[&str]; let left_froms = Connect::collect(&left_from, empty, empty); let left_tos = Connect::collect(&left_to, empty, empty); let right_froms = Connect::collect(&right_from, empty, empty); let right_tos = Connect::collect(&right_to, empty, empty); let _audio_froms = &[left_froms.as_slice(), right_froms.as_slice()]; - let _audio_tos = &[left_tos.as_slice(), right_tos.as_slice()]; - - // Create initial project: - let clock = Clock::new(&jack, *bpm)?; - let mut project = Arrangement::new(&jack, None, clock, vec![], vec![], - midi_ins, midi_outs); + let _audio_tos = &[left_tos.as_slice(), right_tos.as_slice()]; + let mut midi_ins = vec![]; + let mut midi_outs = vec![]; + for (index, connect) in Connect::collect(&midi_from, &[] as &[&str], &midi_from_re).iter().enumerate() { + midi_ins.push(jack.midi_in(&format!("M/{index}"), &[connect.clone()])?); + } + for (index, connect) in Connect::collect(&midi_to, &[] as &[&str], &midi_to_re).iter().enumerate() { + midi_outs.push(jack.midi_out(&format!("{index}/M"), &[connect.clone()])?); + }; + let clock = Clock::new( + &jack, *bpm + )?; + let mut project = Arrangement::new( + &jack, None, clock, vec![], vec![], midi_ins, midi_outs + ); project.tracks_add(tracks.unwrap_or(0), None, &[], &[])?; project.scenes_add(scenes.unwrap_or(0))?; - if matches!(self.action, Action::Status) { - - // Show status and exit self.show_status(&project); - } else { - - // Initialize the app state let app = App::new(&jack, project, config, ":menu"); - + let client = jack.run(move|jack|{ + jack.sync_lead(*sync_lead, |mut state|{ + let clock = app.clock(); + clock.playhead.update_from_sample(state.position.frame() as f64); + state.position.bbt = Some(clock.bbt()); + state.position + })?; + jack.sync_follow(*sync_follow)?; + Ok(app) + })?; if matches!(self.action, Action::Headless) { - - // TODO: Headless mode (daemon + client over IPC, then over network...) println!("todo headless"); - } else { - - // Run the [Tui] and [Jack] threads with the [App] state. - Tui::run(true, jack.run(move|jack|{ - jack.sync_lead(*sync_lead, |mut state|{ - let clock = app.clock(); - clock.playhead.update_from_sample(state.position.frame() as f64); - state.position.bbt = Some(clock.bbt()); - state.position - })?; - jack.sync_follow(*sync_follow)?; - Ok(app) - })?)?; - + Tui::run(&client)?; } - } } Ok(()) diff --git a/dizzle b/deps/dizzle similarity index 100% rename from dizzle rename to deps/dizzle diff --git a/rust-jack b/deps/rust-jack similarity index 100% rename from rust-jack rename to deps/rust-jack diff --git a/suil/Cargo.toml b/deps/suil/Cargo.toml similarity index 100% rename from suil/Cargo.toml rename to deps/suil/Cargo.toml diff --git a/suil/build.rs b/deps/suil/build.rs similarity index 100% rename from suil/build.rs rename to deps/suil/build.rs diff --git a/suil/src/bound.rs b/deps/suil/src/bound.rs similarity index 100% rename from suil/src/bound.rs rename to deps/suil/src/bound.rs diff --git a/suil/src/gtk.rs b/deps/suil/src/gtk.rs similarity index 100% rename from suil/src/gtk.rs rename to deps/suil/src/gtk.rs diff --git a/suil/src/lib.rs b/deps/suil/src/lib.rs similarity index 100% rename from suil/src/lib.rs rename to deps/suil/src/lib.rs diff --git a/suil/src/test.rs b/deps/suil/src/test.rs similarity index 100% rename from suil/src/test.rs rename to deps/suil/src/test.rs diff --git a/suil/stdbool.h b/deps/suil/stdbool.h similarity index 100% rename from suil/stdbool.h rename to deps/suil/stdbool.h diff --git a/suil/stdint.h b/deps/suil/stdint.h similarity index 100% rename from suil/stdint.h rename to deps/suil/stdint.h diff --git a/suil/wrapper.h b/deps/suil/wrapper.h similarity index 100% rename from suil/wrapper.h rename to deps/suil/wrapper.h diff --git a/deps/tengri b/deps/tengri new file mode 160000 index 00000000..ce2eeaee --- /dev/null +++ b/deps/tengri @@ -0,0 +1 @@ +Subproject commit ce2eeaee7fc23c3f3683cee310a9117d764409cb diff --git a/vst/.github/workflows/deploy.yml b/deps/vst/.github/workflows/deploy.yml similarity index 100% rename from vst/.github/workflows/deploy.yml rename to deps/vst/.github/workflows/deploy.yml diff --git a/vst/.github/workflows/docs.yml b/deps/vst/.github/workflows/docs.yml similarity index 100% rename from vst/.github/workflows/docs.yml rename to deps/vst/.github/workflows/docs.yml diff --git a/vst/.github/workflows/rust.yml b/deps/vst/.github/workflows/rust.yml similarity index 100% rename from vst/.github/workflows/rust.yml rename to deps/vst/.github/workflows/rust.yml diff --git a/vst/.gitignore b/deps/vst/.gitignore similarity index 100% rename from vst/.gitignore rename to deps/vst/.gitignore diff --git a/vst/CHANGELOG.md b/deps/vst/CHANGELOG.md similarity index 100% rename from vst/CHANGELOG.md rename to deps/vst/CHANGELOG.md diff --git a/vst/Cargo.toml b/deps/vst/Cargo.toml similarity index 100% rename from vst/Cargo.toml rename to deps/vst/Cargo.toml diff --git a/vst/LICENSE b/deps/vst/LICENSE similarity index 100% rename from vst/LICENSE rename to deps/vst/LICENSE diff --git a/vst/README.md b/deps/vst/README.md similarity index 100% rename from vst/README.md rename to deps/vst/README.md diff --git a/vst/examples/dimension_expander.rs b/deps/vst/examples/dimension_expander.rs similarity index 100% rename from vst/examples/dimension_expander.rs rename to deps/vst/examples/dimension_expander.rs diff --git a/vst/examples/fwd_midi.rs b/deps/vst/examples/fwd_midi.rs similarity index 100% rename from vst/examples/fwd_midi.rs rename to deps/vst/examples/fwd_midi.rs diff --git a/vst/examples/gain_effect.rs b/deps/vst/examples/gain_effect.rs similarity index 100% rename from vst/examples/gain_effect.rs rename to deps/vst/examples/gain_effect.rs diff --git a/vst/examples/ladder_filter.rs b/deps/vst/examples/ladder_filter.rs similarity index 100% rename from vst/examples/ladder_filter.rs rename to deps/vst/examples/ladder_filter.rs diff --git a/vst/examples/simple_host.rs b/deps/vst/examples/simple_host.rs similarity index 100% rename from vst/examples/simple_host.rs rename to deps/vst/examples/simple_host.rs diff --git a/vst/examples/sine_synth.rs b/deps/vst/examples/sine_synth.rs similarity index 100% rename from vst/examples/sine_synth.rs rename to deps/vst/examples/sine_synth.rs diff --git a/vst/examples/transfer_and_smooth.rs b/deps/vst/examples/transfer_and_smooth.rs similarity index 100% rename from vst/examples/transfer_and_smooth.rs rename to deps/vst/examples/transfer_and_smooth.rs diff --git a/vst/osx_vst_bundler.sh b/deps/vst/osx_vst_bundler.sh similarity index 100% rename from vst/osx_vst_bundler.sh rename to deps/vst/osx_vst_bundler.sh diff --git a/vst/rustfmt.toml b/deps/vst/rustfmt.toml similarity index 100% rename from vst/rustfmt.toml rename to deps/vst/rustfmt.toml diff --git a/vst/src/api.rs b/deps/vst/src/api.rs similarity index 100% rename from vst/src/api.rs rename to deps/vst/src/api.rs diff --git a/vst/src/buffer.rs b/deps/vst/src/buffer.rs similarity index 100% rename from vst/src/buffer.rs rename to deps/vst/src/buffer.rs diff --git a/vst/src/cache.rs b/deps/vst/src/cache.rs similarity index 100% rename from vst/src/cache.rs rename to deps/vst/src/cache.rs diff --git a/vst/src/channels.rs b/deps/vst/src/channels.rs similarity index 100% rename from vst/src/channels.rs rename to deps/vst/src/channels.rs diff --git a/vst/src/editor.rs b/deps/vst/src/editor.rs similarity index 100% rename from vst/src/editor.rs rename to deps/vst/src/editor.rs diff --git a/vst/src/event.rs b/deps/vst/src/event.rs similarity index 100% rename from vst/src/event.rs rename to deps/vst/src/event.rs diff --git a/vst/src/host.rs b/deps/vst/src/host.rs similarity index 100% rename from vst/src/host.rs rename to deps/vst/src/host.rs diff --git a/vst/src/interfaces.rs b/deps/vst/src/interfaces.rs similarity index 100% rename from vst/src/interfaces.rs rename to deps/vst/src/interfaces.rs diff --git a/vst/src/lib.rs b/deps/vst/src/lib.rs similarity index 100% rename from vst/src/lib.rs rename to deps/vst/src/lib.rs diff --git a/vst/src/plugin.rs b/deps/vst/src/plugin.rs similarity index 100% rename from vst/src/plugin.rs rename to deps/vst/src/plugin.rs diff --git a/vst/src/prelude.rs b/deps/vst/src/prelude.rs similarity index 100% rename from vst/src/prelude.rs rename to deps/vst/src/prelude.rs diff --git a/vst/src/util/atomic_float.rs b/deps/vst/src/util/atomic_float.rs similarity index 100% rename from vst/src/util/atomic_float.rs rename to deps/vst/src/util/atomic_float.rs diff --git a/vst/src/util/mod.rs b/deps/vst/src/util/mod.rs similarity index 100% rename from vst/src/util/mod.rs rename to deps/vst/src/util/mod.rs diff --git a/vst/src/util/parameter_transfer.rs b/deps/vst/src/util/parameter_transfer.rs similarity index 100% rename from vst/src/util/parameter_transfer.rs rename to deps/vst/src/util/parameter_transfer.rs diff --git a/device/arranger.rs b/device/arranger.rs index be67eb03..5b64f3b8 100644 --- a/device/arranger.rs +++ b/device/arranger.rs @@ -370,7 +370,7 @@ impl Arrangement { } } -pub fn wrap (bg: Color, fg: Color, content: impl Content) -> impl Content { +pub(crate) fn wrap (bg: Color, fg: Color, content: impl Content) -> impl Content { let left = Tui::fg_bg(bg, Reset, Fixed::X(1, Repeat::Y("▐"))); let right = Tui::fg_bg(bg, Reset, Fixed::X(1, Repeat::Y("▌"))); Bsp::e(left, Bsp::w(right, Tui::fg_bg(fg, bg, content))) diff --git a/device/clock.rs b/device/clock.rs index e8a42a5a..17ab9d36 100644 --- a/device/clock.rs +++ b/device/clock.rs @@ -292,7 +292,7 @@ pub fn view_status ( ))) } -pub fn button_play_pause (playing: bool) -> impl Content { +pub(crate) fn button_play_pause (playing: bool) -> impl Content { let compact = true;//self.is_editing(); Tui::bg(if playing { Rgb(0, 128, 0) } else { Rgb(128, 64, 0) }, Either::new(compact, diff --git a/device/sampler.rs b/device/sampler.rs index 353b2b5c..c4905944 100644 --- a/device/sampler.rs +++ b/device/sampler.rs @@ -1,5 +1,5 @@ //! ``` -//! let sample = tek_device::Sample::new("test", 0, 0, vec![]); +//! let sample = Sample::new("test", 0, 0, vec![]); //! ``` use crate::*; diff --git a/device/sequencer.rs b/device/sequencer.rs index f7b2145e..c12a263f 100644 --- a/device/sequencer.rs +++ b/device/sequencer.rs @@ -1,22 +1,24 @@ //! MIDI sequencer //! ``` -//! let clip = tek_device::MidiClip::default(); +//! use crate::*; +//! +//! let clip = MidiClip::default(); //! println!("Empty clip: {clip:?}"); //! -//! let clip = tek_device::MidiClip::stop_all(); +//! let clip = MidiClip::stop_all(); //! println!("Panic clip: {clip:?}"); //! -//! let mut clip = tek_device::MidiClip::new("clip", true, 1, None, None); +//! let mut clip = MidiClip::new("clip", true, 1, None, None); //! clip.set_length(96); //! clip.toggle_loop(); -//! clip.record_event(12, midly::MidiMessage::NoteOn { key: 36.into(), vel: 100.into() }); +//! clip.record_event(12, MidiMessage::NoteOn { key: 36.into(), vel: 100.into() }); //! assert!(clip.contains_note_on(36.into(), 6, 18)); //! assert_eq!(&clip.notes, &clip.duplicate().notes); //! //! let clip = std::sync::Arc::new(clip); //! assert_eq!(clip.clone(), clip); //! -//! let sequencer = tek_device::Sequencer::default(); +//! let sequencer = Sequencer::default(); //! println!("{sequencer:?}"); //! ``` diff --git a/shell.nix b/shell.nix index f40138ad..5f36b882 100755 --- a/shell.nix +++ b/shell.nix @@ -8,7 +8,6 @@ pkgs.freetype pkgs.libclang pkgs.mold - pkgs.cloc ]; buildInputs = [ pkgs.jack2 diff --git a/tengri b/tengri deleted file mode 160000 index 04db6f4a..00000000 --- a/tengri +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 04db6f4af549012a4ffab3f06af3d2d6694cf811