diff --git a/src/main.rs b/src/main.rs index 4caa57dc..a7733eb9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,11 +71,11 @@ pub fn main () -> Usually<()> { state.scene_cursor = 1; state.note_start = 12; let client = jack.as_client(); - for track in state.tracks.iter() { - if let Some(port) = track.midi_ins()?.get(0) { - client.connect_ports(&track.midi_out, port)?; - } - } + //for track in state.tracks.iter() { + //if let Some(port) = track.midi_ins()?.get(0) { + //client.connect_ports(&track.midi_out, port)?; + //} + //} state.midi_in = Some(client.register_port("midi-in", MidiIn)?); state.transport = Some(client.transport()); state.playing = Some(TransportState::Stopped); diff --git a/src/model/sampler.rs b/src/model/sampler.rs index d7613554..64746101 100644 --- a/src/model/sampler.rs +++ b/src/model/sampler.rs @@ -15,6 +15,7 @@ pub struct Sample { pub struct Sampler { pub name: String, + pub jack: Client, pub cursor: (usize, usize), pub samples: BTreeMap>, pub voices: Vec, @@ -61,32 +62,38 @@ impl Sample { Voice { sample: self.clone(), after, position: self.start } } } +render!(Sampler = crate::view::sampler::render); +handle!(Sampler = crate::control::sampler::handle); +process!(Sampler = Sampler::process); +ports!(Sampler { + audio: { + ins: |s|Ok(s.audio_ins.iter().collect()), + outs: |s|Ok(s.audio_outs.iter().collect()), + } + midi: { ins: |s|Ok(vec![&s.midi_in]), } +}); impl Sampler { pub fn new ( - name: &str, - samples: Option>>, - ) -> Result, Box> { - let (client, _) = Client::new(name, ClientOptions::NO_START_SERVER)?; - DynamicDevice::new( - crate::view::sampler::render, - crate::control::sampler::handle, - Self::process, - Self { - name: name.into(), - cursor: (0, 0), - samples: samples.unwrap_or(BTreeMap::new()), - voices: vec![], - midi_in: client.register_port("midi", ::jack::MidiIn::default())?, - audio_ins: vec![ - client.register_port("recL", ::jack::AudioIn::default())?, - client.register_port("recR", ::jack::AudioIn::default())?, - ], - audio_outs: vec![ - client.register_port("outL", ::jack::AudioOut::default())?, - client.register_port("outR", ::jack::AudioOut::default())?, - ], - }).activate(client) + name: &str, samples: Option>>, + ) -> Usually { + let (jack, _) = Client::new(name, ClientOptions::NO_START_SERVER)?; + Ok(Self { + name: name.into(), + cursor: (0, 0), + samples: samples.unwrap_or(BTreeMap::new()), + voices: vec![], + midi_in: jack.register_port("midi", MidiIn::default())?, + audio_ins: vec![ + jack.register_port("recL", AudioIn::default())?, + jack.register_port("recR", AudioIn::default())?, + ], + audio_outs: vec![ + jack.register_port("outL", AudioOut::default())?, + jack.register_port("outR", AudioOut::default())?, + ], + jack + }) } pub fn process (&mut self, _: &Client, scope: &ProcessScope) -> Control { @@ -135,16 +142,6 @@ impl Sampler { fn load_sample (&mut self, _path: &str) {} } -ports!(Sampler { - audio: { - ins: |sampler|Ok(sampler.audio_ins.iter().collect()), - outs: |sampler|Ok(sampler.audio_outs.iter().collect()), - } - midi: { - ins: |sampler|Ok(vec![&sampler.midi_in]), - } -}); - #[macro_export] macro_rules! sample { ($note:expr, $name:expr, $src:expr) => { {