From 1fd0a560647c2e22e23c7eaf43d35f668b704240 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Sun, 26 Apr 2026 17:04:37 +0200 Subject: [PATCH] Combined mux.c and buttons.c to input.c --- CMakeLists.txt | 2 +- buttons.c | 24 ------------- buttons.h | 5 --- const.h | 11 +++--- input.c | 47 ++++++++++++++++++++++++ input.h | 14 ++++++++ main.c | 98 +++++++++++++++++++++++++++++--------------------- mux.c | 25 ------------- mux.h | 6 ---- synth.cc | 27 +++++++------- 10 files changed, 138 insertions(+), 121 deletions(-) delete mode 100644 buttons.c delete mode 100644 buttons.h create mode 100644 input.c create mode 100644 input.h delete mode 100644 mux.c delete mode 100644 mux.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 77019d1..4146c3a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ pico_sdk_init() file(GLOB_RECURSE DAISYSP_SOURCES "${CMAKE_CURRENT_LIST_DIR}/daisysp/**/*.cpp") -add_executable(sint-gauntlet ${DAISYSP_SOURCES} main.c buttons.c mux.c pwm.c synth.cc) +add_executable(sint-gauntlet ${DAISYSP_SOURCES} main.c input.c pwm.c synth.cc) pico_set_program_name(sint-gauntlet "sint-gauntlet") pico_set_program_version(sint-gauntlet "0.1") diff --git a/buttons.c b/buttons.c deleted file mode 100644 index c048392..0000000 --- a/buttons.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "const.h" -#include "state.h" -#include "vco.h" -#include -#include "hardware/gpio.h" - -void check_button_change(uint pin, bool* btn_state) { - static bool btn_prev[32] = { false }; - bool btn_now = gpio_get(pin); - if (btn_now && !btn_prev[pin]) *btn_state = !*btn_state; - btn_prev[pin] = btn_now; -} - -void update_buttons() { - check_button_change(QUANT_BUTTON, &state.quant_enabled); - check_button_change(AMEN_BUTTON, &state.amen_enabled); - - bool vco_change; - check_button_change(VCO_BUTTON, &vco_change); - if (vco_change) { - if (state.vco_mode == VCO_SAW) state.vco_mode = VCO_SINE; - otherwise state.vco_mode++; - } -} diff --git a/buttons.h b/buttons.h deleted file mode 100644 index 19c7da1..0000000 --- a/buttons.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include - -void update_buttons(); - diff --git a/const.h b/const.h index b833363..a6e6936 100644 --- a/const.h +++ b/const.h @@ -1,15 +1,14 @@ #pragma once +#define MUX0 26 +#define MUX1 27 + #define MUX_S0 2 #define MUX_S1 3 #define MUX_S2 4 -#define MUX0 26 -#define MUX1 27 - -#define VCO_BUTTON 6 -#define QUANT_BUTTON 7 -#define AMEN_BUTTON 8 +#define BUTTON_BASE 6 +#define BUTTON_COUNT 4 #define AUDIO_OUT 0 #define STATUS_LED 1 diff --git a/input.c b/input.c new file mode 100644 index 0000000..3ca7b2e --- /dev/null +++ b/input.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include + +#include "const.h" + +#include "input.h" + +bool is_toggle[BUTTON_COUNT] = { false }; +bool btn_prev[BUTTON_COUNT] = { false }; + +void set_mux_addr(uint8_t addr) { + gpio_put(MUX_S0, addr & 1); + gpio_put(MUX_S1, (addr >> 1) & 1); + gpio_put(MUX_S2, (addr >> 2) & 1); +} + +void update_inputs(input_t* input) { + // Pots + for (uint8_t i = 0; i < 8; i++) { + set_mux_addr(i); + for (uint8_t j = 0; j < 2; j++) { + adc_select_input(j); + sleep_us(20); // Let multiplexers multiplex + uint16_t val = adc_read(); + if (val > 5) input->pots[i + j * 8] = (float)val; + } + } + + // Buttons + for (uint8_t i = 0; i < BUTTON_COUNT; i++) { + bool btn_curr = gpio_get(BUTTON_BASE + i); + + if (btn_curr == true && btn_prev[i] == false) { + if (is_toggle[i]) input->buttons[i] = !input->buttons[i]; + } + + if (!is_toggle[i]) input->buttons[i] = btn_curr; + + btn_prev[i] = btn_curr; + sleep_ms(1); // Why don't you bounce on this dihh + } +} + diff --git a/input.h b/input.h new file mode 100644 index 0000000..8314d8e --- /dev/null +++ b/input.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +typedef struct { + float pots[16]; + bool buttons[4]; +} input_t; + +extern bool is_toggle[4]; +static inline void set_toggle_button(uint8_t index, bool toggle) { is_toggle[index] = toggle; } + +void update_inputs(input_t* input); + diff --git a/main.c b/main.c index 4cf5ad7..fa7c861 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,7 @@ #include +#include #include +#include #include #include #include @@ -10,44 +12,17 @@ #include "pico/multicore.h" #include "pico/stdlib.h" -#include "buttons.h" -#include "synth.h" #include "const.h" #include "macro.h" +#include "input.h" #include "state.h" +#include "synth.h" #include "pwm.h" -#include "mux.h" +input_t input; state_t state; -void init_all() { - stdio_init_all(); - - sleep_ms(2000); - - puts("Starting PIN initialization"); - const uint8_t out_gpio[] = {MUX_S0,MUX_S1,MUX_S2, STATUS_LED}; - const uint8_t in_gpio[] = {VCO_BUTTON,QUANT_BUTTON,AMEN_BUTTON}; - const uint8_t adc_gpio[] = {MUX0,MUX1}; - - for (uint8_t i=0; i < ARRAY_LENGTH(out_gpio); i++) { - gpio_init(out_gpio[i]); - gpio_set_dir(out_gpio[i], true); - } - - for (uint8_t i=0; i < ARRAY_LENGTH(in_gpio); i++) { - gpio_init(in_gpio[i]); - gpio_set_dir(in_gpio[i], false); - } - adc_init(); - for (uint8_t i=0; i < ARRAY_LENGTH(adc_gpio); i++) { - adc_gpio_init(adc_gpio[i]); - adc_select_input(i); - } - - // Synth - synth_init(); - +void core0_init(void) { // PWM bullshit gpio_set_function(AUDIO_OUT, GPIO_FUNC_PWM); @@ -61,22 +36,63 @@ void init_all() { irq_set_exclusive_handler(PWM_IRQ_WRAP, pwm_isr); irq_set_enabled(PWM_IRQ_WRAP, true); + puts("PWM Initialized."); + + // Synth + synth_init(); + puts("Synth Initialized."); } -__attribute__((noreturn)) -void core1_main(void) { +void core1_init(void) { + // GPIO + const uint8_t out_gpio[] = { MUX_S0, MUX_S1, MUX_S2, STATUS_LED }; + const uint8_t adc_gpio[] = {MUX0,MUX1}; + + for (uint8_t i = 0; i < ARRAY_LENGTH(out_gpio); i++) { + gpio_init(out_gpio[i]); + gpio_set_dir(out_gpio[i], true); + } + + for (uint8_t i = 0; i < BUTTON_COUNT; i++) { + gpio_init(BUTTON_BASE + i); + gpio_set_dir(BUTTON_BASE + 1, false); + } + + adc_init(); + adc_gpio_init(MUX0); + adc_gpio_init(MUX1); + + puts("GPIO Initialized."); + + // Input + set_toggle_button(0, true); + set_toggle_button(1, false); + set_toggle_button(2, true); +} + +noreturn void core1_loop(void) { while (1) { - update_buttons(); - update_inputs(); - printf("Sample: %f\n", state.dbg_sample); + update_inputs(&input); + printf("%d %f\n", input.buttons[0], input.pots[0]); + printf("%d\n", input.buttons[1]); + printf("%d\n", input.buttons[2]); + printf("%d\n", input.buttons[3]); sleep_ms(1); } } -__attribute__((noreturn)) -int main() { - init_all(); - multicore_launch_core1(core1_main); - while (1); +noreturn void core0_loop(void) { + while (1) { + + } +} + +int main() { + stdio_init_all(); + core0_init(); + core1_init(); + + multicore_launch_core1(core1_loop); + core0_loop(); } diff --git a/mux.c b/mux.c deleted file mode 100644 index 29c000e..0000000 --- a/mux.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "const.h" -#include "state.h" -#include -#include -#include -#include - -void set_mux_addr(uint8_t addr) { - gpio_put(MUX_S0, addr & 1); - gpio_put(MUX_S1, (addr >> 1) & 1); - gpio_put(MUX_S2, (addr >> 2) & 1); -} - - - -void update_inputs() { - for(uint8_t i = 0; i < 2; i++) { - adc_select_input(i); - for(uint8_t j = 0; j < 8;j++) { - set_mux_addr(j); - sleep_ms(1); // let multiplexor multiplex - state.array[i*8 + j]= adc_read()/4096.0f; - } - } -} diff --git a/mux.h b/mux.h deleted file mode 100644 index da62bcc..0000000 --- a/mux.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -#include - -void set_mux_addr(uint8_t addr); -void update_inputs(); - diff --git a/synth.cc b/synth.cc index 43c170f..cd54dd1 100644 --- a/synth.cc +++ b/synth.cc @@ -101,7 +101,7 @@ void synth_init(void) { osc.Init(SAMPLE_RATE); osc.SetWaveform(vco_mode_to_daisy(VCO_SAW)); osc.SetFreq(440.0f); - osc.SetAmp(2.0f); + osc.SetAmp(1.0f); filter.Init(SAMPLE_RATE); filter.SetFreq(2000.0f); @@ -117,9 +117,9 @@ void synth_init(void) { filter_env.SetTime(ADENV_SEG_ATTACK, 0.01f); filter_env.SetTime(ADENV_SEG_DECAY, 0.5f); filter_env.SetMin(0.0f); - filter_env.SetMax(1.0f); + filter_env.SetMax(2000.0f); - state.clock_bpm = 0.2f; + state.clock_bpm = 0.1f; clock_phase = 0.0f; clock_trig = false; @@ -147,10 +147,10 @@ float get_sample(void) { filter_env.Trigger(); } - vco_env.SetTime(ADENV_SEG_ATTACK, pot_to_time(state.env1_attack, ENV_ATTACK_MIN, ENV_ATTACK_MAX)); - vco_env.SetTime(ADENV_SEG_DECAY, pot_to_time(state.env1_release, ENV_RELEASE_MIN, ENV_RELEASE_MAX)); - filter_env.SetTime(ADENV_SEG_ATTACK, pot_to_time(state.env2_attack, ENV_ATTACK_MIN, ENV_ATTACK_MAX)); - filter_env.SetTime(ADENV_SEG_DECAY, pot_to_time(state.env2_release, ENV_RELEASE_MIN, ENV_RELEASE_MAX)); + //vco_env.SetTime(ADENV_SEG_ATTACK, pot_to_time(state.env1_attack, ENV_ATTACK_MIN, ENV_ATTACK_MAX)); + //vco_env.SetTime(ADENV_SEG_DECAY, pot_to_time(state.env1_release, ENV_RELEASE_MIN, ENV_RELEASE_MAX)); + //filter_env.SetTime(ADENV_SEG_ATTACK, pot_to_time(state.env2_attack, ENV_ATTACK_MIN, ENV_ATTACK_MAX)); + //filter_env.SetTime(ADENV_SEG_DECAY, pot_to_time(state.env2_release, ENV_RELEASE_MIN, ENV_RELEASE_MAX)); float vco_env_out = vco_env.Process(); float filter_env_out = filter_env.Process(); @@ -158,9 +158,10 @@ float get_sample(void) { float vco_freq = pot_to_freq(state.vco_freq, VCO_FREQ_MIN, VCO_FREQ_MAX); if (state.quant_enabled) vco_freq = quantize(vco_freq, 12.0f); - osc.SetFreq(vco_freq); - osc.SetWaveform(vco_mode_to_daisy(state.vco_mode)); - osc.SetAmp(1.0f); + //osc.SetFreq(vco_freq); + static int n = VCO_SINE; + osc.SetWaveform(vco_mode_to_daisy((vco_mode_t)(n++ % 4))); + //osc.SetAmp(1.0f); float vco_out = osc.Process(); @@ -168,12 +169,12 @@ float get_sample(void) { float mod_cutoff = base_cutoff + filter_env_out * (FILTER_FREQ_MAX - FILTER_FREQ_MIN); mod_cutoff = fclamp(mod_cutoff, FILTER_FREQ_MIN, FILTER_FREQ_MAX); - filter.SetFreq(mod_cutoff); - filter.SetRes(state.filter_resonance); + //filter.SetFreq(mod_cutoff); + //filter.SetRes(state.filter_resonance); filter.Process(vco_out); float filtered = filter.Low(); - float vca_out = filtered * vco_env_out * state.vco_volume; + float vca_out = filtered * vco_env_out;// * state.vco_volume; float reverb_out = vca_out; //reverb(vca_out, state.reverb_amount);