Created
May 7, 2012 20:59
-
-
Save anonymous/2630377 to your computer and use it in GitHub Desktop.
mp3 shield midi mode
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 = 3; | |
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) | |
/* | |
//Demo Basic MIDI instruments, GM1 | |
//================================================================= | |
*/ | |
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 notes from F#-0 (30) to F#-5 (90): | |
for (note = 30 ; note < 40 ; note++) { | |
Serial.print("N:"); | |
Serial.println(note, DEC); | |
//Note on channel 1 (0x90), some note value (note), middle velocity (0x45): | |
noteOn(0, note, 60); | |
delay(50); | |
//Turn off the note with a given off/release velocity | |
noteOff(0, note, 60); | |
delay(50); | |
} | |
delay(100); //Delay between instruments | |
} | |
} | |
//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.print((byte)cmd); | |
mySerial.print((byte)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.print((byte)data2); | |
digitalWrite(ledPin, LOW); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment