Voltage-controlled digital oscillator VCDO1 – Electric Druid

Voltage-controlled digital oscillator VCDO1

A single chip 1V/Oct voltage controlled digital oscillator, with 20 waveforms in a scannable wavetable.

The VCDO uses a PIC 16F1847 microprocessor to create a versatile and simple voltage-controlled 8-bit digital wavetable oscillator. All oscillator parameters are controlled by 0-5V control voltages. The chip has a native exponential control response, making interfacing with 1V/Oct control voltages very simple, even without an exponential convertor.

Scanning through the wavetable with the Waveform knob. Sub Osc is a simple sine 2 octs down:


Starting with a straight sound, then wrecking it with delicious bitcrush:


Glide between notes:


A ‘ping’y sound with a touch of envelope to the wave CV:


Switching through a few of the Sub Osc options. There are 8 waveforms, each available either -2 octs, -1 oct, Unison, or +1 octave.


Scanning through the wavetable with an envelope:


Note that none of these sounds include any filtering. They were recorded using a Sequential Pro-One to provide a CV and VCA (via the External Audio input) but the filter was left wide open.

Additionally, Rick Holt has some great sound examples (much better than mine!) over at the Frequency Central VCDO page. He builds and sells a module based on my chip.

VCDO Features

Exponential frequency response with no exponential convertor

The Note CV input accepts 0-5V control voltages to cover the MIDI note range 0-63. The highest note the VCDO can produce is Note 120, 8372Hz.

10 octave note range from 8.18Hz to 8372Hz

The basic frequency range of the VCDO is ten octaves from MIDI Note 0 to MIDI Note 120. The NOTE CV input is quantized to semitones, but the FREQ MOD CV input is not.

Main Oscillator with 16 waveforms arranged as a wavetable

The chip can produce 16 output waveforms. Rather than switch from one to another, the oscillator is able to crossfade from one to the next, creating a wavetable which you can scan through under voltage control.

It would have been easy to include standard waveforms like ramps and triangles, but there are many oscillators that produce those. This oscillator has its own character and provides something different.

Separate Sub Oscillator with 8 waveforms at four octaves

As well as the main oscillator, there is also a sub oscillator with 8 waveforms. Each waveform can be selected at one of four octaves, either +1 octave (above the main osc pitch!), in unison, -1 octave, or -2 octaves.

Bitcrushing effect

The BITCRUSH CONTROL input controls the sample bit resolution of the output. This can be reduced from 8-bit down to 1-bit in eight steps.


The chip also includes a glide/portamento effect, without requiring an external lag processor for the control voltage. Glide times range from 12ms/octave to 2.4secs/octave. Turning the GLIDE CONTROL to minimum switches the glide effect off.

8-bit, 62.5KHz sample output rate

The internal waveforms and calculations are 8-bit, and new samples are output via the on-chip PWM modules at 62.5KHz. The PWM modules’ outputs are at 125KHz. The fact that this is higher than the sample rate allows more effective PWM filtering to be applied. The two-stage 24dB Bessel filter provides the best-possible pulse filtering.

Easy interfacing to control voltage mixers

The inputs intended for control voltages have an inverted response to make it simple to interface them with an inverting mixer. This is shown in the application circuits.

The waveforms and an example circuit are in the datasheet.

More details

If you’d like to build one, or like to know how I built mine, perhaps you’d like to look at:

VCDO elsewhere on the web

Rick Holt has a DIY PCB for this project over at his website – Frequency Central VCDO DIY page.

49 thoughts on “Voltage-controlled digital oscillator VCDO1

  1. Hey there !
    what chip’s do you use for IC1.1/1.2 and IC2.1/2.2 for filtering the PWM output out of the VCDO (the chips or the 24dB Bessel LPF)

    thanks a head 🙂

    1. Any typical audio op-amp will do. I used TL072’s, but LF353 or MC1458’s would do just as well. The circuit isn’t fussy about op-amp choice, so it doesn’t matter too much.

  2. Hey, I build your VCDO circuit but get a slight modulation or flutter in sound (cant tell if frequency or another parameter).
    I didn’t build the 1k/100nF potentiometer smoothing filter, because of the way I arranged it on (perma-)breadboard there wasn’t any place left.
    Is the smoothing crucial or should I look out for a grounding issue?
    Your help is very much appreciated, all the best!

    1. On the first version of the Freq Central VCDO PCB, we had some problems with the CV inputs that were next to the PWM outputs. On the second revision, I routed the PWM outputs on the other side of the board from all the CV inputs, and that fixed it. I think the Wave CV was the culprit. Adding a good dollop of capacitor from that input to ground solved a lot of issues. Try that and see if it helps.
      Decent grounding is always a good idea, but I’m always amazed at what I can get away with!

  3. Hello,
    I studied your circuit diagrams in the datasheet a bit.
    I wondered, shouldn’t C18 be connected the other way around. The – should actually connect to -15V and the + to GND.

    By the way would +/- 12 V do as well?

    1. Yes, it should. Well spotted! It’s electrolytic, so it should definitely be -ve to -15V and +ve to Ground.

      Yes, +/-12V works fine too, with no changes. The only parts that are voltage-sensitive run off the +5V supply, so there’s no problem.

  4. Hey Tom, what´s the difference between control inputs and cv inputs, are they just two of the same, can I cv the bitcrushing e.g.?

    1. Yes, basically they are two of the same. You can CV the bitcrush. Sometimes I tweaked the ranges to suit either a knob or a CV, but in general they’re just added together inside the chip.


      1. Ah, that´s what I thought, just wanted to make sure before starting to build!
        Thanks for answering (and all the cool stuff on your site btw.)!

  5. Hi Tom

    great stuff! One quick and possibly dumb question but could I control pitch of the VCDO 1 from a ribbon controller input into NOTE CV or would the semitone quantizer step it to the nearest semitone?



    1. If you feed it to NOTE CV, it’ll get quantised, yes. If you feed it to FREQ MOD CV, it won’t get quantised, but the range is more limited. This was my sneaky way of working around the limitations of the on-chip ADC.


      1. Hi Tom

        that’s not the three octaves I’d hoped for. Oh well, back to the analogue drawing board!



        1. You could give the code a tweak…
          3 octaves on the Freq Mod CV wouldn’t be hard to do, and you’d have enough resolution for that.
          Altering this part of the RebuildPitchWord routine so the FREQ_MOD_CV was one bit further left would give you a 32 note range instead of the 16 notes that it currently has:

          ; Add the Freq Mod CV
          swapf FREQ_MOD_CV, w
          andlw 0xF0 ; Get low nibble in upper nibble position
          addwf REQ_PITCH_LO,f ; Add low nibble to low byte
          swapf FREQ_MOD_CV, w
          andlw 0x0F ; Get upper nibble in low nibble position
          addwfc REQ_PITCH_HI,f ; Add upper nibble to high byte

          Although in fact, I might be tempted to alter the set-up of REQ_PITCH_HI/LO, since doing it this way would avoids turning FREQ_MOD_CV into a two-byte variable and then doing a two-byte addition.

          ; Start with the Master Offset
          clrf REQ_PITCH_LO
          ; movlw (256-37) ; -37 semitones offset
          ; DEBUG - no offset for now

          ; Add the Freq Mod CV
          movf FREQ_MOD_CV, w
          movwf REQ_PITCH_HI ; Too much range
          lsrf REQ_PITCH_HI, f ; Downshift 3 places
          rrf REQ_PITCH_L, f
          lsrf REQ_PITCH_HI, f
          rrf REQ_PITCH_L, f
          lsrf REQ_PITCH_HI, f
          rrf REQ_PITCH_L, f

          ; Add the Note CV
          movf NOTE_CV, w
          addwf REQ_PITCH_HI, f

          1. Hi Tom

            thanks for that but it’s a bit beyond at the moment. Last coding I did was in basic in 1978 without the benefit of a computer to run it.



  6. so feel free to download and use Electric Druid code in your personal synth…
    I did, and use it in a midi controlled generator I am building using an Arduino and an AM7200 256*9bit FIFO (and some other chips..).
    Thanks for the waveforms!

  7. As soon as the module is finished I’ll post a link to youtube and a thread on Electro-music.com but this might take some time while I’m still in the hard/software design phase.

  8. Hi Tom,
    Have you ever considered to add MIDI in to your VCDO?
    I am not using CV so it would spare me MIDI to CV.

  9. Hi Tom
    I have build The VCDO but it goes backwards, the notes get higher to the left and not to the right as supposed. I’m a little puzzled about this.
    I love your work, thanks for all the info.
    Juan Pablo

    1. The Note CV (and many others on the chip) are designed to be used with an inverting op-amp CV mixer in front of them. To save an op-amp, the CV is then inverted on the chip. If you use the chip *without* the inverting mixer, you’ll find that things run back-to-front, as in your situation. Check the example circuit diagram in the datasheet for a CV mixer circuit.

  10. Hi, I really love your page and your amazing work.
    I have made a vcdo but with my midi to cv it works backwards, the bass notes to the right, I am puzzled and don’t know how to invert that.
    Thanks in advance

    Juan Pablo

  11. Sorry for the double question I thought that it have not been sent.
    Thanks for the replay, I’ll try it.

  12. Hi Tom,
    Have just assembled your VCDO design onto breadboard to have a play with and I’m very impressed. Well done!
    I do have a little instability in the output waveforms due to my total disregard for any decoupling or general good practice (all I have is 100k pots directly to the ADC inputs) but it was only a quick look-see and easily remedied.

    I, like Jim (4/11/17) have been messing about with ribbon potentiometers as input devices to VCOs and their continuous nature is their main virtue but sometimes it is nice to be able to quantize to fixed notes. I have so far been doing this with a microcontroller and 12-bit DACs to generate CVs but your VCDO could save a lot of trouble if there was a means of getting a two octave range on the FREQ MOD CV.

    I would like to try your code mod suggestion but I have only been working with a Mikroelektronika C compiler so far and despite “ASM” identifiers I can’t get it to make sense of your assembly source code. I have MPLAB X IDE installed, but so far have not had to use it. Could I import your code into this or would I need a specific assembler?

  13. Hello Tom, can I use this chip with an Arduino or teensy instead of the PIC and mplab x, since I’m a beginner. Thank you

  14. Hello,
    I‘m starting building this cool VCO.
    Is anyone here who knows a software (maybe for Mac) to convert a wav file (wavetable) into a Waveform Lookup Table – code (for the ASM code)?
    Thank you very much 😉

    1. You need something that can produce the required data tables. I used PHP to generate them from arrays of harmonic amounts (rather than from .wav files), and then pasted them from a browser window into the code, but you could probably use Octave, or Python, or even Excel or Javascript or something. It’s more a question of finding a way with the tools you have available, since a lot of things can potentially do the job.
      Good luck!

  15. Hello,
    I’m trying to build this but I can’t make it work.
    I can’t figure out the difference between
    and between
    and incidentally which one I should control with a pot
    and which I should tie (and to what voltage!)
    Any help would be greatly appreciated.

  16. The best results I have is pulse waves in the audible spectrum
    out of the Bessel filter.
    The pulses change duty cycles when I change the VC at 3/WAVEFORM CONTROL,
    but I nowhere seeing those beautiful DCO waves I see on the datasheet..
    Could it be that the chip is not programmed? It’s the VCDO 1B ordered
    straight from the website.
    Wishing everybody well,

  17. hello

    Can I put the hex code in a pic16F688 instead of the other cause i ‘ve a lot of 688 in stock : )

    Best regards


  18. hi there!!! I note that you mention that apart from its manual pot, BIT CRUSH can be controlled by CV too. However, this option is not available on the schematics provided in the datasheet. In order to achieve CV control over BIT CRUSH, can I duplicate one input stage as shown on page 7 (IC5.1/ IC5.2) and parallel its output with the BIT CRUSH pot into PIC pin 9?

    This would probably leave me with a spare opamp, so can I do the same with GLIDE control?

    If not, which is the proper way of doing this, please?

    Thank you, stay safe. 🙂

    1. Yes, the same method will work for any of the “Control” inputs (including both Bitcrush and Glide) but there’s one extra twist. The inputs that are labelled as “CV”s are inverted on the chip, to compensate for an external inverting mixer op-amp. That’s not the case for the inputs labelled “Control” which are intended to be driven directly from a pot. That is the only difference between them, however – otherwise they’re interchangeable.
      If you want CV control of Bitcrush or Glide, you’d need the mixer, and then another inverting op-amp to “re-flip” the voltage to give a 0-5V output the right way up. Since the the voltage is getting re-flipped, the offset voltage changes from being -5V to being +5V.

      Honestly, since I did this design, I’ve had a lot of second thoughts about it. I now think all these different types of inputs are over-complicated. The original motivation was to get the best of the ADC resolution. Using two separate inputs for the control and the CV (although they change the same thing) allowed me to turn both into a 8-bit number and then add them for a 9-bit result (improving the revolution by 6dB), whereas if they’d been added in an external mixer, I’d have only had an 8-bit result. For Rev.2 (one day!), I’ll probably do it differently!

  19. Hi Tom. First of all, thanks for the amazing work you’ve done here – I am convinced that it’s magic!
    I noticed a small error in the datasheet application circuit. The polarised decoupling capacitors next to the L7905 are backwards(I think).

  20. Hi Tom,

    i know you are busy but i would like to request that you do a redesign of the VCDO.

    I think it looks like a great purchase for DIY oscillator design (which i will purchase shortly when i next get paid) but the complicated nature of the Control/CV inputs doesn’t help much. Also i wonder if you could achieve a 10 octave VCO by asking the user to halve the input 1V/Octave frequency voltage which you can then rescale in the chip? Maybe an input pin could be used to determine whether the frequency input is using a normal range or halved range? Would the PWM filtering on the outputs manage with a 10 octave range?

    Also, i would like to see at least two versions of the chip with different wavetables on them. If one version of the chip contained the standard waves (square, saw, triangle, sine) along with some other ones (maybe based on differential wavetables based on the standard waves) i would be a lot more likely to buy the VCDO as a standard oscillator chip as well as for the unusual waves you include on the current version. I know that you make the code available but i’m not sure i have the skills to replace the wavetables in it. Possibly you could find a way for us to load wavetables using an external memory card? That would improve functionality much more, although it may be too much to ask.

    Thanks for all the work you have done on this so far. I appreciate it. I hope it’s not too much to ask for you to do a wee bit more? 😉



    1. Thanks for the comments, John. I have often tried to do a “VCDO 2” but I’ve never quite hit on the right combination of features. I agree that the current one has too many inputs, although it was done that way to improve the control accuracy. If you take two 8-bit ADC inputs and add them together you get a 9-bit result, whereas if you add the signals in the analog domain and then feed them to one ADC input, you get an 8-bit result. So you can gain a little. This is significant for the 10 octave range, because you have to consider how many steps we’d have in the octave. The ADC is only 10-bits maximum, so 1024 steps over ten octaves is 102 steps per octave, only eight per semitone. That’s steps of 12 cents, clearly audible. That makes quantising inevitable.
      However, there are some good chips for the job now that didn’t exist when I did the original VCDO. The 16F1765 offers a 10-bit DAC on the chip, which would eliminate the PWM filtering. It doesn’t have a second output for a sub-osc though, so you can’t have everything. Still, you can always just use two of them!
      Another feature I’ve often wondered about is to add a MIDI input (or SPI?) so that the oscillator can respond directly to a MIDI input. That avoids the ADC resolution problems and would make a building a MIDI-equipped monosynth very simple.
      One day…

      1. Removing the need for external filtering and including MIDI would definitely be good improvements IMO. It would be a shame to lose the sub-osc but like you said you could just use 2. As i have been working on a MIDI 2 CV module recently i can see how much easier it could make playing the VCDO.

        What about making it even more usable by adding in the ability to load your own wavetables from an external memory card? I’ve been mucking about with a teensy recently by trying to write a wavetable oscillator and have been making my own wavetables in excel. Just the basic shapes to begin with. I’ve also designed a differential amplifier module and am really interested in the shapes you can get out of it. Being able to load these or any other wavetables onto an oscillator easily would be great. Not sure if PIC chips can handle this functionality but it would certainly make the VCDO more interesting.


  21. Hi Tom, very interesting to see a wave oscillator done in PIC assembler, as I have a chance of understanding it! I was wondering whether it could be expanded to be an eight voice wavetable synth. A PIC18F with 8KB of SRAM could have a complete wave table (64×128 samples) loaded from external RAM, maybe with an external 8 bit DAC rather than in the PIC. One PIC/DCO per voice (like an early PPG) or maybe run eight phase accumulators in one PIC… any thoughts on whether this is practical are very welcome! I am thinking of making a PPG Wave Computer..

    1. It’s certainly possible in some form or another. There are some significant differences between my VCDO and the PPG. For a start the PPG’s NCO runs faster (250KHz iirc) whereas the VCDO only manages 62.5KHz. However, the VCDO does the interpolation *on the fly* which obviously uses up some time in a chip with no multiple instruction. If you precalculated the interp’d waveforms like the PPG so it was just doing a quick look-up and stuffing data into the DAC, it’d be much faster.
      There’s a 16F1765 chip (the one I used for the ENVGEN8) that includes a 10-bit DAC on the chip, so I’ve been looking at that for a future VCDO2 chip.
      Running eight phase accumulators at a decent speed is ok, but it’s whether you have time available afterwards to deal with all the control they need. You’d need some sort of comms (SPI?) to control the chips, and you have to do Pitch-to-Frequency-Increment calculations for each one (the NCO equivalent of the exponential convertor!). I dealt with the samples in blocks on the VCDO, and only calculated control signals at the block rate. Since there are 16 samples in a block at 62.5KHz, the block rate is 62.5/16 = 3.9KHz. That’s still four times a millisecond which is plenty!

  22. As long as there’s this damn chip crisis, maybe one could load all of your wonderful code into a Nano or a Pico or something?

    1. I’ve been wondering about doing some Arduino or Rasp Pi Pico stuff myself, Andreas. The code as it stands can’t be directly transferred, but I know what I’m doing now, so I think I could write similar code for the Arduino/AVR platform pretty quickly. If there’s a potential problem, it’s that I wrote the original code in heavily-streamlined assembly language, and C++ (which is what Arduino language is) and the compiler might not be as quick and efficient. Still, something is better than nothing, right?!?

  23. Hi Tom.

    Couple of very quick questions.

    Schematic has Waveform, Sub, Freq CV are -5 to +5 , yet the control knob and datasheet is +5v only as is the .. What’s the effect of only having 0-5v on the CV?

    Is it fair to assume that each Wave/SUB selection has an even distribution on the ADC for the selections, so building a fixed voltage divider network using the centre of each wave voltage should allow for easy direct and accurate selection?



    1. The CVs at the chip are all 0V to +5V. What voltage goes into a CV mixer ahead of that is up to you, and you can offset things and scale them appropriately to get whatever input ranges you want/need. The 4K7 series resistors on each input in the schematic act to protect the chip from overvoltage.

      Yes, the Wave/Sub selections are linear around the control, so setting up a resistor chain (10Ks with 4K7s or 5K1s top and bottom) and then tapping all the junctions on the chain should work. Note that there’s a Control input and a CV input which add together, so a CV will offset the result you’ll get from the switch. Note that this is done in a “circular” manner, so if you add a positive CV while on the last waveform on the control, you “wraparound” and come back to the first waveform on the knob.

      Hope this helps!

Leave a Reply

Your email address will not be published. Required fields are marked *