From 1038e24cebe5aa33f38a8f88b6e962def7b5b986 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 27 Jun 2024 21:50:56 +0300 Subject: [PATCH] impl PortList for Sampler --- src/device/sampler.rs | 138 +++++++++++++++++++++++++----------------- 1 file changed, 83 insertions(+), 55 deletions(-) diff --git a/src/device/sampler.rs b/src/device/sampler.rs index ebb4c9c3..8dcd25e1 100644 --- a/src/device/sampler.rs +++ b/src/device/sampler.rs @@ -11,61 +11,9 @@ pub struct Sampler { samples: Arc>>, selected_sample: usize, selected_column: usize, -} - -impl Sampler { - pub fn new (name: &str) -> Result, Box> { - let (client, _) = Client::new(name, ClientOptions::NO_START_SERVER)?; - let samples = vec![ - Sample::new("Kick", &client, 1, 35)?, - Sample::new("Snare", &client, 1, 38)?, - ]; - let samples = Arc::new(Mutex::new(samples)); - let input = client.register_port("trigger", ::jack::MidiIn::default())?; - Ok(DynamicDevice::new(render, handle, process, Self { - name: name.into(), - input, - selected_sample: 0, - selected_column: 0, - samples, - })) - } -} - -pub fn process ( - state: &mut Sampler, - _: &Client, - scope: &ProcessScope, -) -> Control { - let mut samples = state.samples.lock().unwrap(); - for event in state.input.iter(scope) { - let len = 3.min(event.bytes.len()); - let mut data = [0; 3]; - data[..len].copy_from_slice(&event.bytes[..len]); - if (data[0] >> 4) == 0b1001 { // note on - let channel = data[0] & 0b00001111; - let note = data[1]; - let velocity = data[2]; - for sample in samples.iter_mut() { - if sample.trigger.0 == channel && sample.trigger.1 == note { - sample.play(velocity); - } - } - } - for sample in samples.iter_mut() { - if let Some(playing) = sample.playing { - for (index, value) in sample.port.as_mut_slice(scope).iter_mut().enumerate() { - *value = *sample.data[0].get(playing + index).unwrap_or(&0f32); - } - if playing + scope.n_frames() as usize > sample.data[0].len() { - sample.playing = None - } else { - sample.playing = Some(playing + scope.n_frames() as usize) - } - } - } - } - Control::Continue + midi_ins: Vec>, + audio_ins: Vec>, + audio_outs: Vec>, } pub struct Sample { @@ -79,6 +27,86 @@ pub struct Sample { playing: Option, } +impl Sampler { + pub fn new (name: &str) -> Result, Box> { + let (client, _) = Client::new(name, ClientOptions::NO_START_SERVER)?; + let samples = vec![ + Sample::new("Kick", &client, 1, 35)?, + Sample::new("Snare", &client, 1, 38)?, + ]; + let samples = Arc::new(Mutex::new(samples)); + let input = client.register_port("trigger", ::jack::MidiIn::default())?; + Ok(DynamicDevice::new(render, handle, Self::process, Self { + name: name.into(), + input, + selected_sample: 0, + selected_column: 0, + samples, + midi_ins: vec![], + audio_ins: vec![], + audio_outs: vec![], + })) + } + + pub fn process (&mut self, _: &Client, scope: &ProcessScope) -> Control { + let mut samples = self.samples.lock().unwrap(); + for event in self.input.iter(scope) { + let len = 3.min(event.bytes.len()); + let mut data = [0; 3]; + data[..len].copy_from_slice(&event.bytes[..len]); + if (data[0] >> 4) == 0b1001 { // note on + let channel = data[0] & 0b00001111; + let note = data[1]; + let velocity = data[2]; + for sample in samples.iter_mut() { + if sample.trigger.0 == channel && sample.trigger.1 == note { + sample.play(velocity); + } + } + } + for sample in samples.iter_mut() { + if let Some(playing) = sample.playing { + for (index, value) in sample.port.as_mut_slice(scope).iter_mut().enumerate() { + *value = *sample.data[0].get(playing + index).unwrap_or(&0f32); + } + if playing + scope.n_frames() as usize > sample.data[0].len() { + sample.playing = None + } else { + sample.playing = Some(playing + scope.n_frames() as usize) + } + } + } + } + Control::Continue + } + + fn load_sample (&mut self, path: &str) {} +} + +impl PortList for Sampler { + fn audio_ins (&self) -> Usually> { + let mut ports = vec![]; + for port in self.audio_ins.iter() { + ports.push(port.name()?); + } + Ok(ports) + } + fn audio_outs (&self) -> Usually> { + let mut ports = vec![]; + for port in self.audio_outs.iter() { + ports.push(port.name()?); + } + Ok(ports) + } + fn midi_ins (&self) -> Usually> { + let mut ports = vec![]; + for port in self.midi_ins.iter() { + ports.push(port.name()?); + } + Ok(ports) + } +} + impl Sample { pub fn new (name: &str, client: &Client, channel: u8, note: u8) -> Result> {