Playing notes over I2S
This commit is contained in:
+4
-82
@@ -1,90 +1,12 @@
|
||||
#include "UIThread.h"
|
||||
#include "SharedState.h"
|
||||
#include <Wire.h>
|
||||
|
||||
// --- Local State ---
|
||||
static int g_last_clk_state;
|
||||
|
||||
// --- Forward Declarations ---
|
||||
static void readEncoder();
|
||||
static void updateDisplay();
|
||||
#include <Arduino.h>
|
||||
|
||||
void setupUI() {
|
||||
// --- Initialize I2C and Display ---
|
||||
Wire.setSDA(OLED_SDA_PIN);
|
||||
Wire.setSCL(OLED_SCL_PIN);
|
||||
Wire.begin();
|
||||
|
||||
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
|
||||
Serial.println(F("SSD1306 allocation failed"));
|
||||
for (;;); // Don't proceed, loop forever
|
||||
}
|
||||
display.clearDisplay();
|
||||
display.setTextColor(SSD1306_WHITE);
|
||||
display.setTextSize(1);
|
||||
display.println("NoiceSynth Booting...");
|
||||
display.display();
|
||||
delay(1000);
|
||||
|
||||
// --- Initialize Controls ---
|
||||
pinMode(ENCODER_CLK_PIN, INPUT_PULLUP);
|
||||
pinMode(ENCODER_DT_PIN, INPUT_PULLUP);
|
||||
pinMode(ENCODER_SW_PIN, INPUT_PULLUP);
|
||||
g_last_clk_state = digitalRead(ENCODER_CLK_PIN);
|
||||
// This is the UI thread, running on core 0. For this example, we do nothing here.
|
||||
}
|
||||
|
||||
void loopUI() {
|
||||
// Read the volume potentiometer (Pico ADC is 12-bit, 0-4095)
|
||||
// We use a bit of filtering by averaging with the old value to reduce noise.
|
||||
float new_volume = analogRead(VOL_POT_PIN) / 4095.0f;
|
||||
g_volume = (g_volume * 0.95) + (new_volume * 0.05);
|
||||
|
||||
// Read the rotary encoder
|
||||
readEncoder();
|
||||
|
||||
// Update the display periodically
|
||||
static uint32_t last_display_update = 0;
|
||||
if (millis() - last_display_update > 100) { // Update 10 times/sec
|
||||
last_display_update = millis();
|
||||
updateDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
static void updateDisplay() {
|
||||
display.clearDisplay();
|
||||
display.setCursor(0, 0);
|
||||
|
||||
display.println(F(" NoiceSynth"));
|
||||
display.println(F("--------------------"));
|
||||
|
||||
if (g_note_on) {
|
||||
display.print(F("Note Freq: "));
|
||||
display.print(g_note_frequency, 2);
|
||||
display.println(F(" Hz"));
|
||||
} else {
|
||||
display.println(F("Note: Off"));
|
||||
}
|
||||
|
||||
display.print(F("Volume: "));
|
||||
display.print(static_cast<int>(g_volume * 100));
|
||||
display.println(F("%"));
|
||||
|
||||
display.print(F("Encoder: "));
|
||||
display.println(g_encoder_value);
|
||||
|
||||
display.display();
|
||||
}
|
||||
|
||||
static void readEncoder() {
|
||||
int new_clk_state = digitalRead(ENCODER_CLK_PIN);
|
||||
// Check for a change on the CLK pin (a "tick" of the encoder)
|
||||
if (new_clk_state != g_last_clk_state && new_clk_state == LOW) {
|
||||
// Read the DT pin to determine direction
|
||||
if (digitalRead(ENCODER_DT_PIN) == LOW) {
|
||||
g_encoder_value++; // Clockwise
|
||||
} else {
|
||||
g_encoder_value--; // Counter-clockwise
|
||||
}
|
||||
}
|
||||
g_last_clk_state = new_clk_state;
|
||||
// The loop on core 0 is responsible for updating the UI. In this simple example, it does nothing.
|
||||
delay(100);
|
||||
}
|
||||
Reference in New Issue
Block a user