PromptHub
Back to Blog
Embedded Systems Music Technology

Workshop Computer: The Secret Synth Hardware Top Modular Artists Are Switching To

B

Bright Coding

Author

13 min read 59 views
Workshop Computer: The Secret Synth Hardware Top Modular Artists Are Switching To

Workshop Computer: The Secret Synth Hardware Top Modular Artists Are Switching To

What if your next synthesizer wasn't something you bought—but something you built in an afternoon?

Here's the painful truth keeping thousands of musicians and developers awake at night: modular synthesis hardware is either absurdly expensive, hopelessly closed-source, or requires a PhD in electrical engineering to modify. You've felt this frustration. Staring at a $400 eurorack module, wondering why you can't just flash your own reverb algorithm onto it. Drowning in proprietary SDKs that treat your creativity like a security threat. Watching brilliant ideas die because the barrier between "I have an idea" and "I have a working synth" is a mountain of opaque documentation and NDAs.

But what if there was a programmable synthesizer platform that treated you like a collaborator instead of a customer? A piece of hardware where swapping "program cards" takes seconds, where the starter code actually makes sense, and where a thriving community is already sharing wild experiments?

That hardware exists. It's called the Workshop Computer from Music Thing Modular, and the open-source repository behind it is about to become your new obsession.


What Is the Workshop Computer?

The Workshop Computer is the programmable brain of the Music Thing Workshop System—a compact, open-source synthesizer platform designed by Tom Whitwell, the legendary creator behind Music Thing Modular. If you know anything about the DIY synth world, Whitwell's name carries serious weight. This is the same mind that brought us the Turing Machine, Radio Music, and countless other beloved eurorack modules that blurred the line between instrument and experiment.

The Workshop Computer itself is a Raspberry Pi RP2040-based programmable card system. Think of it as the "game cartridge" model applied to synthesizers: you have the hardware chassis with audio I/O, CV (control voltage) connections, knobs, and buttons—and then you slot in different program cards that completely transform what the machine does. One moment it's a granular sampler; the next, a chaotic drone generator; the next, a MIDI-to-CV converter you wrote yourself.

Why it's trending NOW:

  • The RP2040 microcontroller delivers serious processing power (dual-core ARM Cortex-M0+ at 133MHz) at a fraction of the cost of DSP platforms
  • The "program card" physical format makes swapping projects instant and satisfying—no firmware reflashing anxiety
  • Whitwell's radical openness: full hardware documentation, starter code in four different platforms, and explicit encouragement to share whatever you create
  • The Discord community is already exploding with shared projects, from generative sequencers to bizarre audio effects

This isn't another closed ecosystem praying you'll buy their "expansion pack." This is genuinely open hardware in a field notorious for gatekeeping.


Key Features That Make Developers Obsessed

Let's dissect what makes the Workshop Computer a genuinely different beast from anything else on your workbench:

🔧 Quad-Platform Development Freedom

Most hardware forces you into one SDK and dares you to complain. The Workshop Computer ships with starter code for Arduino, Pico SDK, CircuitPython, AND MicroPython. This is unprecedented flexibility. Arduino veterans can iterate fast. Python↗ Bright Coding Blog enthusiasts can prototype in minutes. Bare-metal C coders can squeeze every cycle from the RP2040. You're not learning someone's proprietary framework—you're using tools you already know.

🎛️ Purpose-Built Audio Hardware

The Workshop System chassis provides what synth builders actually need: stereo audio I/O, multiple CV inputs and outputs for eurorack integration, potentiometers and buttons for hands-on control, and USB connectivity for both power and MIDI. The RP2040's PIO (Programmable I/O) peripherals handle precise audio timing without hogging the CPU—critical for low-latency synthesis.

💾 The Program Card Revolution

Physical program cards aren't nostalgia—they're practical workflow magic. Finished a patch? Eject the card, label it, slot in another. No menu diving through 500 presets. No anxiety about overwriting your masterpiece. The card IS the project. For live performers, this means hardware-switching between completely different instruments in under three seconds.

📚 Documentation That Actually Exists

Whitwell maintains a living Google Doc with pinouts and hardware details—no hunting through scattered PDFs. The repository's releases folder contains working and in-progress code from the community. Little leaflets document each card's functionality.

🌐 Community-Driven Development

Whitwell's explicit invitation—"grab numbers & folders in the 'releases' folder by sending pull requests"—creates a meritocratic sharing system. Share your UF2 binary, your source, your documentation, or just a link to your own repo. No artificial barriers.


Use Cases Where the Workshop Computer Absolutely Dominates

1. Rapid Prototyping for Eurorack Modules

Building custom eurorack modules traditionally means spinning PCBs, sourcing obscure components, and praying your analog circuitry doesn't oscillate into smoke. With the Workshop Computer, you can validate your DSP concept in hours: write a wavefolder algorithm, test it with real CV control, iterate based on actual musical results. Only after proving the concept do you commit to custom hardware.

2. Live Performance Instrument Swapping

Imagine this set: you start with a granular texture generator, swap to a west-coast-style complex oscillator for a solo, then drop in a stutter effect processor for the climax. Three entirely different instruments, same hardware, sub-second transitions. The program card format makes this performance-practical in ways software-only solutions never achieve.

3. Teaching Embedded Audio Development

The four-platform support makes the Workshop Computer pedagogically perfect. Beginners start with CircuitPython's gentle learning curve. Intermediate students graduate to Arduino. Advanced developers tackle the Pico SDK. All on identical hardware with identical audio results. Universities and workshops can standardize on one platform while accommodating diverse skill levels.

4. Experimental Music Research

Academic researchers and avant-garde composers need weird tools that don't exist commercially. Non-standard tuning systems? Physically-modeled instruments with impossible geometries? Feedback networks that would crash commercial plugins? The Workshop Computer's open architecture invites genuine sonic research without fighting against "user-friendly" guardrails.

5. Legacy Hardware Emulation

The RP2040's processing power and the system's quality audio I/O enable convincing emulations of vintage digital synths—but with your own twists. Add microtonal scales to a DX7-inspired algorithm. Extend a C64 SID chip emulation with modern modulation sources. The hardware becomes a time machine you can reprogram.


Step-by-Step Installation & Setup Guide

Ready to build your first Workshop Computer program? Here's the complete path from zero to making noise.

Prerequisites

  • Workshop System hardware (the chassis with audio I/O and controls)
  • Workshop Computer card (RP2040-based program card)
  • USB-C cable for power and data
  • Computer running Windows, macOS, or Linux

Platform 1: Pico SDK (Recommended for Performance)

The Pico SDK delivers maximum performance and minimal latency. Here's the setup:

# Clone the official Pico SDK repository
git clone https://github.com/raspberrypi/pico-sdk.git
cd pico-sdk
git submodule update --init

# Set environment variable (add to your .bashrc or .zshrc)
export PICO_SDK_PATH=/path/to/pico-sdk

# Clone the Workshop Computer repository
git clone https://github.com/TomWhitwell/Workshop_Computer.git
cd Workshop_Computer/Demonstrations+HelloWorlds/PicoSDK

For the most developed experience, use Chris Johnson's ComputerCard library:

# Navigate to the ComputerCard library
cd ComputerCard

# Build the examples
mkdir build
cd build
cmake ..
make

# Hold BOOTSEL on your Workshop Computer, then connect USB
# Drag the generated .uf2 file to the RPI-RP2 drive

Platform 2: Arduino (Fastest to Start)

# Install Arduino IDE 2.0 or newer
# Add the Raspberry Pi Pico board package:
# File → Preferences → Additional Board Manager URLs:
# https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

# Tools → Board → Board Manager → Search "Raspberry Pi Pico"
# Install "Raspberry Pi Pico/RP2040" by Earle F. Philhower, III

# Select Tools → Board → Raspberry Pi RP2040 Boards → "Raspberry Pi Pico"
# Select the correct COM port when your Workshop Computer is connected

Platform 3: CircuitPython (Beginner-Friendly)

# Download the latest CircuitPython UF2 for RP2040 from circuitpython.org
# Hold BOOTSEL, connect USB, drag the CircuitPython UF2 to RPI-RP2

# The Workshop Computer mounts as a USB drive named CIRCUITPY
# Copy code.py and any libraries to this drive
# Code runs immediately on save—no compile step!

Platform 4: MicroPython

# Download MicroPython RP2040 UF2 from micropython.org
# Flash same method as CircuitPython

# Use Thonny IDE (recommended) or mpremote for file transfer
# REPL access over USB serial for interactive development

Hardware Pin Reference

Critical pins for audio and control (from the hardware documentation):

Function RP2040 Pin Notes
Audio Out L GPIO 26 (ADC0) PWM or DAC via external codec
Audio Out R GPIO 27 (ADC1) PWM or DAC via external codec
Audio In Various Configurable per program card
CV Inputs Multiple 0-3.3V range, typically 12-bit ADC
Potentiometers Multiple Smooth analog control sources
Buttons Multiple Digital inputs with debouncing
LED GPIO 25 Onboard LED for status indication

REAL Code Examples from the Repository

Let's examine actual code from the Workshop Computer repository, with detailed explanations of how synthesis magic happens.

Example 1: Basic Pico SDK Structure (ComputerCard Library)

This foundational pattern from Chris Johnson's ComputerCard library shows the hardware abstraction that makes cross-platform development possible:

#include "ComputerCard.h"

// Create an instance of the ComputerCard class
// This handles all hardware initialization automatically
ComputerCard card;

// Variables for our simple oscillator
float phase = 0.0f;
float frequency = 440.0f;  // A4 note
float sampleRate = 48000.0f;

// The audio callback - THIS is where your synthesis happens
// Called automatically at the configured sample rate
void AudioCallback(float *in, float *out, size_t size) {
    // Calculate phase increment per sample
    // This converts frequency in Hz to normalized phase step
    float phaseInc = frequency / sampleRate;
    
    for (size_t i = 0; i < size; i++) {
        // Generate sawtooth wave by ramping phase from 0 to 1
        phase += phaseInc;
        
        // Wrap phase to stay in valid range (0.0 to 1.0)
        // Using subtraction avoids expensive fmod() call
        if (phase >= 1.0f) phase -= 1.0f;
        
        // Convert phase to bipolar audio signal (-1.0 to 1.0)
        // Sawtooth: ramp up, then instant drop
        float sample = phase * 2.0f - 1.0f;
        
        // Write to left and right channels (mono for now)
        out[i * 2] = sample;      // Left channel
        out[i * 2 + 1] = sample;  // Right channel
    }
}

void setup() {
    // Initialize hardware with audio callback
    // This configures GPIO, ADC, PWM/DAC, and starts audio ISR
    card.Begin(AudioCallback);
}

void loop() {
    // Main loop runs at lower priority than audio
    // Use this for non-time-critical tasks:
    // - Reading potentiometers
    // - Processing button presses
    // - Updating display or LEDs
    
    // Read CV/pot inputs and update frequency
    float knobValue = card.GetKnob(0);  // 0.0 to 1.0
    frequency = 100.0f + knobValue * 900.0f;  // 100Hz to 1000Hz range
    
    delay(1);  // Small delay to prevent busy-waiting
}

What's happening here? The AudioCallback runs in an interrupt service routine at 48kHz sample rate—meaning it executes 48,000 times per second, guaranteed. Your loop() runs whenever the CPU has spare cycles. This strict separation between real-time audio and control processing is the secret to glitch-free synthesis. The ComputerCard class abstracts the RP2040's PIO and DMA configuration, so you focus on making sound not configuring timers.

Example 2: Reading Hardware Controls (Arduino-Compatible)

This pattern shows how to map physical controls to synthesis parameters:

#include "ComputerCard.h"

ComputerCard card;

// Parameter state
float cutoffFrequency = 1000.0f;
float resonance = 0.5f;
bool previousButtonState = false;

void setup() {
    card.Begin();
    Serial.begin(115200);  // For debugging over USB
}

void loop() {
    // Read analog inputs with smoothing for potentiometer jitter
    // GetKnob() returns 0.0-1.0, mapped to useful ranges
    float rawCutoff = card.GetKnob(0);
    
    // Exponential mapping: human hearing is logarithmic
    // This makes the knob "feel" linear in pitch perception
    cutoffFrequency = 20.0f * powf(1000.0f, rawCutoff);  // 20Hz to 20kHz
    
    // GetKnob(1) for second parameter
    resonance = card.GetKnob(1);  // 0.0 to 1.0 directly usable
    
    // Read button with debouncing handled by library
    bool buttonPressed = card.GetButton(0);
    
    // Detect rising edge (press, not hold)
    if (buttonPressed && !previousButtonState) {
        // Toggle some behavior: waveform shape, effect bypass, etc.
        Serial.println("Button pressed!");
    }
    previousButtonState = buttonPressed;
    
    // Read CV inputs for eurorack integration
    // These are typically 0-3.3V, may need scaling for ±5V or ±10V standards
    float cvInput = card.GetCV(0);  // 0.0 to 1.0 representing 0V to 3.3V
    
    // Optional: print debug info at reasonable rate
    static unsigned long lastPrint = 0;
    if (millis() - lastPrint > 100) {
        Serial.printf("Cutoff: %.1f Hz, Res: %.2f, CV: %.3f\n", 
                      cutoffFrequency, resonance, cvInput);
        lastPrint = millis();
    }
    
    delay(1);
}

Critical insight: The GetKnob() and GetCV() methods handle the analog-to-digital conversion and any necessary scaling. The exponential mapping for frequency is essential—linear potentiometer position mapped to linear frequency sounds wrong to human ears because we perceive pitch logarithmically. This is the kind of psychoacoustic detail that separates professional instruments from amateur hacks.

Example 3: CircuitPython Rapid Prototype

For fastest iteration, CircuitPython lets you edit code directly on the device:

# code.py - runs automatically on Workshop Computer boot

import board
import analogio
import digitalio
import audiopwmio
import audiomixer
import synthio
import time

# Configure audio output using RP2040's PWM audio
# This uses special pins capable of high-frequency PWM
audio = audiopwmio.PWMAudioOut(board.GP26)  # Left channel pin

# Create synthesizer with default sample rate
# synthio is CircuitPython's built-in polyphonic synthesizer!
synth = synthio.Synthesizer(sample_rate=48000)

# Create mixer to combine multiple voices
mixer = audiomixer.Mixer(voice_count=2, 
                         sample_rate=48000,
                         channel_count=2,
                         bits_per_sample=16,
                         samples_signed=True)

# Connect synth to mixer, mixer to audio output
mixer.voice[0].play(synth)
audio.play(mixer)

# Configure analog input for potentiometer
# These pins read 0-65535 representing 0-3.3V
knob = analogio.AnalogIn(board.A0)  # GP26 as analog input

# Configure button with pull-up resistor
button = digitalio.DigitalInOut(board.GP14)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP

# Note frequencies for a pentatonic scale
# Using frequencies that harmonize well together
SCALE = [261.63, 293.66, 329.63, 392.00, 440.00, 523.25]  # C major pentatonic

def get_knob_scaled():
    """Read knob and return 0.0 to 1.0 float"""
    return knob.value / 65535.0

def get_note_from_knob():
    """Map knob position to scale degree"""
    position = get_knob_scaled()
    index = int(position * (len(SCALE) - 1))
    return SCALE[index]

# Main performance loop
while True:
    # Read current knob position and select note
    current_note = get_note_from_knob()
    
    # Trigger note when button pressed (LOW because pull-up)
    if not button.value:
        # Press creates note with envelope: attack, decay, sustain, release
        # These values in seconds create a plucky, organic sound
        envelope = synthio.Envelope(
            attack_time=0.01,   # Fast attack for immediate response
            decay_time=0.3,     # Medium decay
            release_time=0.5,   # Long release for natural tail
            attack_level=1.0,   # Full volume at peak
            sustain_level=0.3   # Quieter sustain after decay
        )
        
        # Create note with sine wave (pure tone)
        # Other waveforms: synthio.SquareWave, synthio.SawtoothWave
        note = synthio.Note(
            frequency=current_note,
            envelope=envelope,
            waveform=synthio.SineWave()
        )
        
        # Press and release creates full envelope shape
        synth.press(note)
        time.sleep(0.1)  # Brief hold
        synth.release(note)
        
        # Simple debounce
        while not button.value:
            time.sleep(0.01)
    
    time.sleep(0.01)  # 100Hz control rate is plenty for human interaction

Why this matters: CircuitPython's synthio module provides production-quality polyphonic synthesis with envelopes, multiple waveforms, and LFOs—yet this entire instrument fits in a readable script. The PWMAudioOut uses the RP2040's hardware PWM to generate audio without external DAC. For prototyping, you can hear results in seconds after saving, not minutes after compiling.


Advanced Usage & Best Practices

Optimization Strategies

Use the PIO for timing-critical tasks. The RP2040's Programmable I/O coprocessors handle precise timing independently of the CPU. For custom digital audio protocols or exotic CV generation, learn the PIO assembly—it's worth the investment.

Double-buffer your audio buffers. The ComputerCard library handles this internally, but if writing bare-metal code, always prepare the next buffer while the current one plays. This prevents dropouts during parameter changes.

Profile with GPIO toggling. Set a pin HIGH at buffer start and LOW at end. Measure with oscilloscope to see your CPU headroom. Target <70% utilization for stable operation with margin for parameter spikes.

Pro Tips from the Community

  • Start with Arduino, optimize with Pico SDK. Validate your concept in the faster environment, then port for final performance
  • Use the Discord actively. Whitwell and experienced builders share undocumented tricks
  • Document your cards with the Google Slides template. Consistent documentation helps others build on your work
  • Version your releases semantically. The shared releases folder benefits from clear naming

Power Considerations

The Workshop Computer runs from USB power (5V) or eurorack power (typically ±12V regulated down). For noise-sensitive audio applications, isolated USB power or quality eurorack supply beats cheap phone chargers. Digital ground loops are the silent killer of clean synth signals.


Comparison with Alternatives

Feature Workshop Computer Daisy Seed Teensy 4.1 Bela Axoloti
Price (dev board) ~$25 (RP2040) ~$30 ~$30 ~$120 Discontinued
Open Source Hardware ✅ Full ⚠️ Partial ❌ No ⚠️ Partial ✅ Full
Physical Program Cards ✅ Yes ❌ No ❌ No ❌ No ❌ No
Starter Code Platforms 4 (Arduino, Pico SDK, CircuitPython, MicroPython) 2 (Arduino, C++) 2 (Arduino, C) 2 (C++, Pd) 1 (Custom)
Community Sharing Model GitHub PRs, open folder Forum, scattered Forum, scattered Forum, scattered Was forum
Eurorack Integration ✅ Native design ⚠️ Requires DIY ⚠️ Requires DIY ⚠️ Requires DIY ⚠️ Requires DIY
Documentation Quality ✅ Living Google Doc, Discord ⚠️ Varies ⚠️ Varies ✅ Good ⚠️ Aging
Creator Pedigree ✅ Tom Whitwell (Music Thing) ⚠️ Electrosmith ⚠️ PJRC ⚠️ Augmented Instruments ❌ Defunct

The verdict? The Workshop Computer wins on integration, openness, and community structure. Daisy Seed and Teensy offer more raw CPU power, but require significant DIY to reach equivalent functionality. Bela's strength is Linux-based flexibility, but at 4x the cost and complexity. For musicians wanting to build and share instruments—not just program them—the Workshop Computer's ecosystem is uniquely coherent.


FAQ

Q: Do I need eurorack to use the Workshop Computer? A: No! The Workshop System is self-contained with headphone and line outputs. Eurorack CV integration is available but optional. Many users treat it as a standalone desktop instrument.

Q: How difficult is the hardware assembly? A: The Workshop System requires basic through-hole soldering. If you can solder a resistor and an IC socket, you can build it. The program cards themselves are typically pre-assembled or use standard RP2040 boards.

Q: Can I use my existing Arduino libraries? A: Yes, with the Earle Philhower Arduino-Pico core, most Arduino libraries work unmodified. Audio-specific libraries may need adaptation for the Workshop Computer's specific pinout.

Q: What's the audio quality? A: 48kHz/16-bit minimum, with paths to higher quality depending on program card design. The hardware supports external audio codecs for professional-grade I/O if your project demands it.

Q: How do I share my creations? A: Fork the GitHub repository, add your project to an available number in the releases folder, and submit a pull request. Share as much or as little as you're comfortable with—binary, source, documentation, or external links all welcome.

Q: Is this suitable for commercial products? A: The hardware and software are open-source; check specific licenses in the repository. Many builders use Music Thing designs as learning platforms before creating proprietary derivatives. Whitwell's community-focused approach encourages commercial experimentation.

Q: What's the latency? A: Typically <5ms round-trip with optimized Pico SDK code. The RP2040's deterministic timing and lack of operating system overhead enables professional-grade responsiveness impossible on general-purpose computers.


Conclusion: Why the Workshop Computer Deserves Your Immediate Attention

The synthesizer world has been stuck in a false dichotomy: expensive closed boxes versus impenetrable DIY projects that never quite work. The Workshop Computer shatters this paradigm by delivering professional hardware with genuine openness, wrapped in a sharing ecosystem that actually functions.

Tom Whitwell didn't just release another development board. He created infrastructure for musical invention—physical, social, and digital. The program card format makes your projects tangible and performable. The four-platform support respects your existing skills. The community structure ensures your work finds collaborators and users.

I've watched countless "revolutionary" music platforms launch and wither. The Workshop Computer feels different because the incentives align: Whitwell's reputation, the hardware's accessibility, and the community's momentum create genuine network effects. Each new program card makes the platform more valuable for everyone.

Your next step is simple. Visit the Workshop Computer repository, grab the starter code for your preferred platform, and make your first sound within the hour. Whether you're building a commercial product, a personal instrument, or just exploring what synthesis can become, this hardware meets you where you are—and takes you further than you expected.

The future of programmable synthesizers isn't locked in a corporate roadmap. It's being written right now, in open repositories and shared experiments, one program card at a time. Don't watch from the sidelines.

Comments (0)

Comments are moderated before appearing.

No comments yet. Be the first to share your thoughts!