
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.

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.

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.

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.

Demo#
Schematics#
References#
- https://blog.thea.codes/the-design-of-the-juno-dco/
- https://electricdruid.net/roland-juno-dcos/
- https://github.com/raspberrypi/pico-examples/tree/master/pio/pwm
- https://github.com/infovore/pico-example-midi
- https://learn.sparkfun.com/tutorials/midi-tutorial/all
- http://www.music-software-development.com/midi-tutorial.html
- http://midi.teragonaudio.com/tech/midispec/run.htm
- https://archive.org/details/synthmanual-roland-juno-106-service-notes







