From cf0cb6580d6d082b4b9e13a4393ccadecd62dbae Mon Sep 17 00:00:00 2001 From: ArthurGibert Date: Wed, 13 May 2026 14:21:41 +0200 Subject: [PATCH 1/2] fix(control): use full 12-bit value for NRPN change detection Previously the MIDI send threshold always used the 7-bit scaled value (midi_out * 127 / 4095), causing NRPN outputs to skip updates when the full-resolution value changed but the scaled value did not. Co-Authored-By: Claude Sonnet 4.6 --- faderpunk/src/apps/control.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/faderpunk/src/apps/control.rs b/faderpunk/src/apps/control.rs index 417cb723..de6993de 100644 --- a/faderpunk/src/apps/control.rs +++ b/faderpunk/src/apps/control.rs @@ -251,7 +251,7 @@ pub async fn run( let mut main_layer_value = fader.get_value(); let mut fad_val = 0; let mut out: u16 = 0; - let mut last_out = 0; + let mut last_midi = 0u32; loop { app.delay_millis(1).await; @@ -333,11 +333,16 @@ pub async fn run( } else { attenuate_bipolar(main_layer_value, att_layer_value) }; - if last_out != (midi_out as u32 * 127) / 4095 { + let midi_val = if nrpn { + midi_out as u32 + } else { + (midi_out as u32 * 127) / 4095 + }; + if last_midi != midi_val { midi.send_cc(midi_cc, midi_out).await; i2c.send_fader_value(0, out, range); + last_midi = midi_val; } - last_out = (midi_out as u32 * 127) / 4095; // Update LEDs match latch_active_layer { From 32b7ec23aab41e6bb245f29a17f5f81c7973ef28 Mon Sep 17 00:00:00 2001 From: ArthurGibert Date: Wed, 13 May 2026 14:22:44 +0200 Subject: [PATCH 2/2] fix(control): decouple i2c send from MIDI change detection i2c was only firing when the MIDI value changed, causing i2c output to be silently dropped on NRPN or range changes where MIDI didn't update. Now tracked independently with its own last_i2c threshold. Co-Authored-By: Claude Sonnet 4.6 --- faderpunk/src/apps/control.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/faderpunk/src/apps/control.rs b/faderpunk/src/apps/control.rs index de6993de..4413340d 100644 --- a/faderpunk/src/apps/control.rs +++ b/faderpunk/src/apps/control.rs @@ -252,6 +252,7 @@ pub async fn run( let mut fad_val = 0; let mut out: u16 = 0; let mut last_midi = 0u32; + let mut last_i2c = 0u16; loop { app.delay_millis(1).await; @@ -340,9 +341,12 @@ pub async fn run( }; if last_midi != midi_val { midi.send_cc(midi_cc, midi_out).await; - i2c.send_fader_value(0, out, range); last_midi = midi_val; } + if last_i2c != midi_out { + i2c.send_fader_value(0, midi_out, range); + last_i2c = midi_out; + } // Update LEDs match latch_active_layer {