wip: adding edn parsing to mixer track

This commit is contained in:
🪞👃🪞 2024-08-09 11:23:12 +03:00
parent 10f191282e
commit a819e042c7
9 changed files with 89 additions and 74 deletions

View file

@ -41,12 +41,12 @@ fn handle_focused (state: &mut App, e: &AppEvent) -> Usually<bool> {
AppFocus::Transport => state.transport.handle(e),
AppFocus::Arranger => state.arranger.sequencer.handle(e),
AppFocus::Sequencer => state.arranger.sequencer.handle(e),
AppFocus::Chain => Ok(if state.entered {
AppFocus::Chain => Ok(false)/*if state.entered {
handle_device(state, e)? ||
handle_keymap(state, e, crate::control::KEYMAP_CHAIN)?
} else {
handle_keymap(state, e, crate::control::KEYMAP_CHAIN)? || handle_device(state, e)?
})
})*/
}
}

View file

@ -69,10 +69,10 @@ impl App {
}
},
Some(Edn::Symbol("scene")) => {
Scene::load_edn(self, &items[1..])?;
tek_sequencer::Scene::load_edn(self, &items[1..])?;
},
Some(Edn::Symbol("track")) => {
Track::load_edn(self, &items[1..])?;
tek_mixer::Track::load_edn(self, &items[1..])?;
},
Some(Edn::Symbol("midi-in")) => {
self.midi_ins = items[1..].iter().map(|x|match x {
@ -107,75 +107,6 @@ impl App {
}
}
impl Scene {
fn load_edn <'a, 'e> (app: &'a mut App, args: &[Edn<'e>]) -> Usually<&'a mut Self> {
let mut name = None;
let mut clips = vec![];
edn!(edn in args {
Edn::Map(map) => {
let key = map.get(&Edn::Key(":name"));
if let Some(Edn::Str(n)) = key {
name = Some(*n);
} else {
panic!("unexpected key in scene '{name:?}': {key:?}")
}
},
Edn::Symbol("_") => {
clips.push(None);
},
Edn::Int(i) => {
clips.push(Some(*i as usize));
},
_ => panic!("unexpected in scene '{name:?}': {edn:?}")
});
let scene = app.arranger.scene_add(name)?;
scene.clips = clips;
Ok(scene)
}
}
impl Track {
fn load_edn <'a, 'e> (app: &'a mut App, args: &[Edn<'e>]) -> Usually<&'a mut Self> {
let ppq = app.transport.ppq();
let mut name = None;
let mut _gain = 0.0f64;
let mut devices: Vec<JackDevice> = vec![];
let mut phrases: Vec<Phrase> = vec![];
edn!(edn in args {
Edn::Map(map) => {
if let Some(Edn::Str(n)) = map.get(&Edn::Key(":name")) {
name = Some(*n);
}
if let Some(Edn::Double(g)) = map.get(&Edn::Key(":gain")) {
_gain = f64::from(*g)
}
},
Edn::List(args) => match args.get(0) {
Some(Edn::Symbol("phrase")) => {
phrases.push(Phrase::load_edn(ppq, &args[1..])?)
},
Some(Edn::Symbol("sampler")) => {
devices.push(Sampler::load_edn(&args[1..])?)
},
Some(Edn::Symbol("lv2")) => {
devices.push(LV2Plugin::load_edn(&args[1..])?)
},
None => panic!("empty list track {}",
name.unwrap_or("")
),
_ => panic!("unexpected in track {}: {:?}",
name.unwrap_or(""),
args.get(0).unwrap()
)
},
_ => {}
});
let track = app.arranger.track_add(name)?;
for phrase in phrases { track.phrases.push(Arc::new(RwLock::new(phrase))); }
for device in devices { track.add_device(device)?; }
Ok(track)
}
}
impl Phrase {
fn load_edn <'e> (ppq: usize, args: &[Edn<'e>]) -> Usually<Self> {