34 lines
1.5 KiB
Markdown
34 lines
1.5 KiB
Markdown
# Stupid Synth Design Document
|
|
|
|
## Overview
|
|
Stupid Synth is a minimalist, 4-voice polyphonic synthesizer designed for the RP2040. It prioritizes zero external component count (other than the sound transducer itself) and code simplicity.
|
|
|
|
## Hardware Design
|
|
* **MCU**: Raspberry Pi Pico (RP2040).
|
|
* **Audio Output**:
|
|
* **Method**: High-speed PWM (Pulse Width Modulation).
|
|
* **Pin**: GP28.
|
|
* **Circuit**: Connect a piezo buzzer directly between GP28 and GND, or a speaker/headphones in series with a 220Ω resistor.
|
|
* **Input**: USB Serial Console (no physical buttons/pots required).
|
|
|
|
## Software Architecture
|
|
### Audio Engine
|
|
* **Carrier Frequency**: ~490 kHz (125MHz sys clock / 255 wrap). This pushes PWM noise far above human hearing, minimizing the need for an analog filter.
|
|
* **Sample Rate**: 22,050 Hz.
|
|
* **Bit Depth**: 8-bit.
|
|
|
|
### Synthesis Engine
|
|
* **Waveform**: Sawtooth (generated via simple phase accumulation).
|
|
* **Polyphony**: 4 simultaneous voices.
|
|
* **Envelope**: Simple Decay (percussive/plucked sound).
|
|
* **Mixing**: Tanh saturation (soft clipping) to prevent digital distortion when voices sum.
|
|
|
|
### Interface
|
|
* **Control**: Keyboard characters sent via Serial Monitor trigger notes.
|
|
* Keys: `a`, `s`, `d`, `f`, `g`, `h`, `j`, `k` (Scale C4 - C5).
|
|
|
|
## Execution Plan
|
|
1. Configure RP2040 Hardware PWM on GP28.
|
|
2. Setup a repeating timer interrupt at 22.05kHz.
|
|
3. Implement the mixing loop and voice management in the interrupt handler.
|
|
4. Process Serial input in the main loop. |