How to resurrect early electronic music with Arduino?
This project is inspired by early electronic music and sound effects created by the BBC’s radio studio in the 1960s. Before synthesizers were commonplace to hear unprecedented sounds, they used a combination of industrial test equipment and magnetic tape tricks. The test generators and “found sounds” produced raw audio that was looped, reversed, accelerated and decelerated with multiple tape recorders to produce eerie, unnatural sounds that accompanied radio and television programs of the time.
In my project, using an Arduino microcontroller, I modeled three vintage test generators; the whole project can be put together for less than £ 15 [около полутора тысяч рублей]… The performance lacks the aesthetic charm and analog sound of real things, but I have retained the tactile hand control that software plugins do not have, and by its very nature, all the giblets of the project can be hacked, repaired and updated.
Recently, documentaries about Delia Derbyshire and the radio studio have sparked a surge of interest in how early electronic music was written. At the same time, contemporary artists such as Hainbach record tracks using vintage equipment and equally old methods. The renewed interest inevitably increased the demand (and prices) for used test equipment. Devices that were nearly useless a few years ago are now changing hands at auctions for over £ 200.
Components:
- One Arduino X microcontroller. I used the Nano, but any compatible controller should work.
- 2 resistors 1M Ohm.
- 3.9K ohm resistor.
- Capacitor X 4.7 nF.
- Audio out jack (6.3mm or 3.5mm).
- 6 linear potentiometers 10K.
- 3 10K logarithmic potentiometers.
- 2 single-pole, unidirectional switches.
- USB power cable.
- Perforated Veroboard.
- Female block (optional).
You will also need a computer with the Arduino IDE installed to download the software. The circuit is simple enough for manual point-to-point wiring using an inexpensive punched board. AudioPhonic Workbench works well on USB power, so no special power supply is required.
Step 1. Getting Started
There are a minimum of components in the project, which makes it cheaper and simplifies the design. With the Arduino Nano board, you can run three oscillators at the same time. In addition, the oscillators can cross modulate each other and produce a wide range of sounds due to their simple design.
The early electronic music pioneers used devices such as wobblers and ring modulators in their creations. The wobbler used one oscillator to change the pitch of the second oscillator, a form of frequency modulation (FM). At low frequencies, this produces a vibrato effect, more and more discordant at high frequencies. A ring modulator allows one oscillator to change the volume of the other, a process known as amplitude modulation (AM). At low frequencies, this creates a tremelo effect, which, again, becomes more discordant as the modulation frequency increases. Audiophonic Workbench provides both amplitude and frequency modulation.
Shown above is the Audiophonic Workbench front panel. The top row of knobs controls the pitch of each oscillator, while the bottom row controls the volume. The two knobs in the middle row control modulation. The first controls how Oscillator 1 modulates Oscillator 2. Turning clockwise increases amplitude modulation, and turning counterclockwise increases frequency modulation. The second knob in the middle row controls how Oscallator 2 modulates Oscillator 3. When these knobs are centered, there is no cross modulation. The last two controls are the oscillator speed switches. They allow Oscillators 1 and 2 to act as Low Frequency Oscillators (LFOs), creating the vibrato and tremelo effects I described above.
Step 2. Iron
The schematic diagram of the project is shown above. It consists of 8 potentiometers connected to the 8 analog inputs of the Arduino, and 2 switches connected to the digital input pins, and an RC circuit for the audio output.
To output audio, Audiophonic Workbench uses Pulse Width Modulation (PWM), eliminating the need for a separate D / A converter. Mozzi Audio Library supports “HIFI PWM” mode, which is used here. The mode combines the output of the two PWM outputs for better sound quality. Enabling HIFI PWM requires additional effort before downloading the code. I wrote about them in step 4.
Step 3. Resurrect the remote
The first step in the assembly is the selection of the case. I used an inexpensive pine jewelry box from a local craft store and painted it matte black to give the device a retro look. The dimensions are 140 x 90 x 50 enough to fit the controls on the front, but it would be better if the box was larger. I show the front panel connection diagram below.
All potentiometers have their left pins connected and connected to the 5V pin on the Arduino (pin 27). Likewise, the right pins are wired and linked to the two toggle switches and GND on the Arduino (pin 29). The center pins of each potentiometer are connected to the analog inputs of the Arduino through thin wire leads.
It would be possible to connect the front panel directly to the Arduino, but I prefer to use a perforated breadboard which allows me to reuse components in projects. It is also easy to add additional experimental circuits. If you are working with a punched board, it makes sense to plug the Arduino into a socket. The diagram below shows both sides of the board layout. Notice the center-cut tracks. They can be cut with a special tool or a knife, but I prefer a 6 mm drill so that the tracks are neat and easy to see.
I placed the audio-out jack on the back of the box, but that’s just my preference. I also drilled a large hole in the back that the USB cable goes through to the Arduino power box. When installing the board in the case, make sure you have enough space to plug in the USB cable.
Step 4. Download and configure Mozzi
In my project, the Mozzi sound synthesis library is used to implement oscillators. To compile the sketch, you need to download Mozzi and install it in the Arduino IDE. You can download the library here
To reduce the number of components, sound is generated using pulse width modulation (PWM). The PWM pin is a sequence of digital pulses. At a sufficiently high frequency, these pulses charge the capacitor and produce a rising voltage at the output. At low pulse rates, the capacitor discharges and the output voltage drops. By changing the frequency (or pulse width), you can control the waveform.
Arduino’s PWM audio tends to be of poor quality, but Mozzi supports HIFI PWM mode – a significant improvement over standard PWM audio. This uses two PWM contacts and requires one additional resistor. The only complication: for the mode to work, you need to change the file mozzi_config.h
in the Mozzi library for this to work.
First, find the file (on my Linux it is located in /home/john/Arduino/libraries/Mozzi-master
… You will need to edit it.
Replace the code
//#define AUDIO_MODE STANDARD
#define AUDIO_MODE STANDARD_PLUS
//#define AUDIO_MODE HIFI
with this code:
//#define AUDIO_MODE STANDARD
//#define AUDIO_MODE STANDARD_PLUS
#define AUDIO_MODE HIFI
You need to change the beginning of the file, line 27.
Step 5. Checking the hardware
To test the hardware, you can download a simple sketch from my github…
The sketch reads the values of each analog input once per second. These, along with the two switch inputs, are displayed by the Arduino IDE port monitor as shown above. After loading the sketch, try turning each potentiometer one at a time and make sure the values change from 0 to 1023. The sketch also generates a test signal at the audio output. For the generation to work, you must modify the file mozzi-config.h
as I wrote in the previous section.
Step 6. Software filling
All code can be downloaded from GitHub by this link…
The code is quite simple, but not easy to understand as it is optimized for speed, not readability. It was written in an inline fashion and uses integer arithmetic with data scaling to avoid numeric overflows. The sketch creates three instances of the Mozzi Oscillator using a sine wave wavetable. Main control loop updateControl
reads potentiometers and switches 128 times per second and updates a number of global variables accordingly. Sound processing loop updateAudio
uses these globals to compute separate samples for each generator. Then they are mixed and removed. Feel free to experiment with the code, but remember that the loop updateAudio
called 32768 times per second. The code in it should execute quickly. Out-of-range processing will cause crackling and audio glitches.