2026-04-30 09:32:14 +02:00

125 lines
2.5 KiB
C

#include <hardware/sync.h>
#include <hardware/irq.h>
#include <pico/stdio.h>
#include <pico/time.h>
#include <stdnoreturn.h>
#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>
#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();
}