Add expression pedal support on GPIO5 (CC 4)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user