#include #include #include #include #include #include #include #include #include "hardware/gpio.h" #include "hardware/pwm.h" #include "hardware/adc.h" #include "pico/multicore.h" #include "pico/stdlib.h" #include "const.h" #include "macro.h" #include "input.h" #include "state.h" #include "synth.h" #include "pwm.h" input_t input; state_t state; void core0_init(void) { // PWM bullshit gpio_set_function(AUDIO_OUT, GPIO_FUNC_PWM); uint slice = pwm_gpio_to_slice_num(AUDIO_OUT); pwm_config cfg = pwm_get_default_config(); pwm_config_set_wrap(&cfg, 3400); pwm_init(slice, &cfg, true); pwm_clear_irq(slice); pwm_set_irq_enabled(slice, true); irq_set_exclusive_handler(PWM_IRQ_WRAP, pwm_isr); irq_set_enabled(PWM_IRQ_WRAP, true); puts("PWM Initialized."); // Synth synth_init(&state); puts("Synth Initialized."); } 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); } void debug_print(void) { printf("\x1b[H\x1b[J"); printf("0: %f, 1: %f, 2: %f, 3: %f, 4: %f, 5: %f, 6: %f, 7: %f\n", input.pots[0], input.pots[1], input.pots[2], input.pots[3], input.pots[4], input.pots[5], input.pots[6], input.pots[7]); printf( "vco_freq: %f\n" "vco_volume: %f\n" "filter_freq: %f\n" "filter_resonance: %f\n" "clock_bpm: %f\n" "env1_attack: %f\n" "env1_decay: %f\n" "env2_attack: %f\n" "env2_decay: %f\n" "reverb_amount: %f\n", state.vco_freq, state.vco_volume, state.filter_freq, state.filter_resonance, state.clock_bpm, state.env1_attack, state.env1_decay, state.env2_attack, state.env2_decay, state.reverb_amount ); } noreturn void core1_loop(void) { while (1) { update_inputs(&input); update_state(&state, &input); sleep_ms(1); } } noreturn void core0_loop(void) { while (1) __wfi(); } int main() { stdio_init_all(); core1_init(); core0_init(); multicore_launch_core1(core1_loop); core0_loop(); }