↓ Skip to main content

Raspberry Pi Pico Polyphonic DCO

A DIY digitally controlled analog oscillator inspired by the Roland Juno-106

The Raspberry Pi Pico Polyphonic DCO is a hybrid digital/analog oscillator capable of up to six voices. The RP2040 generates a highly stable digital frequency reference using its PIO system, while an analog Juno-style waveform generator produces classic saw and pulse waves at 10 Vpp, suitable to interface with Eurorack modules. I use the DCO in my Polykit-6 polyphonic synthesizer project.

The software and a printed circuit board with 6 independent voices are available on my Github.

Prototype of the Raspberry Pi Pico DCO

Key Features
#

  • Up to 6 voices
  • Voice stacking and detuning
  • USB MIDI and DIN MIDI input
  • Frequency modulation (FM)
  • PWM control, also per CV
  • Saw and pulse waveforms (10 Vpp analog)
  • PWM-based amplitude control (smoothed to analog)
  • MIDI pitch bend and portamento (CC #65 / CC #5)
  • Optional CV control of stacking, detune, and FM (0–3.3V ADC inputs)
  • Separate gate output

How a DCO Works
#

A Digitally Controlled Oscillator (DCO) uses digital timing for pitch accuracy but produces the waveform in the analog domain. This results in:

  • Digital tuning stability
  • Analog sound character

This design follows the Roland Juno-106 DCO approach.

Roland Juno 106 DCO Wave Generator

1. Digital timing sets the pitch
#

The oscillator frequency is determined by a digital clock. In this project:

  • The RP2040 PIO generates a precisely timed pulse stream.
  • These pulses define the oscillator frequency based on incoming MIDI note data.
  • PIO ensures extremely low jitter and excellent tuning stability.

This digital pulse acts as a reset signal for the analog ramp generator. The DCO design has up to six independent voices using all I/O pins of the Pico.

2. An analog integrator produces the sawtooth
#

Between reset pulses:

  • An op-amp integrator charges a capacitor linearly.
  • The rising capacitor voltage forms a sawtooth ramp.
  • When a reset pulse arrives, a transistor discharges the capacitor instantly.

The result is a stable, clean analog saw wave, but with perfectly controlled pitch.

Raspberry Pi Pico DCO PCB

3. The pulse wave is derived from the saw
#

A comparator monitors the sawtooth ramp:

  • When the saw exceeds a threshold, the comparator toggles.
  • That threshold can be modulated via the PWM input, changing the width of the pulse wave

This produces a pulse (square) wave, often used for classic synth voices.

4. Amplitude control
#

One problem that needs to be solved is the changing amplitude of the output signal. Depending on the oscillator’s frequency, the capacitor has more or less time to charge, resulting in a changing amplitude. There is amplitude compensation with a PWM signal coming from the Pico:

  • An RC low-pass filter smooths it into a control voltage.
  • This controls the amount of charge going into the capacitor and adjusting the amplitude.

This allows digital control over analog loudness without requiring a DAC.

5. Firmware handles voice logic
#

The Pico firmware performs:

  • Voice allocation
  • Polyphony / stacking
  • Detuning
  • FM control
  • Portamento
  • MIDI processing

The result is a hybrid digital–analog oscillator that maintains analog tone with accurate digital control.

Software & PCB
#

The software and printed circuit board are open-source and can be found on my Github.

Complete Polykit-6 Build with DCO

Demo
#

Schematics
#

References
#

Related

Open Source 8-Voice Analog Polyphonic Synthesizer

On this page I’m trying to collect all information about my programmable, analog, 8-voice polyphonic synthesizer. I started this project a long time ago, but it finally entered some stage where it is somewhat presentable. Everything you find here is publicly available. Schematics, PCB layouts, and source code are available on my GitHub. Do not expect a finished product in any form. The resources shown here are for enthusiasts who would like to build and program their own polyphonic synthesizer.

Core VCO

This voltage controlled oscillator is part of my Eurorack series. It outputs a saw and square signal, and its frequency is controlled by a 1V/Octave control voltage. There are CV inputs for frequency modulation, pulse width and oscillator sync. In addition, there are controls for frequency, fine tuning and pulse width.

Steiner-Parker Diode VCF

This filter is part of my Eurorack series. The design is based on the Steiner-Parker diode filter, and I stripped it down to a minimal set of components while keeping its characteristic sound. It has controls for frequency cut-off, resonance and CV level. There are distinct inputs for low-pass, band-pass and high-pass, which allow all sorts of filter responses when combining them.