stub out some of the edn command readers

This commit is contained in:
🪞👃🪞 2025-01-11 23:35:35 +01:00
parent 1aa0551931
commit 4fb703d05d
8 changed files with 381 additions and 287 deletions

View file

@ -1,4 +1,5 @@
use crate::*;
use EdnItem::*;
use ClockCommand::{Play, Pause};
use KeyCode::{Tab, Char};
use SequencerCommand as SeqCmd;
@ -15,7 +16,7 @@ handle!(TuiIn: |self: Arranger, input|ArrangerCommand::execute_with_state(self,
#[derive(Clone, Debug)] pub enum AppCommand {
Clear,
Clip(ArrangerClipCommand),
Clip(ClipCommand),
Clock(ClockCommand),
Color(ItemPalette),
Compact(bool),
@ -24,12 +25,101 @@ handle!(TuiIn: |self: Arranger, input|ArrangerCommand::execute_with_state(self,
History(isize),
Pool(PoolCommand),
Sampler(SamplerCommand),
Scene(ArrangerSceneCommand),
Scene(SceneCommand),
Select(ArrangerSelection),
StopAll,
Track(ArrangerTrackCommand),
Track(TrackCommand),
Zoom(usize),
}
impl AppCommand {
pub fn from_edn <'a> (head: &EdnItem<&str>, tail: &'a [EdnItem<String>]) -> Self {
match (head, tail) {
(Key("clear"), [ ]) => Self::Clear,
(Key("clip"), [a, b @ ..]) => Self::Clip(ClipCommand::from_edn(&a.to_ref(), b)),
(Key("clock"), [a, b @ ..]) => Self::Clock(ClockCommand::from_edn(&a.to_ref(), b)),
(Key("color"), [a ]) => Self::Color(ItemPalette::default()),
(Key("compact"), [a ]) => Self::Compact(true),
(Key("editor"), [a, b @ ..]) => Self::Editor(MidiEditCommand::from_edn(&a.to_ref(), b)),
(Key("enqueue"), [a ]) => Self::Enqueue(None),
(Key("history"), [a ]) => Self::History(0),
(Key("pool"), [a, b @ ..]) => Self::Pool(PoolCommand::from_edn(&a.to_ref(), b)),
(Key("sampler"), [a, b @ ..]) => Self::Sampler(SamplerCommand::from_edn(&a.to_ref(), b)),
(Key("scene"), [a, b @ ..]) => Self::Scene(SceneCommand::from_edn(&a.to_ref(), b)),
(Key("select"), [a ]) => Self::Select(ArrangerSelection::Mix),
(Key("stop-all"), [ ]) => Self::StopAll,
(Key("track"), [a, b @ ..]) => Self::Track(TrackCommand::from_edn(&a.to_ref(), b)),
(Key("zoom"), [a ]) => Self::Zoom(0),
_ => panic!(),
}
}
}
#[derive(Clone, Debug)] pub enum ClipCommand {
Get(usize, usize),
Put(usize, usize, Option<Arc<RwLock<MidiClip>>>),
Enqueue(usize, usize),
Edit(Option<Arc<RwLock<MidiClip>>>),
SetLoop(usize, usize, bool),
SetColor(usize, usize, ItemPalette),
}
impl ClipCommand {
pub fn from_edn <'a> (head: &EdnItem<&str>, tail: &'a [EdnItem<String>]) -> Self {
match (head, tail) {
(Key("get"), [a, b ]) => Self::Get(0, 0),
(Key("put"), [a, b, c ]) => Self::Put(0, 0, None),
(Key("enqueue"), [a, b ]) => Self::Enqueue(0, 0),
(Key("edit"), [a ]) => Self::Edit(None),
(Key("loop"), [a, b, c ]) => Self::SetLoop(0, 0, true),
(Key("color"), [a, b, c ]) => Self::SetColor(0, 0, ItemPalette::random()),
_ => panic!(),
}
}
}
#[derive(Clone, Debug)] pub enum SceneCommand {
Add,
Del(usize),
Swap(usize, usize),
SetSize(usize),
SetZoom(usize),
SetColor(usize, ItemPalette),
Enqueue(usize),
}
impl SceneCommand {
pub fn from_edn <'a> (head: &EdnItem<&str>, tail: &'a [EdnItem<String>]) -> Self {
match (head, tail) {
(Key("add"), [ ]) => Self::Add,
(Key("del"), [a ]) => Self::Del(0),
(Key("swap"), [a, b ]) => Self::Swap(0, 0),
(Key("size"), [a ]) => Self::SetSize(0),
(Key("zoom"), [a, ]) => Self::SetZoom(0),
(Key("color"), [a, b, ]) => Self::SetColor(0, ItemPalette::random()),
(Key("enqueue"), [a, ]) => Self::Enqueue(0),
_ => panic!(),
}
}
}
#[derive(Clone, Debug)] pub enum TrackCommand {
Add,
Del(usize),
Stop(usize),
Swap(usize, usize),
SetSize(usize),
SetZoom(usize),
SetColor(usize, ItemPalette),
}
impl TrackCommand {
pub fn from_edn <'a> (head: &EdnItem<&str>, tail: &'a [EdnItem<String>]) -> Self {
match (head, tail) {
(Key("add"), [ ]) => Self::Add,
(Key("del"), [a ]) => Self::Del(0),
(Key("stop"), [a ]) => Self::Stop(0),
(Key("swap"), [a, b ]) => Self::Swap(0, 0),
(Key("size"), [a ]) => Self::SetSize(0),
(Key("zoom"), [a, ]) => Self::SetZoom(0),
(Key("color"), [a, b, ]) => Self::SetColor(0, ItemPalette::random()),
_ => panic!(),
}
}
}
#[derive(Clone, Debug)] pub enum SequencerCommand {
Compact(bool),
History(isize),
@ -51,9 +141,9 @@ handle!(TuiIn: |self: Arranger, input|ArrangerCommand::execute_with_state(self,
History(isize),
Color(ItemPalette),
Clock(ClockCommand),
Scene(ArrangerSceneCommand),
Track(ArrangerTrackCommand),
Clip(ArrangerClipCommand),
Scene(SceneCommand),
Track(TrackCommand),
Clip(ClipCommand),
Select(ArrangerSelection),
Zoom(usize),
Pool(PoolCommand),
@ -61,32 +151,7 @@ handle!(TuiIn: |self: Arranger, input|ArrangerCommand::execute_with_state(self,
StopAll,
Clear,
}
#[derive(Clone, Debug)] pub enum ArrangerClipCommand {
Get(usize, usize),
Put(usize, usize, Option<Arc<RwLock<MidiClip>>>),
Enqueue(usize, usize),
Edit(Option<Arc<RwLock<MidiClip>>>),
SetLoop(usize, usize, bool),
SetColor(usize, usize, ItemPalette),
}
#[derive(Clone, Debug)] pub enum ArrangerSceneCommand {
Add,
Delete(usize),
Swap(usize, usize),
SetSize(usize),
SetZoom(usize),
SetColor(usize, ItemPalette),
Enqueue(usize),
}
#[derive(Clone, Debug)] pub enum ArrangerTrackCommand {
Add,
Delete(usize),
Stop(usize),
Swap(usize, usize),
SetSize(usize),
SetZoom(usize),
SetColor(usize, ItemPalette),
}
command!(|self: SequencerCommand, state: Sequencer|match self {
Self::Clock(cmd) => cmd.delegate(state, Self::Clock)?,
@ -183,9 +248,9 @@ command!(|self: ArrangerCommand, state: Arranger|match self {
}
},
});
command!(|self: ArrangerSceneCommand, state: Arranger|match self {
command!(|self: SceneCommand, state: Arranger|match self {
Self::Add => { state.scene_add(None, None)?; None }
Self::Delete(index) => { state.scene_del(index); None },
Self::Del(index) => { state.scene_del(index); None },
Self::SetColor(index, color) => {
let old = state.scenes[index].color;
state.scenes[index].color = color;
@ -199,9 +264,9 @@ command!(|self: ArrangerSceneCommand, state: Arranger|match self {
},
_ => None
});
command!(|self: ArrangerTrackCommand, state: Arranger|match self {
command!(|self: TrackCommand, state: Arranger|match self {
Self::Add => { state.track_add(None, None)?; None },
Self::Delete(index) => { state.track_del(index); None },
Self::Del(index) => { state.track_del(index); None },
Self::Stop(track) => { state.tracks[track].player.enqueue_next(None); None },
Self::SetColor(index, color) => {
let old = state.tracks[index].color;
@ -210,7 +275,7 @@ command!(|self: ArrangerTrackCommand, state: Arranger|match self {
},
_ => None
});
command!(|self: ArrangerClipCommand, state: Arranger|match self {
command!(|self: ClipCommand, state: Arranger|match self {
Self::Get(track, scene) => { todo!() },
Self::Put(track, scene, clip) => {
let old = state.scenes[scene].clips[track].clone();
@ -311,16 +376,16 @@ keymap!(KEYS_ARRANGER = |state: Arranger, input: Event| ArrangerCommand {
// Transport: Play from start or rewind to start
shift(key(Char(' '))) => ArrCmd::Clock(if state.clock().is_stopped() { Play(Some(0)) } else { Pause(Some(0)) }),
key(Char('e')) => ArrCmd::Editor(MidiEditCommand::Show(state.pool.clip().clone())),
ctrl(key(Char('a'))) => ArrCmd::Scene(ArrangerSceneCommand::Add),
ctrl(key(Char('A'))) => return None,//ArrCmd::Scene(ArrangerSceneCommand::Add),
ctrl(key(Char('t'))) => ArrCmd::Track(ArrangerTrackCommand::Add),
ctrl(key(Char('a'))) => ArrCmd::Scene(SceneCommand::Add),
ctrl(key(Char('A'))) => return None,//ArrCmd::Scene(SceneCommand::Add),
ctrl(key(Char('t'))) => ArrCmd::Track(TrackCommand::Add),
// Tab: Toggle visibility of clip pool column
key(Tab) => ArrCmd::Pool(PoolCommand::Show(!state.pool.visible)),
}, {
use ArrangerSelection as Selected;
use ArrangerSceneCommand as Scene;
use ArrangerTrackCommand as Track;
use ArrangerClipCommand as Clip;
use SceneCommand as Scene;
use TrackCommand as Track;
use ClipCommand as Clip;
let t_len = state.tracks.len();
let s_len = state.scenes.len();
match state.selected {
@ -351,9 +416,9 @@ keymap!(KEYS_ARRANGER = |state: Arranger, input: Event| ArrangerCommand {
fn clip_keymap (state: &Arranger, input: &Event, t: usize, s: usize) -> Option<ArrangerCommand> {
use ArrangerSelection as Selected;
use ArrangerSceneCommand as Scene;
use ArrangerTrackCommand as Track;
use ArrangerClipCommand as Clip;
use SceneCommand as Scene;
use TrackCommand as Track;
use ClipCommand as Clip;
let t_len = state.tracks.len();
let s_len = state.scenes.len();
Some(match input {
@ -385,10 +450,10 @@ fn clip_keymap (state: &Arranger, input: &Event, t: usize, s: usize) -> Option<A
})
}
fn scene_keymap (state: &Arranger, input: &Event, s: usize) -> Option<ArrangerCommand> {
use ArrangerSelection as Selected;
use ArrangerSceneCommand as Scene;
use ArrangerTrackCommand as Track;
use ArrangerClipCommand as Clip;
use ArrangerSelection as Selected;
use SceneCommand as Scene;
use TrackCommand as Track;
use ClipCommand as Clip;
let t_len = state.tracks.len();
let s_len = state.scenes.len();
Some(match input {
@ -398,7 +463,7 @@ fn scene_keymap (state: &Arranger, input: &Event, s: usize) -> Option<ArrangerCo
kpat!(Char('<')) => ArrCmd::Scene(Scene::Swap(s, s - 1)),
kpat!(Char('>')) => ArrCmd::Scene(Scene::Swap(s, s + 1)),
kpat!(Char('q')) => ArrCmd::Scene(Scene::Enqueue(s)),
kpat!(Delete) => ArrCmd::Scene(Scene::Delete(s)),
kpat!(Delete) => ArrCmd::Scene(Scene::Del(s)),
kpat!(Char('c')) => ArrCmd::Scene(Scene::SetColor(s, ItemPalette::random())),
kpat!(Up) => ArrCmd::Select(if s > 0 { Selected::Scene(s - 1) } else { Selected::Mix }),
@ -410,10 +475,10 @@ fn scene_keymap (state: &Arranger, input: &Event, s: usize) -> Option<ArrangerCo
})
}
fn track_keymap (state: &Arranger, input: &Event, t: usize) -> Option<ArrangerCommand> {
use ArrangerSelection as Selected;
use ArrangerSceneCommand as Scene;
use ArrangerTrackCommand as Track;
use ArrangerClipCommand as Clip;
use ArrangerSelection as Selected;
use SceneCommand as Scene;
use TrackCommand as Track;
use ClipCommand as Clip;
let t_len = state.tracks.len();
let s_len = state.scenes.len();
Some(match input {
@ -422,7 +487,7 @@ fn track_keymap (state: &Arranger, input: &Event, t: usize) -> Option<ArrangerCo
kpat!(Char('.')) => ArrCmd::Track(Track::Swap(t, t + 1)),
kpat!(Char('<')) => ArrCmd::Track(Track::Swap(t, t - 1)),
kpat!(Char('>')) => ArrCmd::Track(Track::Swap(t, t + 1)),
kpat!(Delete) => ArrCmd::Track(Track::Delete(t)),
kpat!(Delete) => ArrCmd::Track(Track::Del(t)),
kpat!(Char('c')) => ArrCmd::Track(Track::SetColor(t, ItemPalette::random())),
kpat!(Up) => return None,