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.
Glide/Portamento
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 PIC 16F1847 ASM code
- Assembled HEX code from above file
- VCDO datasheet (includes example circuit diagrams, example waveforms, and chip pinout)
VCDO elsewhere on the web
Rick Holt has a DIY PCB for this project over at his website – Frequency Central VCDO DIY page.
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 🙂
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.
HTH,
Tom
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!
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!
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?
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.
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.?
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.
HTH,
Tom
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.)!
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?
Thanks
Jim
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.
Tom
Hi Tom
that’s not the three octaves I’d hoped for. Oh well, back to the analogue drawing board!
Thanks
Jim
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
...etc
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.
Cheers
Jim
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!
Cool. Have you got anything online about it? I’d love to see!
Incidentally, the Druid VCDO waveforms also appear in the SSSR Labs Kotelnikov wavetable oscillator:
See this thread about the Kotelnikov on Muffwiggler
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.
Hi Tom,
Here is a link to Electro-Music.com about my Arbitrary Waveform Generator in which I used your waves from the VCDO1:
http://electro-music.com/forum/viewtopic.php?t=68882
and a Youtube link:
https://youtu.be/qyvAb40cOTY
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.
Yes, I think I can definitely say that the idea has occurred to me! It’s just never made it into a finished product (yet!).
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
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.
HTH,
Tom
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
Sorry for the double question I thought that it have not been sent.
Thanks for the replay, I’ll try it.
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?
The MPLAB X IDE is fine and will compile the code and program the chips without any problems. That’s what I originally used to write it.
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
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 😉
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!
Hello,
I’m trying to build this but I can’t make it work.
I can’t figure out the difference between
3/ WAVEFORM CONTROL and 17/WAVEFORM CV
and between
7/ SUB SELECT CONTROL and 18/SUB SELECT CV
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.
B
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,
b
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
Fabien
No, sorry. The 16F1847 is one of the ‘enhanced’ 16F1xxx chips, and the 16F688 is from the previous generation. They’re not code-compatible, although they’re obviously very similar.
The MIDICLK chip uses the 16F688 though. You could make a few of those! The 16F688 is a good chip for MIDI projects.
https://electricdruid.net/midi-clock-to-analog-gate-pulses/