From 0dd43879171c711da2c6e69468d20f73e82d0c72 Mon Sep 17 00:00:00 2001 From: Niels Geens Date: Mon, 4 Aug 2025 12:24:16 +0200 Subject: [PATCH] Handle metronome volume --- audio_engine/src/metronome.rs | 7 +++++++ audio_engine/src/midi.rs | 22 +++++++++++----------- audio_engine/src/persistence_manager.rs | 16 ++++++++++++++++ audio_engine/src/process_handler.rs | 4 ++++ 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/audio_engine/src/metronome.rs b/audio_engine/src/metronome.rs index d98cb4a..d8cdfb0 100644 --- a/audio_engine/src/metronome.rs +++ b/audio_engine/src/metronome.rs @@ -68,6 +68,13 @@ impl Metronome { Ok(timing) } + pub fn set_click_volume(&mut self, click_volume: f32, persistence: &mut PersistenceManagerController) -> Result<()> { + let clamped = click_volume.clamp(0.0, 1.0); + persistence.update_metronome_volume(clamped)?; + self.click_volume = clamped; + Ok(()) + } + fn process_ppqn_ticks( &mut self, ps: &jack::ProcessScope, diff --git a/audio_engine/src/midi.rs b/audio_engine/src/midi.rs index a0d1c97..716e263 100644 --- a/audio_engine/src/midi.rs +++ b/audio_engine/src/midi.rs @@ -38,11 +38,14 @@ pub fn process_events( let value_num = u8::from(value); match controller_num { - // Expression Pedal A - Track Volume + // Expression Pedals 1 => { process_handler.handle_pedal_a(value_num)?; } - // Button mappings (only process button presses - value > 0) + 2 => { + process_handler.handle_pedal_b(value_num)?; + } + // Buttons 20 if value_num > 0 => { process_handler.handle_button_1()?; } @@ -79,19 +82,16 @@ pub fn process_events( 31 if value_num > 0 => { process_handler.handle_button_down()?; } - _ => { - // Other CC messages - ignore - } + // Other CC messages - ignore + _ => {} } } - _ => { - // Other MIDI messages - ignore - } + // Other MIDI messages - ignore + _ => {} } } - Err(_) => { - // Malformed MIDI messages - ignore - } + // Malformed MIDI messages - ignore + Err(_) => {} } } diff --git a/audio_engine/src/persistence_manager.rs b/audio_engine/src/persistence_manager.rs index f6863ad..16a8b82 100644 --- a/audio_engine/src/persistence_manager.rs +++ b/audio_engine/src/persistence_manager.rs @@ -14,6 +14,9 @@ pub enum PersistenceUpdate { row: usize, volume: f32, }, + UpdateMetronomeVolume { + volume: f32, + } } impl PersistenceManagerController { @@ -29,6 +32,15 @@ impl PersistenceManagerController { Err(_) => Err(LooperError::StateSave(std::panic::Location::caller())), // Channel closed } } + + pub fn update_metronome_volume(&self, volume: f32) -> Result<()> { + let update = PersistenceUpdate::UpdateMetronomeVolume { volume: volume }; + match self.sender.try_send(update) { + Ok(true) => Ok(()), + Ok(false) => Err(LooperError::StateSave(std::panic::Location::caller())), // Channel full + Err(_) => Err(LooperError::StateSave(std::panic::Location::caller())), // Channel closed + } + } } pub struct PersistenceManager { @@ -105,6 +117,10 @@ impl PersistenceManager { .send_modify(|state| state.track_volumes.set_volume(column, row, volume)); self.save_to_disk()?; } + PersistenceUpdate::UpdateMetronomeVolume { volume } => { + self.state + .send_modify(|state| state.metronome.click_volume = volume); + } } Ok(()) diff --git a/audio_engine/src/process_handler.rs b/audio_engine/src/process_handler.rs index 63c5d83..3b00fb9 100644 --- a/audio_engine/src/process_handler.rs +++ b/audio_engine/src/process_handler.rs @@ -58,6 +58,10 @@ impl ProcessHandler Result<()> { + self.metronome.set_click_volume(value as f32 / 127.0, &mut self.persistence) + } + pub fn handle_button_1(&mut self) -> Result<()> { let controllers = TrackControllers::new( &self.post_record_controller,