diff --git a/tek/src/keys.rs b/tek/src/keys.rs index 57fc1ef8..cb9b4575 100644 --- a/tek/src/keys.rs +++ b/tek/src/keys.rs @@ -189,167 +189,3 @@ command!(|self: TekCommand, app: Tek|match self { }, _ => todo!("{self:?}") }); -#[derive(Clone, Debug)] pub enum InputCommand { Add } -atom_command!(InputCommand: |app: Tek| { - ("add" [] Some(Self::Add)) -}); -command!(|self: InputCommand, app: Tek|match self { - Self::Add => { - app.midi_ins.push(JackMidiIn::new(&app.jack, &format!("M/{}", app.midi_ins.len()), &[])?); - None - }, -}); -#[derive(Clone, Debug)] pub enum OutputCommand { Add } -atom_command!(OutputCommand: |app: Tek| { - ("add" [] Some(Self::Add)) -}); -command!(|self: OutputCommand, app: Tek|match self { - Self::Add => { - app.midi_outs.push(JackMidiOut::new(&app.jack, &format!("{}/M", app.midi_outs.len()), &[])?); - None - }, -}); -#[derive(Clone, Debug)] pub enum TrackCommand { - Add, - Del(usize), - Stop(usize), - Swap(usize, usize), - SetSize(usize), - SetZoom(usize), - SetColor(usize, ItemPalette), - TogglePlay, - ToggleSolo, - ToggleRecord, - ToggleMonitor, -} -atom_command!(TrackCommand: |app: Tek| { - ("add" [] Some(Self::Add)) - ("size" [a: usize] Some(Self::SetSize(a.unwrap()))) - ("zoom" [a: usize] Some(Self::SetZoom(a.unwrap()))) - ("color" [a: usize] Some(Self::SetColor(a.unwrap(), ItemPalette::random()))) - ("del" [a: usize] Some(Self::Del(a.unwrap()))) - ("stop" [a: usize] Some(Self::Stop(a.unwrap()))) - ("swap" [a: usize, b: usize] Some(Self::Swap(a.unwrap(), b.unwrap()))) - ("play" [] Some(Self::TogglePlay)) - ("solo" [] Some(Self::ToggleSolo)) - ("rec" [] Some(Self::ToggleRecord)) - ("mon" [] Some(Self::ToggleMonitor)) -}); -command!(|self: TrackCommand, app: Tek|match self { - Self::Add => { - use Selection::*; - let index = app.track_add(None, None, &[], &[])?.0; - app.selected = match app.selected { - Track(t) => Track(index), - Clip(t, s) => Clip(index, s), - _ => app.selected - }; - Some(Self::Del(index)) - }, - Self::Del(index) => { app.track_del(index); None }, - Self::Stop(track) => { app.tracks[track].player.enqueue_next(None); None }, - Self::SetColor(index, color) => { - let old = app.tracks[index].color; - app.tracks[index].color = color; - Some(Self::SetColor(index, old)) - }, - Self::TogglePlay => { - Some(Self::TogglePlay) - }, - Self::ToggleSolo => { - Some(Self::ToggleSolo) - }, - Self::ToggleRecord => { - if let Some(t) = app.selected.track() { - app.tracks[t-1].player.recording = !app.tracks[t-1].player.recording; - } - Some(Self::ToggleRecord) - }, - Self::ToggleMonitor => { - if let Some(t) = app.selected.track() { - app.tracks[t-1].player.monitoring = !app.tracks[t-1].player.monitoring; - } - Some(Self::ToggleMonitor) - }, - _ => None -}); -#[derive(Clone, Debug)] pub enum SceneCommand { - Add, - Del(usize), - Swap(usize, usize), - SetSize(usize), - SetZoom(usize), - SetColor(usize, ItemPalette), - Enqueue(usize), -} -atom_command!(SceneCommand: |app: Tek| { - ("add" [] Some(Self::Add)) - ("del" [a: usize] Some(Self::Del(0))) - ("zoom" [a: usize] Some(Self::SetZoom(a.unwrap()))) - ("color" [a: usize] Some(Self::SetColor(a.unwrap(), ItemPalette::G[128]))) - ("enqueue" [a: usize] Some(Self::Enqueue(a.unwrap()))) - ("swap" [a: usize, b: usize] Some(Self::Swap(a.unwrap(), b.unwrap()))) -}); -command!(|self: SceneCommand, app: Tek|match self { - Self::Add => { - use Selection::*; - let index = app.scene_add(None, None)?.0; - app.selected = match app.selected { - Scene(s) => Scene(index), - Clip(t, s) => Clip(t, index), - _ => app.selected - }; - Some(Self::Del(index)) - }, - Self::Del(index) => { app.scene_del(index); None }, - Self::SetColor(index, color) => { - let old = app.scenes[index].color; - app.scenes[index].color = color; - Some(Self::SetColor(index, old)) - }, - Self::Enqueue(scene) => { - for track in 0..app.tracks.len() { - app.tracks[track].player.enqueue_next(app.scenes[scene].clips[track].as_ref()); - } - None - }, - _ => None -}); -#[derive(Clone, Debug)] pub enum ClipCommand { - Get(usize, usize), - Put(usize, usize, Option>>), - Enqueue(usize, usize), - Edit(Option>>), - SetLoop(usize, usize, bool), - SetColor(usize, usize, ItemPalette), -} -atom_command!(ClipCommand: |app: Tek| { - ("get" [a: usize, b: usize] Some(Self::Get(a.unwrap(), b.unwrap()))) - ("put" [a: usize, b: usize, c: Option>>] Some(Self::Put(a.unwrap(), b.unwrap(), c.unwrap()))) - ("enqueue" [a: usize, b: usize] Some(Self::Enqueue(a.unwrap(), b.unwrap()))) - ("edit" [a: Option>>] Some(Self::Edit(a.unwrap()))) - ("loop" [a: usize, b: usize, c: bool] Some(Self::SetLoop(a.unwrap(), b.unwrap(), c.unwrap()))) - ("color" [a: usize, b: usize] Some(Self::SetColor(a.unwrap(), b.unwrap(), ItemPalette::random()))) -}); -command!(|self: ClipCommand, app: Tek|match self { - Self::Get(track, scene) => { todo!() }, - Self::Put(track, scene, clip) => { - let old = app.scenes[scene].clips[track].clone(); - app.scenes[scene].clips[track] = clip; - Some(Self::Put(track, scene, old)) - }, - Self::Enqueue(track, scene) => { - app.tracks[track].player.enqueue_next(app.scenes[scene].clips[track].as_ref()); - None - }, - Self::SetColor(track, scene, color) => { - app.scenes[scene].clips[track].as_ref().map(|clip|{ - let mut clip = clip.write().unwrap(); - let old = clip.color.clone(); - clip.color = color.clone(); - panic!("{color:?} {old:?}"); - Self::SetColor(track, scene, old) - }) - }, - _ => None -}); diff --git a/tek/src/keys_clip.rs b/tek/src/keys_clip.rs new file mode 100644 index 00000000..cb21ef7b --- /dev/null +++ b/tek/src/keys_clip.rs @@ -0,0 +1,39 @@ +use crate::*; +#[derive(Clone, Debug)] pub enum ClipCommand { + Get(usize, usize), + Put(usize, usize, Option>>), + Enqueue(usize, usize), + Edit(Option>>), + SetLoop(usize, usize, bool), + SetColor(usize, usize, ItemPalette), +} +atom_command!(ClipCommand: |app: Tek| { + ("get" [a: usize, b: usize] Some(Self::Get(a.unwrap(), b.unwrap()))) + ("put" [a: usize, b: usize, c: Option>>] Some(Self::Put(a.unwrap(), b.unwrap(), c.unwrap()))) + ("enqueue" [a: usize, b: usize] Some(Self::Enqueue(a.unwrap(), b.unwrap()))) + ("edit" [a: Option>>] Some(Self::Edit(a.unwrap()))) + ("loop" [a: usize, b: usize, c: bool] Some(Self::SetLoop(a.unwrap(), b.unwrap(), c.unwrap()))) + ("color" [a: usize, b: usize] Some(Self::SetColor(a.unwrap(), b.unwrap(), ItemPalette::random()))) +}); +command!(|self: ClipCommand, app: Tek|match self { + Self::Get(track, scene) => { todo!() }, + Self::Put(track, scene, clip) => { + let old = app.scenes[scene].clips[track].clone(); + app.scenes[scene].clips[track] = clip; + Some(Self::Put(track, scene, old)) + }, + Self::Enqueue(track, scene) => { + app.tracks[track].player.enqueue_next(app.scenes[scene].clips[track].as_ref()); + None + }, + Self::SetColor(track, scene, color) => { + app.scenes[scene].clips[track].as_ref().map(|clip|{ + let mut clip = clip.write().unwrap(); + let old = clip.color.clone(); + clip.color = color.clone(); + panic!("{color:?} {old:?}"); + Self::SetColor(track, scene, old) + }) + }, + _ => None +}); diff --git a/tek/src/keys_ins.rs b/tek/src/keys_ins.rs new file mode 100644 index 00000000..fd443d18 --- /dev/null +++ b/tek/src/keys_ins.rs @@ -0,0 +1,11 @@ +use crate::*; +#[derive(Clone, Debug)] pub enum InputCommand { Add } +atom_command!(InputCommand: |app: Tek| { + ("add" [] Some(Self::Add)) +}); +command!(|self: InputCommand, app: Tek|match self { + Self::Add => { + app.midi_ins.push(JackMidiIn::new(&app.jack, &format!("M/{}", app.midi_ins.len()), &[])?); + None + }, +}); diff --git a/tek/src/keys_outs.rs b/tek/src/keys_outs.rs new file mode 100644 index 00000000..6d1b3235 --- /dev/null +++ b/tek/src/keys_outs.rs @@ -0,0 +1,11 @@ +use crate::*; +#[derive(Clone, Debug)] pub enum OutputCommand { Add } +atom_command!(OutputCommand: |app: Tek| { + ("add" [] Some(Self::Add)) +}); +command!(|self: OutputCommand, app: Tek|match self { + Self::Add => { + app.midi_outs.push(JackMidiOut::new(&app.jack, &format!("{}/M", app.midi_outs.len()), &[])?); + None + }, +}); diff --git a/tek/src/keys_scene.rs b/tek/src/keys_scene.rs new file mode 100644 index 00000000..c7d5ba8b --- /dev/null +++ b/tek/src/keys_scene.rs @@ -0,0 +1,43 @@ +use crate::*; +#[derive(Clone, Debug)] pub enum SceneCommand { + Add, + Del(usize), + Swap(usize, usize), + SetSize(usize), + SetZoom(usize), + SetColor(usize, ItemPalette), + Enqueue(usize), +} +atom_command!(SceneCommand: |app: Tek| { + ("add" [] Some(Self::Add)) + ("del" [a: usize] Some(Self::Del(0))) + ("zoom" [a: usize] Some(Self::SetZoom(a.unwrap()))) + ("color" [a: usize] Some(Self::SetColor(a.unwrap(), ItemPalette::G[128]))) + ("enqueue" [a: usize] Some(Self::Enqueue(a.unwrap()))) + ("swap" [a: usize, b: usize] Some(Self::Swap(a.unwrap(), b.unwrap()))) +}); +command!(|self: SceneCommand, app: Tek|match self { + Self::Add => { + use Selection::*; + let index = app.scene_add(None, None)?.0; + app.selected = match app.selected { + Scene(s) => Scene(index), + Clip(t, s) => Clip(t, index), + _ => app.selected + }; + Some(Self::Del(index)) + }, + Self::Del(index) => { app.scene_del(index); None }, + Self::SetColor(index, color) => { + let old = app.scenes[index].color; + app.scenes[index].color = color; + Some(Self::SetColor(index, old)) + }, + Self::Enqueue(scene) => { + for track in 0..app.tracks.len() { + app.tracks[track].player.enqueue_next(app.scenes[scene].clips[track].as_ref()); + } + None + }, + _ => None +}); diff --git a/tek/src/keys_track.rs b/tek/src/keys_track.rs new file mode 100644 index 00000000..34d8fb19 --- /dev/null +++ b/tek/src/keys_track.rs @@ -0,0 +1,65 @@ +use crate::*; +#[derive(Clone, Debug)] pub enum TrackCommand { + Add, + Del(usize), + Stop(usize), + Swap(usize, usize), + SetSize(usize), + SetZoom(usize), + SetColor(usize, ItemPalette), + TogglePlay, + ToggleSolo, + ToggleRecord, + ToggleMonitor, +} +atom_command!(TrackCommand: |app: Tek| { + ("add" [] Some(Self::Add)) + ("size" [a: usize] Some(Self::SetSize(a.unwrap()))) + ("zoom" [a: usize] Some(Self::SetZoom(a.unwrap()))) + ("color" [a: usize] Some(Self::SetColor(a.unwrap(), ItemPalette::random()))) + ("del" [a: usize] Some(Self::Del(a.unwrap()))) + ("stop" [a: usize] Some(Self::Stop(a.unwrap()))) + ("swap" [a: usize, b: usize] Some(Self::Swap(a.unwrap(), b.unwrap()))) + ("play" [] Some(Self::TogglePlay)) + ("solo" [] Some(Self::ToggleSolo)) + ("rec" [] Some(Self::ToggleRecord)) + ("mon" [] Some(Self::ToggleMonitor)) +}); +command!(|self: TrackCommand, app: Tek|match self { + Self::Add => { + use Selection::*; + let index = app.track_add(None, None, &[], &[])?.0; + app.selected = match app.selected { + Track(t) => Track(index), + Clip(t, s) => Clip(index, s), + _ => app.selected + }; + Some(Self::Del(index)) + }, + Self::Del(index) => { app.track_del(index); None }, + Self::Stop(track) => { app.tracks[track].player.enqueue_next(None); None }, + Self::SetColor(index, color) => { + let old = app.tracks[index].color; + app.tracks[index].color = color; + Some(Self::SetColor(index, old)) + }, + Self::TogglePlay => { + Some(Self::TogglePlay) + }, + Self::ToggleSolo => { + Some(Self::ToggleSolo) + }, + Self::ToggleRecord => { + if let Some(t) = app.selected.track() { + app.tracks[t-1].player.recording = !app.tracks[t-1].player.recording; + } + Some(Self::ToggleRecord) + }, + Self::ToggleMonitor => { + if let Some(t) = app.selected.track() { + app.tracks[t-1].player.monitoring = !app.tracks[t-1].player.monitoring; + } + Some(Self::ToggleMonitor) + }, + _ => None +}); diff --git a/tek/src/lib.rs b/tek/src/lib.rs index 4b612166..1ecd9bd7 100644 --- a/tek/src/lib.rs +++ b/tek/src/lib.rs @@ -7,9 +7,15 @@ #![feature(type_alias_impl_trait)] #![feature(trait_alias)] mod cli; pub use self::cli::*; -mod keys; pub use self::keys::*; mod audio; pub use self::audio::*; +mod keys; pub use self::keys::*; +mod keys_clip; pub use self::keys_clip::*; +mod keys_ins; pub use self::keys_ins::*; +mod keys_outs; pub use self::keys_outs::*; +mod keys_scene; pub use self::keys_scene::*; +mod keys_track; pub use self::keys_track::*; + mod model; pub use self::model::*; mod model_track; pub use self::model_track::*; mod model_scene; pub use self::model_scene::*;