9.5 KiB
NoiceSynth - A Compact RP2040 Synthesizer
A pocket-sized, battery-powered MIDI synthesizer built around the Raspberry Pi Pico. It's designed to be housed in a small enclosure (like an Altoids tin) and features an I2S DAC for quality audio, an OLED display for visual feedback, and a TRS MIDI input.
This guide provides the blueprint for building your own.
Features
- Compact & Portable: Designed to be powered by a LiPo battery and fit into a small tin.
- High-Quality Audio: Uses an I2S audio module for clean, low-noise sound output.
- MIDI Connectivity: Standard 3.5mm TRS-A MIDI input for control with external keyboards and sequencers.
- Expressive Controls: Features a rotary encoder for navigation and a potentiometer for volume control.
- Visual Feedback: A crisp 128x64 OLED display shows synth parameters and status.
Hardware Requirements
| Component | Description |
|---|---|
| MCU | Raspberry Pi Pico or Pico W (RP2040) |
| Audio Output | I2S DAC Amplifier (e.g., MAX98357A or PCM5102A) with a 3.5mm headphone jack. |
| Display | 0.96" SSD1306 128x64 I2C OLED Display. |
| Controls | 1x Rotary Encoder with push-button, 1x 10kΩ Potentiometer. |
| MIDI Input | 1x 3.5mm TRS (Stereo) Jack. |
| Power | 3.7V LiPo Battery and a 5V booster/charger board (e.g., Adafruit PowerBoost). |
| MIDI Circuit Parts | 6N138 or 6N137 Optocoupler, 1N4148 Diode, various resistors (see diagram). |
Powering Your Synth (Battery Operation)
To make the synth truly portable, we'll use a LiPo battery and a booster board. This is critical for providing stable power to all components.
LIPO BATTERY WARNING: LiPo batteries are powerful but require careful handling.
- Never use a LiPo battery without a dedicated protection and charging circuit like the PowerBoost.
- Do not puncture, bend, or short-circuit a LiPo battery.
Wiring for Power:
- Connect the LiPo battery to the JST connector on the PowerBoost board.
- Connect the PowerBoost's 5V output to the Pico's VBUS pin (Pin 40). This powers the Pico.
- Connect the PowerBoost's 5V output to the VCC/VIN pin of your I2S Audio Module.
- Connect the PowerBoost's GND to one of the Pico's GND pins.
- Connect this common ground to the GND pins of all other components (OLED, I2S Module, Encoder, Potentiometer, MIDI circuit).
This setup ensures everything shares a common ground and that the power-hungry components get the stable 5V they need, while the Pico's onboard regulator provides 3.3V for the lower-power parts.
Wiring & Connections
Establish a common ground by connecting the ground from your PowerBoost board to the Pico, and then to all other components' GND pins.
| Component | Pico Pin | Description |
|---|---|---|
| I2S Audio Module | ||
| VCC | 5V from PowerBoost | Power for the amplifier |
| GND | Common GND | Ground |
| DIN (Data) | GP11 (Pin 15) | I2S Data Out |
| BCLK (Bit Clock) | GP9 (Pin 12) | I2S Bit Clock |
| LRCK (Word Clock) | GP10 (Pin 14) | I2S Left/Right Clock |
| SSD1306 OLED | ||
| VCC | 3V3 (OUT) (Pin 36) | 3.3V Power |
| GND | Common GND | Ground |
| SDA | GP4 (Pin 6) | I2C Data |
| SCL | GP5 (Pin 7) | I2C Clock |
| Rotary Encoder | ||
| + (VCC) | 3V3 (OUT) (Pin 36) | 3.3V Power |
| GND | Common GND | Ground |
| CLK | GP12 (Pin 16) | Encoder Clock |
| DT | GP13 (Pin 17) | Encoder Data |
| SW | GP14 (Pin 19) | Encoder Switch |
| Volume Pot | ||
| VCC | 3V3 (OUT) (Pin 36) | 3.3V Power |
| GND | Common GND | Ground |
| Wiper (Output) | GP26 (Pin 31) | ADC0 for volume reading |
| MIDI IN | ||
| (Circuit Output) | GP1 (Pin 2) | UART0 RX for MIDI Data In |
MIDI IN Circuit (TRS Jack)
MIDI requires an opto-isolated input to protect the Pico from electrical faults. We will use a Type A TRS MIDI wiring standard, which is the most common.
- TRS Tip: Connects to MIDI Pin 5 (Current Source)
- TRS Ring: Connects to MIDI Pin 4 (Current Sink)
- TRS Sleeve: Connects to MIDI Pin 2 (Ground/Shield)
Here is a schematic for the input circuit:
TRS JACK
TIP ---- 220Ω ----+----|>|---- (Pin 6 of 6N138)
(MIDI 5) | (Diode)
|
RING --- 220Ω -----+----------- (Pin 5 of 6N138)
(MIDI 4)
6N138 OPTOCOUPLER
Pin 8 (VCC) ----> 3.3V (from Pico)
Pin 7 (VB) ----> GND
Pin 6 (E) --+-> 10kΩ Pull-up Resistor -> 3.3V
|
+-> To Pico GP1 (UART RX)
Pin 5 (GND) ----> GND
This circuit correctly isolates the incoming MIDI signal and inverts it for the Pico's UART receiver.
Software Setup
-
Install RP2040 Board Core:
- In the Arduino IDE, go to Preferences and add this URL to "Additional Boards Manager URLs":
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json - Go to Tools > Board > Boards Manager, search for "pico", and install Raspberry Pi Pico/RP2040.
- Select Raspberry Pi Pico from the board menu.
- In the Arduino IDE, go to Preferences and add this URL to "Additional Boards Manager URLs":
-
Install Libraries:
- Install the following from the Arduino Library Manager:
Adafruit GFX LibraryAdafruit SSD1306- An I2S Audio Library for the Pico (e.g.,
I2Sby Earle F. Philhower, III, which is often included with the core).
- Install the following from the Arduino Library Manager:
-
Upload Code:
- Once everything is wired, you can upload your synthesizer code to the Pico.
Controls & Usage
The specific function of the controls will depend on your code, but here is a common layout:
- Rotary Encoder (Turn): Navigate menus, change synth parameters (e.g., waveform, filter cutoff), or select notes.
- Rotary Encoder (Press): Enter/exit edit mode for a parameter, or trigger an action.
- Volume Potentiometer: Controls the final output volume before it goes to the headphone jack.
Ideas for Unorthodox Sounds
The beauty of a programmable synth is the ability to go beyond simple subtractive synthesis. Here are some fun ideas to code:
-
Glitchy Wavetable Synthesis:
- Concept: Store several single-cycle waveforms (sine, saw, square, triangle) in arrays. The encoder selects the primary waveform.
- The Twist: Add a "glitch" parameter. When activated (e.g., by a long press of the encoder), the code starts intentionally misreading the wavetable. It could randomly jump to a different table, read sample points backward, or apply bitwise operations (
XOR,AND) to the sample data before sending it to the DAC. This creates a source of controlled digital chaos and unexpected textures.
-
Karplus-Strong Physical Modeling:
- Concept: This algorithm simulates a plucked string. A buffer (delay line) is filled with random noise (the "pluck"), then played back and fed back into itself through a simple low-pass filter.
- The Twist: Use the controls in non-standard ways. Map the volume pot to the filter cutoff or the feedback amount instead of volume. High feedback can cause the "string" to resonate infinitely, like an e-bow. Map the rotary encoder to the length of the delay line to change pitch, but allow it to be modified while a note is playing, creating bizarre pitch-bending and warping effects.
-
Chaotic Oscillators:
- Concept: Instead of a standard oscillator, generate sound using a mathematical logistic map, like
x_n+1 = r * x_n * (1 - x_n). The outputxis a value between 0.0 and 1.0. - The Twist: Map the output
xdirectly to the audio sample value. The potentiometer controls therparameter. At lowrvalues, the output is stable or oscillates simply. As you increaserpast ~3.57, it becomes chaotic, generating complex, noise-like, but still structured tones. This gives you a controller that smoothly transitions a sound from a pure tone into pure noise and back again.
- Concept: Instead of a standard oscillator, generate sound using a mathematical logistic map, like
Happy building, and enjoy your new tiny synth!