// A Musical Leostick Demo // By Gough Lui (goughlui.com), transcribed from various MIDI files amassed over the years // Based upon (a rather limited) music notation adapted for UNSW's ELEC2141/2 Course using FPGA's/ARM CPUs #include // Destiny's Child - Emotion const char song1[] PROGMEM ={0x06, 0x51, 0x01, 0xA2, 0x08, 0xA9, 0x01, 0xB2, 0xA3, 0x04, 0x01, 0x51, 0x01, 0xA2, 0x08, 0xA9, 0x01, 0xB2, 0xA3, 0x04, 0xD2, 0x08, 0xDA, 0xC6, 0xC5, 0x07, 0x51, 0x01, 0xA1, 0x01, 0xA1, 0x08, 0xA9, 0x08, 0xAA, 0xB1, 0xC2, 0x81, 0xA1, 0x05, 0x01, 0x51, 0x01, 0xA2, 0xB2, 0xC2, 0x02, 0x81, 0x01, 0xA6, 0xA3, 0x01, 0x06, 0x04, 0xE1, 0x01, 0xE3, 0xF3, 0x02, 0xF1, 0xE1, 0xD3, 0x03, 0xD2, 0xC2, 0xA1, 0x01, 0xC4, 0xA5, 0xE2, 0xF2, 0x02, 0xF3, 0xE1, 0xD1, 0x03, 0xD1, 0x01, 0xD2, 0xC2, 0xA2, 0xC4, 0xA1, 0x91, 0xA4, 0xA1, 0xE2, 0xF2, 0x02, 0xF3, 0xE1, 0xD1, 0x03, 0xD1, 0x01, 0xD2, 0xC2, 0xA2, 0xC2, 0xA2, 0x92, 0x02, 0x81, 0x01, 0x81, 0x91, 0xA2, 0xB1, 0x01, 0xC2, 0xC4, 0x04, 0x91, 0xA1, 0xB2, 0xC1, 0x01, 0xB2, 0xC1, 0x01, 0xD2, 0xE1, 0x01, 0xD2, 0xE1, 0x01, 0xF3, 0x01, 0xD3, 0x01, 0xD2, 0xC2, 0xA2, 0xC4, 0xA3, 0x03, 0xF2, 0xD2, 0xC2, 0xD1, 0x01, 0xF3, 0x01, 0xD2, 0x02, 0xF3, 0x01, 0xD2, 0x02, 0xD4, 0xC3, 0x02, 0xC1, 0xD1, 0x01, 0xC1, 0x01, 0xD2, 0xF3, 0x01, 0xD2, 0x02, 0xF2, 0xD2, 0xC2, 0x02, 0xC4, 0xA3, 0x03, 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0x08, 0xC9, 0x08, 0xC9, 0x08, 0xC9, 0x01, 0xD2, 0xC2, 0xB2, 0xA1, 0x01, 0xA2, 0xB2, 0x95, 0x82, 0x92, 0xA2, 0xC2, 0x08, 0xC9, 0x08, 0xC9, 0x08, 0xC9, 0x01, 0xD2, 0xC2, 0xB2, 0xA1, 0x01, 0xA2, 0xB2, 0x01, 0x96, 0x92, 0x06, 0x01, 0xA2, 0xC7, 0xC5, 0x05, 0xF3, 0x01, 0xD6, 0xD2, 0xC6, 0xA6, 0x00}; // Atomic Kitten - The Tide is High const char song2[] PROGMEM ={0x06, 0x52, 0x83, 0x01, 0x82, 0x62, 0x83, 0x01, 0x81, 0x01, 0x82, 0x65, 0x82, 0x74, 0x04, 0x83, 0x01, 0x82, 0x61, 0x01, 0x83, 0x01, 0x82, 0x61, 0x01, 0x65, 0x82, 0x74, 0x04, 0xC4, 0xC1, 0xA1, 0x01, 0x91, 0x81, 0x92, 0xA2, 0x03, 0xB3, 0x93, 0x82, 0x73, 0x83, 0x91, 0x01, 0x94, 0xA4, 0x04, 0xC3, 0x01, 0xC3, 0xB3, 0xA1, 0xB1, 0xC3, 0x03, 0x51, 0x01, 0x51, 0x01, 0x51, 0x08, 0x5B, 0x82, 0xA2, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x42, 0x04, 0xA2, 0x93, 0x04, 0x01, 0x51, 0x08, 0x59, 0x01, 0x51, 0x08, 0x5A, 0x81, 0x01, 0xA2, 0x81, 0x01, 0x81, 0x01, 0x82, 0x43, 0x03, 0xA2, 0x93, 0x04, 0x01, 0xC4, 0xC1, 0xA1, 0x01, 0x91, 0x81, 0x92, 0xA2, 0x03, 0xB3, 0x93, 0x82, 0x73, 0x83, 0x91, 0x01, 0x94, 0xA4, 0x04, 0xC3, 0x01, 0xC3, 0xB3, 0xA1, 0xB1, 0xC3, 0x03, 0x52, 0x83, 0x01, 0x82, 0x62, 0x83, 0x01, 0x81, 0x01, 0x82, 0x65, 0x82, 0x74, 0x04, 0x83, 0x01, 0x82, 0x61, 0x01, 0x83, 0x01, 0x82, 0x61, 0x01, 0x65, 0x82, 0x74, 0x02, 0x52, 0x83, 0x01, 0x82, 0x62, 0x83, 0x01, 0x81, 0x01, 0x82, 0x65, 0x82, 0x74, 0x03, 0x83, 0x01, 0x82, 0x61, 0x01, 0x83, 0x01, 0x82, 0x61, 0x01, 0x65, 0x82, 0x74, 0x04, 0x66, 0x64, 0x53, 0x01, 0x54, 0x53, 0x03, 0x02, 0x66, 0x64, 0x53, 0x01, 0x54, 0x53, 0x00}; // Aerosmith - All Out of Love const char song3[] PROGMEM ={0x06, 0x52, 0x62, 0x82, 0x08, 0x89, 0x01, 0x85, 0x92, 0x81, 0x01, 0xB2, 0xA2, 0x92, 0xA6, 0x52, 0x62, 0x82, 0x08, 0x89, 0x01, 0x94, 0xA4, 0x86, 0x84, 0x52, 0x62, 0x82, 0x08, 0x89, 0x01, 0x84, 0x81, 0x01, 0xB1, 0x01, 0xB1, 0x01, 0xB2, 0xA2, 0x08, 0xA9, 0x01, 0xA5, 0x08, 0xA9, 0x01, 0xC4, 0xB2, 0x08, 0xBA, 0xA5, 0x92, 0xA1, 0x91, 0x86, 0x82, 0x04, 0x52, 0x62, 0x82, 0x08, 0x89, 0x01, 0x83, 0x01, 0x92, 0x81, 0x01, 0xB2, 0xA2, 0x92, 0xA1, 0x91, 0x85, 0x52, 0x62, 0x81, 0x01, 0x81, 0x01, 0x83, 0x01, 0x93, 0x01, 0x91, 0xA2, 0x01, 0xA6, 0xA2, 0x02, 0x52, 0x62, 0x82, 0x08, 0x89, 0x01, 0x83, 0x03, 0xB2, 0x08, 0xBA, 0x01, 0xB2, 0xA1, 0x01, 0xA1, 0x01, 0xA5, 0x02, 0xC4, 0xB1, 0x01, 0xB2, 0xA3, 0x01, 0xB4, 0xA4, 0x95, 0x02, 0xA4, 0xB4, 0xA4, 0xB1, 0xA1, 0x95, 0xA1, 0x01, 0xA1, 0x01, 0xA1, 0x01, 0xA1, 0x01, 0xA1, 0x05, 0x01, 0x82, 0x91, 0x01, 0x91, 0x01, 0x92, 0xC3, 0x01, 0x94, 0x08, 0x9A, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x71, 0x64, 0x81, 0x01, 0x83, 0x01, 0x81, 0x01, 0x81, 0x01, 0xA3, 0x01, 0x92, 0x02, 0xA1, 0x01, 0xA1, 0x01, 0xA1, 0x01, 0xA1, 0x01, 0xA1, 0x05, 0x01, 0x82, 0x92, 0x08, 0x99, 0x01, 0x91, 0x01, 0xC3, 0x01, 0x94, 0x08, 0x9A, 0x81, 0x01, 0x81, 0x01, 0x81, 0x01, 0x81, 0x71, 0x64, 0x81, 0x01, 0x83, 0x01, 0x81, 0x01, 0x81, 0x01, 0xA3, 0x01, 0xA3, 0x01, 0xA4, 0x92, 0x86, 0x81, 0x00}; // Fleetwood Mac - Dreams const char song4[] PROGMEM ={0x06, 0x64, 0x82, 0x94, 0xA5, 0x92, 0x84, 0x62, 0x86, 0x62, 0x84, 0x62, 0x95, 0x66, 0x63, 0x05, 0x01, 0x64, 0x82, 0x94, 0xA5, 0x92, 0x84, 0x92, 0x66, 0x63, 0x01, 0x07, 0x06, 0x04, 0xD1, 0x01, 0xD4, 0xC2, 0xF5, 0xE4, 0xC3, 0x01, 0xC5, 0xA3, 0x01, 0xA2, 0x08, 0xA9, 0x03, 0xA3, 0x01, 0xA5, 0x95, 0x91, 0x03, 0x62, 0xA2, 0x65, 0xA4, 0x62, 0xA4, 0x94, 0x84, 0x92, 0x66, 0x64, 0x02, 0x61, 0x01, 0x62, 0xA5, 0x92, 0x84, 0x02, 0x82, 0x62, 0x94, 0x83, 0x01, 0x84, 0x91, 0x01, 0x95, 0x91, 0x01, 0x61, 0x01, 0x62, 0xA5, 0x95, 0x82, 0x62, 0xA4, 0x94, 0x91, 0x01, 0x92, 0xA2, 0x92, 0x87, 0x81, 0x06, 0x04, 0x01, 0x91, 0x01, 0x92, 0xA2, 0x92, 0x87, 0x07, 0x02, 0xA3, 0x01, 0xA2, 0x02, 0xA2, 0x02, 0xA1, 0x01, 0xA3, 0x01, 0xA5, 0x94, 0x81, 0x01, 0x84, 0x95, 0x66, 0x63, 0x06, 0x05, 0x01, 0xA1, 0x01, 0xA1, 0x01, 0xA4, 0xA1, 0x01, 0xA1, 0x01, 0xA4, 0xD5, 0xC4, 0xA1, 0x01, 0xA4, 0x95, 0x84, 0x83, 0x01, 0x06, 0x04, 0xA3, 0x01, 0xA2, 0x08, 0xAD, 0x08, 0xA9, 0x03, 0x62, 0xA5, 0x94, 0x84, 0x54, 0x66, 0x65, 0x61, 0x01, 0x07, 0xA3, 0x01, 0xA1, 0x01, 0xA3, 0x01, 0xA4, 0xD5, 0xC4, 0xA3, 0x01, 0xA4, 0x92, 0x86, 0x83, 0x06, 0x03, 0xA3, 0x01, 0xA4, 0x92, 0x85, 0x81, 0x00}; // Shaggy - It Wasn't Me const char song5[] PROGMEM ={0x06, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x08, 0x99, 0x08, 0x99, 0x08, 0x99, 0x08, 0x99, 0x01, 0xC1, 0x01, 0xA2, 0x91, 0x01, 0x91, 0x08, 0x99, 0x08, 0x99, 0x81, 0x91, 0x01, 0x81, 0x01, 0x53, 0x01, 0x05, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x01, 0x91, 0x08, 0x99, 0x08, 0x99, 0x01, 0xC1, 0x01, 0xA1, 0x01, 0x91, 0x01, 0x91, 0x08, 0x99, 0x08, 0x99, 0x81, 0x91, 0x01, 0x81, 0x52, 0x02, 0x32, 0x42, 0x54, 0x83, 0x01, 0x61, 0x01, 0x62, 0x52, 0x41, 0x01, 0x31, 0x08, 0x39, 0x08, 0x39, 0x08, 0x39, 0x08, 0x39, 0x01, 0x32, 0x22, 0x02, 0x32, 0x42, 0x54, 0x83, 0x01, 0x61, 0x01, 0x62, 0x52, 0x41, 0x01, 0x31, 0x08, 0x39, 0x08, 0x39, 0x08, 0x39, 0x08, 0x39, 0x01, 0x32, 0x22, 0x02, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x71, 0x61, 0x02, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x81, 0x01, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x71, 0x61, 0x02, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x71, 0x61, 0x02, 0x51, 0x08, 0x59, 0x08, 0x59, 0x08, 0x59, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x91, 0xA1, 0x02, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x81, 0x01, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x71, 0x61, 0x02, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x81, 0x01, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x71, 0x61, 0x02, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x81, 0x01, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x71, 0x61, 0x02, 0x51, 0x08, 0x59, 0x08, 0x59, 0x08, 0x59, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0xB2, 0xA1, 0x83, 0x05, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x91, 0x01, 0xA1, 0x03, 0x11, 0x08, 0x19, 0x08, 0x1A, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x08, 0x89, 0x91, 0x01, 0xA1, 0x03, 0x11, 0x08, 0x19, 0x08, 0x19, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x01, 0x83, 0x01, 0x11, 0x08, 0x19, 0x08, 0x19, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x01, 0xC1, 0x01, 0xC3, 0x01, 0x11, 0x08, 0x19, 0x08, 0x19, 0x81, 0x08, 0x89, 0x08, 0x89, 0x01, 0x08, 0x89, 0x08, 0x89, 0x91, 0x01, 0xA1, 0x03, 0x11, 0x08, 0x19, 0x08, 0x19, 0x01, 0x81, 0x08, 0x89, 0x08, 0x89, 0x01, 0x08, 0x89, 0x08, 0x89, 0x91, 0x01, 0xA1, 0x03, 0x11, 0x08, 0x19, 0x08, 0x19, 0x01, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x01, 0x83, 0x01, 0x11, 0x08, 0x19, 0x08, 0x19, 0x03, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x08, 0xA9, 0x01, 0xC1, 0x01, 0xC3, 0x01, 0x11, 0x08, 0x19, 0x08, 0x19, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x91, 0x08, 0x99, 0x08, 0x99, 0x08, 0x99, 0x08, 0x99, 0x01, 0xC1, 0x01, 0xA2, 0x91, 0x01, 0x91, 0x08, 0x99, 0x08, 0x99, 0x81, 0x91, 0x01, 0x81, 0x01, 0x53, 0x01, 0x05, 0xA1, 0x08, 0xA9, 0x08, 0xA9, 0x01, 0x91, 0x08, 0x99, 0x08, 0x99, 0x01, 0xC1, 0x01, 0xA1, 0x01, 0x91, 0x01, 0x91, 0x08, 0x99, 0x08, 0x99, 0x81, 0x91, 0x01, 0x81, 0x52, 0x02, 0x32, 0x42, 0x54, 0x83, 0x01, 0x61, 0x01, 0x62, 0x52, 0x41, 0x01, 0x31, 0x08, 0x39, 0x08, 0x39, 0x08, 0x39, 0x08, 0x39, 0x01, 0x32, 0x22, 0x02, 0x32, 0x42, 0x54, 0x83, 0x01, 0x61, 0x01, 0x62, 0x52, 0x41, 0x01, 0x31, 0x08, 0x39, 0x08, 0x39, 0x08, 0x39, 0x08, 0x39, 0x01, 0x32, 0x22, 0x02, 0x00}; // Tracy Chapman - Baby Can I Hold You const char song6[] PROGMEM ={0x06, 0x82, 0x52, 0x06, 0x03, 0x81, 0x08, 0x8C, 0x94, 0x74, 0x83, 0x01, 0x83, 0x01, 0x06, 0x04, 0x84, 0x94, 0x74, 0x83, 0x01, 0x82, 0x06, 0x04, 0x02, 0x84, 0x94, 0x73, 0x01, 0x82, 0x92, 0x82, 0x06, 0x04, 0x81, 0x01, 0x82, 0x62, 0x04, 0x72, 0x52, 0x07, 0x06, 0x03, 0x81, 0x08, 0x8A, 0x52, 0x06, 0x03, 0x81, 0x08, 0x8C, 0x94, 0x74, 0x84, 0x08, 0x8A, 0x06, 0x05, 0x84, 0x94, 0x74, 0x83, 0x01, 0x82, 0x06, 0x05, 0x84, 0x94, 0x74, 0x82, 0x92, 0x82, 0x06, 0x04, 0x91, 0x08, 0x99, 0x08, 0x99, 0x61, 0x72, 0x04, 0x81, 0x51, 0x62, 0x06, 0x05, 0x01, 0xA1, 0x08, 0xA9, 0x91, 0x81, 0x01, 0x82, 0x52, 0x06, 0x04, 0xC2, 0xB2, 0xA1, 0x92, 0x84, 0x81, 0x63, 0x51, 0x08, 0x5A, 0x61, 0x01, 0x06, 0x04, 0xC2, 0xB2, 0xA1, 0x92, 0x84, 0x81, 0x62, 0x01, 0x51, 0x61, 0x51, 0x08, 0x5A, 0x05, 0x82, 0x01, 0x61, 0x51, 0x61, 0x51, 0x08, 0x59, 0x02, 0x06, 0x81, 0x08, 0x89, 0x08, 0x89, 0x08, 0x84, 0x81, 0x00}; int maptone[]={0,262,294,330,349,392,440,494,523,587,659,698,784,880,988,1047}; int mapdura[]={0,125,250,375,500,750,1000,2000,31,94,219,344,469,719,969,1969}; int temptone=0; int tempdura=0; int actone=0; int acdura=0; void setup () { playSong(song1); playSong(song2); playSong(song3); playSong(song4); playSong(song5); playSong(song6); pinMode(13,OUTPUT); } void loop() { digitalWrite(13,HIGH); delay(1000); digitalWrite(13,LOW); delay(1000); } void playSong(const char *song) { char tempbyte; int bytecount=0; while (tempbyte=pgm_read_byte_near(song+bytecount)) { actone=maptone[(tempbyte>>4)&0x0F]; acdura=mapdura[tempbyte&0x0F]; if(actone==0){ noTone(11); } else { tone(11,actone,acdura); } delay(acdura); bytecount=bytecount+1; } noTone(11); delay(1000); }