diff --git a/demos/project.edn b/demos/project.edn index 117e3c83..a3fafcd4 100644 --- a/demos/project.edn +++ b/demos/project.edn @@ -1,27 +1,17 @@ (bpm 150) (track { :name "Drums" :gain +0.0 } - - (sampler { :name "DrumKit1" :dir "/home/user/Lab/Music/pak" } - (sample { :midi 34 :name "808" :file "808.wav" }) - (sample { :midi 35 :name "KC1" :file "kik.wav" }) - (sample { :midi 36 :name "KC2" :file "kik2.wav" }) - (sample { :midi 38 :name "SN1" :file "sna.wav" }) - (sample { :midi 40 :name "SN2" :file "sna2.wav" }) - (sample { :midi 42 :name "HH1" :file "chh.wav" }) - (sample { :midi 44 :name "HH2" :file "chh2.wav" })) - (phrase { :name "4 kicks" :beats 4 :steps 16 } (:00 (36 128)) - (:04 (36 128)) - (:08 (36 128)) - (:12 (36 128))) + (:04 (36 100)) + (:08 (36 100)) + (:12 (36 100))) (phrase { :name "5 kicks" :beats 4 :steps 16 } (:00 (36 128)) - (:04 (36 128)) + (:04 (36 100)) (:08 (36 128)) - (:12 (36 128)) - (:14 (36 128))) + (:12 (36 100)) + (:14 (36 110))) (phrase { :name "D Beat" :beats 4 }) ;(:00 (44 :100) (:34 :100) (:35 :100)) ;(:02 (42 :100) ) @@ -45,7 +35,15 @@ (:10 (44 100)) (:11 (35 100) (36 100)) (:12 (44 100) (40 100)) - (:14 (44 100)))) + (:14 (44 100))) + (sampler { :name "DrumKit1" :dir "/home/user/Lab/Music/pak" } + (sample { :midi 34 :name "808" :file "808.wav" }) + (sample { :midi 35 :name "KC1" :file "kik.wav" }) + (sample { :midi 36 :name "KC2" :file "kik2.wav" }) + (sample { :midi 38 :name "SN1" :file "sna.wav" }) + (sample { :midi 40 :name "SN2" :file "sna2.wav" }) + (sample { :midi 42 :name "HH1" :file "chh.wav" }) + (sample { :midi 44 :name "HH2" :file "chh2.wav" }))) (track { :name "Bass" :gain +0.0 } (phrase { :name "Bass 1" :beats 4 }) @@ -55,7 +53,11 @@ (phrase { :name "Bass 5" :beats 4 }) (phrase { :name "Bass 6" :beats 4 }) (phrase { :name "Bass 7" :beats 4 }) - (phrase { :name "Bass 8" :beats 4 })) + (phrase { :name "Bass 8" :beats 4 }) + (lv2 { + :name "Odin2" + :path "file:///home/user/.lv2/Odin2.lv2" + })) (track { :name "Lead" :gain +0.0 } (phrase { :name "Lead 1" :beats 4 }) @@ -65,4 +67,8 @@ (phrase { :name "Lead 5" :beats 4 }) (phrase { :name "Lead 6" :beats 4 }) (phrase { :name "Lead 7" :beats 4 }) - (phrase { :name "Lead 8" :beats 4 })) + (phrase { :name "Lead 8" :beats 4 }) + (lv2 { + :name "Odin2" + :path "file:///home/user/.lv2/Odin2.lv2" + })) diff --git a/src/edn.rs b/src/edn.rs index 7c006408..fd1c55b4 100644 --- a/src/edn.rs +++ b/src/edn.rs @@ -83,12 +83,24 @@ impl Track { _ => {} } } + let (left, right) = (app.audio_out(0), app.audio_out(1)); app.add_track_with_cb(Some(name.as_str()), move|_, track|{ for phrase in phrases { track.phrases.push(phrase); } for device in devices { - track.add_device(device); + track.add_device(device)?; + } + if let Some(device) = track.devices.get(0) { + device.connect_midi_in(0, &track.midi_out.clone_unowned())?; + } + if let Some(device) = track.devices.get(track.devices.len() - 1) { + if let Some(ref left) = left { + device.connect_audio_out(0, left)?; + } + if let Some(ref right) = right { + device.connect_audio_out(1, right)?; + } } Ok(()) }) @@ -133,10 +145,12 @@ impl Phrase { if !data.contains_key(&time) { data.insert(time, vec![]); } - data.get_mut(&time).unwrap().push(MidiMessage::NoteOn { - key: u7::from(*key as u8), - vel: u7::from(*vel as u8), - }); + let (key, vel) = ( + u7::from((*key as u8).min(127)), + u7::from((*vel as u8).min(127)) + ); + data.get_mut(&time).unwrap() + .push(MidiMessage::NoteOn { key, vel }) } else { panic!("unexpected list in phrase '{name}'") }, @@ -228,7 +242,7 @@ impl LV2Plugin { path = String::from(*p); } }, - _ => panic!("unexpected in sample {name}"), + _ => panic!("unexpected in lv2 '{name}'"), } } Plugin::lv2(&name, &path) diff --git a/src/main.rs b/src/main.rs index 2da6b1f4..14240bf4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -66,13 +66,15 @@ pub fn main () -> Usually<()> { .collect::>()) .collect::>()?; - let audio_outs: Vec<_> = audio_into + state.audio_outs = audio_into .iter() .map(|name|client .ports(Some(name), None, PortFlags::empty()) .get(0) .map(|name|client.port_by_name(name))) .flatten() + .filter_map(|x|x) + .map(Arc::new) .collect(); state.jack = Some(jack); diff --git a/src/model.rs b/src/model.rs index 22330ecc..2bb393c9 100644 --- a/src/model.rs +++ b/src/model.rs @@ -24,7 +24,7 @@ pub struct App { /// Main MIDI controller. pub midi_in: Option>, /// Main audio outputs. - pub audio_outs: Option>>, + pub audio_outs: Vec>>, /// JACK transport handle. pub transport: Option, /// Current transport state @@ -124,6 +124,9 @@ impl App { reset, current_frames as usize, current_usecs as usize, next_usecs as usize, period_usecs as f64 ) } + pub fn audio_out (&self, index: usize) -> Option>> { + self.audio_outs.get(index).map(|x|x.clone()) + } pub fn client (&self) -> &Client { self.jack.as_ref().unwrap().as_client() }