Arduino Microcontrollers
Chapter 1: Music Shield
Arduino Leonardo with the SparkFun Music Instrument Shield (DEV-10587). The output requires amplification, so I have it plugged into an amp.
1.1 Code
/* Based off code from: Spark Fun Electronics 2011 Nathan Seidle */ #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); //Soft TX on 3, we don't use RX in this code byte note = 0; //The MIDI note value to be played byte resetMIDI = 4; //Tied to VS1053 Reset line byte ledPin = 13; //MIDI traffic inidicator int instrument = 0; void setup() { Serial.begin(57600); //Setup soft serial for MIDI control mySerial.begin(31250); //Reset the VS1053 pinMode(resetMIDI, OUTPUT); digitalWrite(resetMIDI, LOW); delay(100); digitalWrite(resetMIDI, HIGH); delay(100); } void loop() { talkMIDI(0xB0, 0x07, 120); //0xB0 is channel message, set channel volume to near max (127) Serial.println("Basic Instruments"); talkMIDI(0xB0, 0, 0x00); //Default bank GM1 //Change to different instrument for(instrument = 0 ; instrument < 127 ; instrument++) { Serial.print(" Instrument: "); Serial.println(instrument, DEC); talkMIDI(0xC0, instrument, 0); //Set instrument number. 0xC0 is a 1 data byte command play_note(0, 48, 60, 150); play_note(0, 48, 60, 150); play_note(0, 55, 60, 150); play_note(0, 55, 60, 150); play_note(0, 57, 60, 150); play_note(0, 57, 60, 150); play_note(0, 55, 60, 300); delay(300); //Delay between instruments } } void play_note(byte channel, byte note, byte attack_velocity, byte length) { //Note on channel 1 (0x90), some note value (note), middle velocity (0x45): noteOn(0, note, 60); delay(length); //Turn off the note with a given off/release velocity noteOff(0, note, 60); delay(50); } //Send a MIDI note-on message. Like pressing a piano key //channel ranges from 0-15 void noteOn(byte channel, byte note, byte attack_velocity) { talkMIDI( (0x90 | channel), note, attack_velocity); } //Send a MIDI note-off message. Like releasing a piano key void noteOff(byte channel, byte note, byte release_velocity) { talkMIDI( (0x80 | channel), note, release_velocity); } //Plays a MIDI note. Doesn't check to see that cmd is greater than 127, or that data values are less than 127 void talkMIDI(byte cmd, byte data1, byte data2) { digitalWrite(ledPin, HIGH); mySerial.write(cmd); mySerial.write(data1); //Some commands only have one data byte. All cmds less than 0xBn have 2 data bytes //(sort of: http://253.ccarh.org/handout/midiprotocol/) if( (cmd & 0xF0) <= 0xB0) mySerial.write(data2); digitalWrite(ledPin, LOW); }