You are on page 1of 8

School of Electronic and Electrical Engineering

FACULTY OF ENGINEERING

Arduino MIDI Synthesizer


Paul Halpin
BSc Music, Multimedia and Electronics ELEC2645 Embedded Systems Project

Session Student ID

2010 / 2011 200481604

Contents
1. Abstract 2. Introduction 3. Software Overview 4. Hardware Overview 5. Testing 6. Conclusion 7. References 2 2 2 4 5 6 7

1. Abstract
The basis of this module was the design and crea5on of a microcontroller-based embedded system - in my case a MIDI-controlled synthesiser. This is a complete self-contained product that can interpret an incoming MIDI signal from a 5-pin DIN connec5on and translate it into a pitched square-oscillator. The sound output is then either sent through an in-built speaker or sent to a 3.5mm audio outlet that can be plugged into many devices (mixer, headphones). The output can be selected by the user by a toggle switch. The user can further manipulate the sound by dening a note length using the knob on the top of the enclosure. This report outlines the dierent stages involved in the comple5on of this project.

2. Introduc1on
The Arduino is a popular device for prototyping projects that integrate hardware and soKware by programming a microcontroller. The device is accompanied by a piece of simple desktop soKware that allows the user to create programs for the microcontroller in an easy program language called Wiring, a modied version of C/C++ that makes designing input/output applica5ons much easier.[1] This method of designing embedded systems can bring together many dierent areas of electronics without having to create new interfaces between them. The Arduino microcontrollers can operate a variety of components from servos to LCD displays - most commonly using logic func5ons in and out of the microcontroller pins or a stream of serial data from a single pin. The fact that I am enrolled as an M.M.E student was major factor in the process of deciding what my project was going to be. I thought it would be interes5ng to research dierent musical opportuni5es available using the Arduino. There are many websites where people share and discuss ideas rela5ng to Arduino projects, and a large selec5on of these are musically related. In the wiring library for the Arduino.

3. So4ware Overview
The most basic form of musicality is available in the form of the tone() func5on; this is a modied version of wirings pulse-width modula5on library, where instead of being able to adjust the duty cycle, the user can change the frequency and length values of a note at a par5cular output pin. This is the main func5on that my project u5lises. The soKware sec5on of the code relies on a small sec5on of the Arduino MIDI library.[2] This library makes it easy to set the baud rate to 31250 (MIDI-compliant), interpret and generate MIDI serial data. The only MIDI data I am concerned with in my project is note data. This comes as two bytes in the serial. Firstly, my program analyses all incoming MIDI messages and lters out NoteOn messages. When a NoteOn message is received, the sound() func5on is called. If the second byte (MIDI.getData2 - this contains the velocity and dura5on informa5on) is not greater than 0, the func5on will end. Since the tone() output only has one velocity, I dont use the data from the second byte. Instead I have a poten5ometer to adjust the dura5on of the notes. The program then analyses the rst byte (MIDI.getData1) to get the pitch of the note (between 0-127). The corresponding frequency is then determined from my array declared at the start of the code (int MIDI[128]). This frequency, combined with the current mapped value of the poten5ometer is applied to a tone() func5on with two variables and the note indicator LED is ac5vated. Here is an overview of the program: 2

Start/Stop

sound() Func?on

Declare Global Variables (int M IDI[128];)

Start

Declare Local Variables setup() Func?on If M IDI.getData2 > 0 Set Outputs, Inputs YES Digital Pin 2 = HIGH

(Note L ED)

loop() Func?on

NO
(Speaker Pin)

Digital Pin 8 = noTone

MIDI.read

int n = MIDI.getData1

MIDI.getType

If type = NoteOn

Checks to see if there is incoming note data


YES

(Convert M IDI number to frequency)

int pitch = midi[n]

NO Digital Pin 2 = LOW (Note L ED) sound() Func?on

(Poten?ometer input)

analogRead Pin 0 = sustain

(Suitable Values for delay)

sustain = map(sustain, 0,1023,30,1000)

loop() Func?on

(Main sound output)

tone pin 8 frequency = pitch delay = sustain

Stop

Before deciding on using an array to store the frequency values, I experimented with an algorithm that converted the MIDI number into the actual frequency:

(Where n is the MIDI number) This gave a frequency accurate to as many decimal places as you need but I ran into errors when tes5ng it out on the hardware. I believe that it is because of physical limita5ons in the microcontroller, that it cant calculate indices of that scale on the y.

frequency = 440 * 2^((n-69)/12)

4. Hardware Overview
Most of the components in my project are housed in the enclosure, away from the board.
OUTSOURCED COMPONENTS -On switch -Output toggle -MIDI connector -Audio jack -Speaker -Potentiometer -Red LED -Blue LED -Battery Clip / 9V Battery CIRCUIT BOARD COMPONENTS -Voltage regulator (9V -> 5V) -16MHz crystal oscillator -ATMega328P chip -Op amp -Resistors / Capacitors

19 connections

This sec5on of the schema5c outlines the power regula5on in the circuit. The IC in the centre converts a 9V baferys voltage to 5V - a safe opera5ng level for the ATMega328.

Here, you can see the rest of my circuit. Except for the op amp, oscillator and a few resistors, the components that appear to be afached to the main IC are just through-holes for external components. The poten5ometer is connected between ground and +5V so the user can dene a voltage between the two points, it is processed by the 10 bit analog to digital converter on-board the ATMega328 and mapped to desired values in the programming code. The Op amp circuit required no feedback or bias resistors as it na5vely gave a gain of 20, and this was a reasonable volume for the built -in speaker. The alterna5ve output at the 3.5mm jack has a 220 resistor in series to reduce the volume at the output. it creates a comfortable volume for headphones and a decent line volume also. The power and note indicator LEDs have 220 current-reducing resistors in series to supply them with the appropriate current level. The Reset switch works as a pull-up resistor when the switch is pressed. The serial input from the MIDI socket is allocated the the Rx pin on the ATMega328, this is the only pin that can read incoming serial data there is also a Tx pin that is reserved for transmiing serial data.

5. Tes1ng
When assembling the project, I discovered there were errors with the PCB, largely due to the fact I mis-labelled signal paths. I tested the circuit with basic programs to switch on LEDs or make a noise through the speaker. When I discovered the circuit was not playing any of the test programs, I knew there was something wrong with the PCB, so I translated the design into veroboard that worked as planned. I corrected my PCB design for this report:

One dierence between the two circuits is the absence of the op amp in the veroboard design. I used a dierent voltage regulator to the one used on the PCB. This new regulator provided less current than the original and wasnt quite enough to fuel the amp without turning the whole synth o. The speaker s5ll gives a reasonable volume and the 3.5mm socket didnt use the op amp, so that s5ll works as it should. To test the actual func5onality of the synthesiser, I connected up a MIDI cable from my laptop and had a complete range of notes playing at various speeds, I tested both the speaker output and the 3.5mm jack output. The connec5on in the jack was a lifle loose, so you have to play around with the cable to get sound through both channels. I also tested a direct MIDI connec5on from my keyboard to the synth, this worked just as well.

6. Conclusion
If I were to con5nue on this project and improve it somehow, I would try to incorporate some further signal processing to create 5mbres other than a square wave. This would probably require other ICs to process the pulse wave. subtrac5ve synthesis would be a viable op5on. I could create modular eects that the user could dene, such as an LFO or envelope. The output signal could also be modied to be at a more suitable level for digital audio by using a biased op amp to limit the output dB. I quite like the idea of a project-in-progress to be on veroboard, as this is much easier to expand on and create new sec5ons - unless the project uses surface mount components or it requires a high component density, veroboard is a good way to design. A PCB would be preferable once it is complete because it can be replicated with the soKware design and they are usually of a higher build quality to veroboard, meaning they will last longer.

References
[1] "Wiring Language (API)". 17 May 2011. < h/p://wiring.org.co/reference/ >. [2] "Arduino MIDI Library". 17 May 2011. <h/p://sourceforge.net/projects/arduinomidilib/ >.

You might also like