Video Tutorial

Project Summary 

An arpeggiator is an electronic instrument feature which takes played chords and cycles through the notes in sequence at a set rate.  This modification will add a arpeggiator/sequencer function to your Werkstatt by adding an Arduino micro controller and manipulating minimal code. 



1 x 10kΩ resistor 

1 x 2.2µF capacitor 


1 x Arduino Microcontroller


1 x Breadboard


For this mod we will be using an Arduino Uno micro controller.  The Arduino is based around the ATMEL series of micro processor IC's, and is a very versatile tool across multiple disciplines. Refer to Figure 1 for a closer look at the exact digital and analog I/O configuration for the Arduino. For more information regarding the Arduino please visit



First we need to create a low pass filter for our Arduino. Even though the Arduino features a function named analogWrite, it is not really able to send a true analog signal. Instead the Arduino sends a PWM (Pulse Width Modulation) signal, and emulates an analog voltage change by changing the duty cycle.


The analogWrite function takes an input value from 0-255 and sends a 5V+ signal with a duty cycle corresponding to the input value. Although this technique may work for LED's and other components, we will need to filter our signal to achieve a true analog signal for our Werkstatt. A simple RC filter with one 10kΩ resistor and one 2.2μF capacitor will do the trick.  We will be sending our filtered signal from our Arduino into the Werkstatt's VCO EXP IN. Observe Figure 1 for exact jumper connections.  This modification will require us to share ground between the Werkstat and the Arduino as well as the RC filter.  Ground can be pulled from any screw terminal.  


Figure 1. RC filter coming from Arduino to the Werkstatt's VCO EXP IN.


For our arpeggiator we will be using an Arduino to speak to our Werkstatt. Open the file arpeggiator.pde that is included with the Werkstatt Arduino library in the Arduino IDE. Arpeggiator.pde works by cycling through two arrays at the same index. This example file will only need minor editing to be customizable. See figure 2. for a quick view of arpeggiator.pde.  

Figure 2. Arpeggiator.pde open in the Arduino IDE. 


Before we can reliably use the Arpeggiator.pde sketch for this task we need to tune the VCO EXP IN. There will be a trimmer pot on the Werkstatt that needs to be calibrated when running the stock settings of Arpeggiator.pde . These two values need to be a perfect octave for interval accuracy. Observe Figure 3 for an exact location of the VCO EXP TRIM potentiometer.

Figure 3. VCO EXP TRIM potentiometer located at VR5.


Once all jumpers match Figure 1 press the upload button in the Arduino IDE. You will hear Arpeggiator.pde cycle through two notes, the unison and the octave. Turn the VCO EXP TRIM knob until the octave is in tune. Once these two notes are perfect octaves all other intervals will be matched as well.


Now that we are in tune how do we change the interval of our arpeggiator? We will need to alter the code in two array's to change how our sequencer sounds.

The notes[] array holds any interval you want to access and is referenced as follows: tonic, minor2nd, major2nd, minor3rd, major3rd, fourth, tritone, fifth, minor6th, major6th, minor7th, major7th, octave. This array c


Fritzing is an open source visual breadboarding software.




The Arduino is a micro controller and programming environment for interactive systems.



I would be very pleased if someone could tell me how to alter the Sketch so I can insert rests and send a gate out for every note played. Then it would be more a sequencer than an arpeggiator.

In order to send a gate signal you could use a 5V on/off trigger out of any of the digital I/O's.  One way would be to insert an argument comparing current notes[i] to the previous notes[i] within the for loop, if the values are different then send out a digital HIGH out of whichever digital pin you like followed quickly by a digital LOW. This will send a 5V trigger signal out at each new note. 

The rest issue could be a little trickier.  One way to do it would be to patch into the VCA IN with another I/O line and add an argument to send a LOW signal when a rest is detected in notes[i] within the for loop and a HIGH signal whenever anything else is detected.  Another option could be to simply max out the VCO in the notes[] array by just placing a 255 where you'd like a rest.  This will just send a full 5V to the VCO which, if the FREQ knob is high enough, will be out of the audible frequency range and perceived as a rest...not as elegant as the VCA option but a quick dirty fix.


I'm having trouble figuring out where to place the werkstatt.cpp and werkstatt.h files on my hard drive.

I've figured it out. I had to install the zip file from the Arduino IDE sketch import library. It's now working perfectly.

deusofnull's picture

Can you use any other value of resistor or capacitor and why? I'm new to circuitry and I can't quite grasp the effects of capacitors in specific.

navikin9's picture

Just got this puppy hooked up today. So fun... I am guessing/hoping we won't be limited to sixteen step sequencers, or even 32(mother)!
How do I do rests on this thing?

navikin9's picture

there also appears to be no way to delete comments, as I would have deleted this one... Was this made with rails?

the pictures on this page are missing!

Thank you so much for posting this article. It's really helped me a lot. You're a great writer.

Pressure Sensitive Resistor
Dual Oscillator