Kennismaken met de Sparkfun Musical Instrument Shield

Shields gebruik je om je Arduino extra functionaliteit te geven. Met de Musical Instrument Shield van Sparkfun voeg je een heuse MIDI synthesiser toe. De shield is gebouwd rondom de VS1053b chip, een single-chip Ogg Vorbis/MP3/AAC/WMA/ MIDI audio decoder. Maar omwille van licentiekosten ondersteunt de shield alleen MIDI playback, zowel General MIDI 1 commando’s  als het SP-MIDI file format 0.

The VS1053b bevat twee grote geluidsbanken met o.a. diverse piano-, hout- en koperblaasinstrument-, synthesizer-, geluidseffect- en percussiegeluiden. De shield is in staat om tonen van meerdere instrumenten simultaan af te spelen met een maximale polyfonie tot 31 geluiden! De chip bevat een stereo analoge uitgang waarop een hoofdtelefoon of HiFi set aan te sluiten is.

De shield gebruikt drie Arduino I/O pennen; een om de chip te resetten (pin4) en twee voor de seriele communicatie (pin2 en pin3). De shield gebruikt niet de standaard seriele interface van de Arduino, die wordt immers al gebruikt voor de USB interface met de PC. In plaats daarvan wordt een in software geëmuleerde seriele interface toegepast. Die hanteert vanwege het MIDI protocol een bitsnelheid van 31250[bps].

Op de Sparkfun website kun je twee voorbeeld sketches downloaden om snel van start te kunnen. Helaas zijn deze voorbeeld sketches wat out-dated, ze gaan nog uit van een eerdere en niet meer ondersteunde versie van de softSerial-bibliotheek. Ook bevatten ze maar een beperkte functionaliteit, zo kun je er wel individuele noten mee afspelen maar is er voor het afspelen van een melody nog best wat extra software nodig.

Vandaar dat het tijd is voor een kleine update. Klik hier voor een ZIP bestand met geactualiseerde versies van de Sparkfun sketches plus een extra sketch (example3.txt) waarmee MIDI melodiën op een eenvoudige manier kunnen worden beschreven en afgespeeld. In de extra sketch zijn daarvoor twee datatypes (structs) gedefinieerd waarmee alle essentiële MIDI informatie wordt vastlegd; t_midiHeader voor de parameters per MIDI-track en voor het liedtempo en t_midiNote voor de melodie-informatie. Deze structuur ondersteunt het gebruik van meerdere soundbanks en meerdere track (dus polyfonie), conform MIDI file format 0.

struct t_midiHeader {
   byte soundbank[16]; // soundbank for each track
   byte instrument[16]; // instrument for each track
   byte volume[16]; // volume for each track
   byte pitchShift[16]; // pitchShift for each track
   byte tempo; // tempo of the song
}; // t_midiHeader

struct t_midiNote {
   int  deltaTime; // delay wrt previous MIDI event
   byte channel; // midi channel for this note
   byte note; // midi note to be played
   byte onoff; // switch note ON or OFF
}; // t_midiNote

Uiteraard bevat de extra sketch ook een voorbeeld melodie, geheel in lijn met het aanstaande EK. De rest spreekt voor zich.

HaVe FuN!