Add expression pedal support on GPIO5 (CC 4)

This commit is contained in:
ash
2026-07-02 04:00:06 +00:00
parent ae2891fca8
commit 08d6fc8701
3 changed files with 88 additions and 1 deletions
+50
View File
@@ -0,0 +1,50 @@
#include "expression_pedal.h"
#include "midi_transport.h"
#include <Arduino.h>
ExpressionPedal::ExpressionPedal(uint8_t adc_pin)
: adc_pin(adc_pin)
, current_value(0)
, last_sent_value(255)
, midi_channel(1)
, midi_cc(4)
, last_read_time(0)
{
}
void ExpressionPedal::begin() {
Serial.printf("[EXP] Expression pedal on ADC1_CH4 (GPIO%d)\n", adc_pin);
analogReadResolution(12);
pinMode(adc_pin, INPUT);
delay(10);
uint16_t initial = analogRead(adc_pin);
current_value = adc_to_midi(initial);
last_sent_value = current_value;
Serial.printf("[EXP] Initial ADC: %d -> MIDI: %d\n", initial, current_value);
}
void ExpressionPedal::update(UsbMidiTransport& midi) {
uint32_t now = millis();
if (now - last_read_time < READ_INTERVAL_MS) return;
last_read_time = now;
uint16_t raw = analogRead(adc_pin);
uint8_t new_value = adc_to_midi(raw);
if (new_value > current_value + HYSTERESIS ||
new_value + HYSTERESIS < current_value ||
(new_value != current_value && (new_value == 0 || new_value == 127))) {
current_value = new_value;
}
if (current_value != last_sent_value) {
last_sent_value = current_value;
midi.send_cc(midi_channel, midi_cc, current_value);
Serial.printf("[EXP] CC%d: %d\n", midi_cc, current_value);
}
}
uint8_t ExpressionPedal::adc_to_midi(uint16_t adc_value) {
uint32_t scaled = (uint32_t)adc_value * 127 / 4095;
return (uint8_t)scaled;
}