Closed huykaamaa closed 1 year ago
Does 81fd2fc help?
Thank you, Sir It work amazing But I still have a problem, setpoint reach 1023 but pitchbend value can not reach 16383
Please include the Config
you're using.
Are those Pitch Bend values sent by the Arduino or by the DAW?
struct Config {
// Print the control loop and interrupt frequencies to Serial at startup:
static constexpr bool print_frequencies = false;
// Print the setpoint, actual position and control signal to Serial.
// Note that this slows down the control loop significantly, it probably
// won't work if you are using more than one fader without increasing
// interrupt_divisor:
static constexpr bool print_controller_signals = false;
static constexpr uint8_t controller_to_print = 0;
// Follow the test reference trajectory (true) or receive the target
// position over I²C or Serial (false):
static constexpr bool test_reference = false;
// Increase this divisor to slow down the test reference:
static constexpr uint8_t test_reference_speed_div = 4;
// Allow control for tuning and starting experiments over Serial:
static constexpr bool serial_control = true;
// I²C slave address (zero to disable I²C):
static constexpr uint8_t i2c_address = 8;
// The baud rate to use for the Serial interface (e.g. for MIDI_DEBUG,
// print_controller_signals, serial_control, etc.)
static constexpr uint32_t serial_baud_rate = 1000000;
// The baud rate to use for MIDI over Serial.
// Use 31'250 for MIDI over 5-pin DIN, HIDUINO/USBMidiKliK.
// Hairless MIDI uses 115'200 by default.
// The included python/SerialMIDI.py script uses 1'000'000.
static constexpr uint32_t midi_baud_rate = serial_baud_rate;
// Number of faders, must be between 1 and 4:
static constexpr size_t num_faders = 1;
// Actually drive the motors. If set to false, runs all code as normal, but
// doesn't turn on the motors.
static constexpr bool enable_controller = true;
// Use analog pins (A0, A1, A6, A7) instead of (A0, A1, A2, A3), useful for
// saving digital pins on an Arduino Nano:
static constexpr bool use_A6_A7 = false;
// Use pin A2 instead of D13 as the motor driver pin for the fourth fader.
// Allows D13 to be used as overrun indicator, and avoids issues with the
// bootloader blinking the LED.
// Can only be used if `use_A6_A7` is set to true.
static constexpr bool fader_3_A2 = false;
// Change the setpoint to the current position when touching the knob.
// Useful if your DAW does not send any feedback when manually moving the
// fader.
static constexpr bool touch_to_current_position = true;
// Capacitive touch sensing RC time threshold.
// Increase this time constant if the capacitive touch sense is too
// sensitive or decrease it if it's not sensitive enough:
static constexpr float touch_rc_time_threshold = 150e-6; // seconds
// Bit masks of the touch pins (must be on port B):
static constexpr uint8_t touch_masks[] = {1 << PB0, 1 << PB1, 1 << PB2,
1 << PB4};
// Use phase-correct PWM (true) or fast PWM (false), this determines the
// timer interrupt frequency, prefer phase-correct PWM with prescaler 1 on
// 16 MHz boards, and fast PWM with prescaler 1 on 8 MHz boards, both result
// in a PWM and interrupt frequency of 31.250 kHz
// (fast PWM is twice as fast):
static constexpr bool phase_correct_pwm = true;
// The fader position will be sampled once per `interrupt_divisor` timer
// interrupts, this determines the sampling frequency of the control loop.
// Some examples include 20 → 320 µs, 30 → 480 µs, 60 → 960 µs,
// 90 → 1,440 µs, 124 → 2,016 µs, 188 → 3,008 µs, 250 → 4,000 µs.
// 60 is the default, because it works with four faders. If you only use
// a single fader, you can go as low as 20 because you only need a quarter
// of the computations and ADC time:
static constexpr uint8_t interrupt_divisor = 20 / (1 + phase_correct_pwm);
// The prescaler for the timer, affects PWM and control loop frequencies:
static constexpr unsigned prescaler_fac = 1;
// The prescaler for the ADC, affects speed of analog readings:
static constexpr uint8_t adc_prescaler_fac = 64;
// Turn off the motor after this many seconds of inactivity:
static constexpr float timeout = 2;
// EMA filter factor for fader position filters:
static constexpr uint8_t adc_ema_K = 2;
// SMA filter length for setpoint filters, improves tracking of ramps if the
// setpoint changes in steps (e.g. when the DAW only updates the reference
// every 20 ms). Powers of two are significantly faster (e.g. 32 works well):
static constexpr uint8_t setpoint_sma_length = 32;
// ------------------------ Computed Quantities ------------------------- //
// Sampling time of control loop:
constexpr static float Ts = 1. * prescaler_fac * interrupt_divisor * 256 *
(1 + phase_correct_pwm) / F_CPU;
// Frequency at which the interrupt fires:
constexpr static float interrupt_freq =
1. * F_CPU / prescaler_fac / 256 / (1 + phase_correct_pwm);
// Clock speed of the ADC:
constexpr static float adc_clock_freq = 1. * F_CPU / adc_prescaler_fac;
// Pulse pin D13 if the control loop took too long:
constexpr static bool enable_overrun_indicator =
num_faders < 4 || fader_3_A2;
static_assert(0 < num_faders && num_faders <= 4,
"At most four faders supported");
static_assert(use_A6_A7 || !fader_3_A2,
"Cannot use A2 for motor driver "
"and analog input at the same time");
static_assert(!WITH_MIDI || !serial_control,
"Cannot use MIDI and Serial control at the same time");
static_assert(!WITH_MIDI || !print_controller_signals,
"Cannot use MIDI while printing controller signals");
};
That is PB Value send by RP2040, i was try use hairless midi with Nano but max pitchbend still 16367
Thank you!!!!
My problem is same this thread https://github.com/tttapa/Control-Surface-Motor-Fader/discussions/2 I test with Cubase and Waves eMotion LV1 How to fix with code? Thank you so much!!!