mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 04:06:45 +01:00
stub out some of the edn command readers
This commit is contained in:
parent
1aa0551931
commit
4fb703d05d
8 changed files with 381 additions and 287 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue