// ECE 476 2002 Final Project // Jeff Ting // Jinu Rhee // Music Synthesizer #include <90s8515.h> #include #include #include #define t0 30 #define prescale1 1 #define clear_on_match 8 void checkbuttons(void); // checks to see what buttons/notes are pressed // coefficients #pragma regalloc- unsigned char time0; // Timer0 counter for key checking unsigned char scalesize[3]; unsigned char cmd; unsigned char keypress; // counts the number of keys pressed unsigned char reload; unsigned char scale1[77]; unsigned char scale2[77]; unsigned char scale3[77]; unsigned char i; unsigned char instrument; // 0 = piano, 1 = clarinet // UART variables unsigned char r_busy; //receive ISR is running unsigned char r_index; //current string index unsigned char r_buffer[16]; //input string unsigned char r_ready; //flag for receive done unsigned char r_char; //current character //flash float oboe[10] = {0.05, 0.1, 0.8, 1, 0.33, 0.1, 0.05, 0.1, 0.15, 0.1}; //flash float clarinet[10] = {0, 0.5, 1, 0, 0, 0.3, 0.4, 0, 0, 0.5}; /////////////////////////////////////////////////////////// // Piano scales flash unsigned char C2[77] = {0x20, 0x22, 0x25, 0x27, 0x2a, 0x2c, 0x2f, 0x31, 0x33, 0x35, 0x37, 0x39, 0x3a, 0x3c, 0x3d, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3d, 0x3c, 0x3a, 0x39, 0x37, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2a, 0x28, 0x25, 0x23, 0x20, 0x1d, 0x1b, 0x18, 0x16, 0x13, 0x11, 0x0e, 0x0c, 0x0a, 0x08, 0x07, 0x05, 0x04, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0b, 0x0d, 0x10, 0x12, 0x14, 0x17, 0x19, 0x1c, 0x1f}; flash unsigned char Cs2[73] = {0x20, 0x22, 0x25, 0x28, 0x2a, 0x2d, 0x2f, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3b, 0x3c, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3d, 0x3b, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30, 0x2d, 0x2b, 0x28, 0x25, 0x23, 0x20, 0x1d, 0x1a, 0x18, 0x15, 0x12, 0x10, 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x12, 0x14, 0x17, 0x19, 0x1c, 0x1f}; flash unsigned char D2[69] = {0x20, 0x22, 0x25, 0x28, 0x2b, 0x2e, 0x30, 0x33, 0x35, 0x37, 0x39, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x39, 0x37, 0x35, 0x33, 0x30, 0x2e, 0x2b, 0x28, 0x25, 0x22, 0x20, 0x1d, 0x1a, 0x17, 0x14, 0x11, 0x0f, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0f, 0x11, 0x14, 0x17, 0x1a, 0x1c, 0x1f}; flash unsigned char Ds2[65] = {0x20, 0x23, 0x26, 0x29, 0x2c, 0x2f, 0x31, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3d, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3d, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x2f, 0x2c, 0x29, 0x26, 0x23, 0x20, 0x1d, 0x1a, 0x17, 0x14, 0x11, 0x0e, 0x0c, 0x09, 0x07, 0x05, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x06, 0x08, 0x0b, 0x0d, 0x10, 0x12, 0x15, 0x18, 0x1b, 0x1f}; flash unsigned char E2[62] = {0x20, 0x23, 0x26, 0x29, 0x2c, 0x2f, 0x32, 0x35, 0x37, 0x39, 0x3b, 0x3d, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3d, 0x3c, 0x3a, 0x38, 0x35, 0x33, 0x30, 0x2d, 0x2a, 0x27, 0x24, 0x21, 0x1d, 0x1a, 0x17, 0x14, 0x11, 0x0e, 0x0b, 0x09, 0x06, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0e, 0x11, 0x14, 0x17, 0x1a, 0x1d, 0x21}; flash unsigned char F2[58] = {0x20, 0x23, 0x26, 0x2a, 0x2d, 0x30, 0x33, 0x36, 0x38, 0x3a, 0x3c, 0x3d, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3d, 0x3b, 0x3a, 0x37, 0x35, 0x32, 0x2f, 0x2c, 0x29, 0x25, 0x22, 0x1e, 0x1b, 0x17, 0x14, 0x11, 0x0e, 0x0b, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x04, 0x06, 0x09, 0x0b, 0x0e, 0x11, 0x14, 0x17, 0x1b, 0x1e}; flash unsigned char Fs2[55] = {0x20, 0x23, 0x27, 0x2a, 0x2e, 0x31, 0x34, 0x37, 0x39, 0x3b, 0x3d, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3d, 0x3b, 0x39, 0x37, 0x34, 0x31, 0x2e, 0x2b, 0x27, 0x23, 0x20, 0x1c, 0x18, 0x15, 0x11, 0x0e, 0x0b, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x18, 0x1c, 0x1f}; flash unsigned char G2[52] = {0x20, 0x23, 0x27, 0x2b, 0x2f, 0x32, 0x35, 0x38, 0x3a, 0x3c, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3d, 0x3b, 0x39, 0x36, 0x34, 0x30, 0x2d, 0x29, 0x25, 0x22, 0x1e, 0x1a, 0x16, 0x12, 0x0f, 0x0b, 0x09, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x05, 0x07, 0x0a, 0x0d, 0x10, 0x14, 0x18, 0x1b, 0x1f}; flash unsigned char Gs2[49] = {0x20, 0x24, 0x28, 0x2c, 0x2f, 0x33, 0x36, 0x39, 0x3b, 0x3d, 0x3e, 0x3f, 0x3f, 0x3f, 0x3e, 0x3d, 0x3b, 0x39, 0x36, 0x33, 0x30, 0x2c, 0x28, 0x24, 0x20, 0x1c, 0x18, 0x14, 0x10, 0x0c, 0x09, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x06, 0x08, 0x0b, 0x0f, 0x13, 0x16, 0x1b, 0x1f}; flash unsigned char A2[46] = {0x20, 0x24, 0x28, 0x2c, 0x30, 0x34, 0x37, 0x3a, 0x3c, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3d, 0x3c, 0x39, 0x36, 0x33, 0x2f, 0x2b, 0x27, 0x23, 0x1e, 0x1a, 0x16, 0x12, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x07, 0x0a, 0x0d, 0x11, 0x15, 0x19, 0x1d}; flash unsigned char As2[44] = {0x20, 0x24, 0x29, 0x2d, 0x31, 0x35, 0x38, 0x3b, 0x3d, 0x3e, 0x3f, 0x3f, 0x3f, 0x3e, 0x3c, 0x39, 0x36, 0x33, 0x2f, 0x2b, 0x26, 0x22, 0x1d, 0x18, 0x14, 0x10, 0x0c, 0x08, 0x05, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x07, 0x0a, 0x0e, 0x12, 0x17, 0x1b, 0x20 }; flash unsigned char B2[41] = {0x20, 0x24, 0x29, 0x2e, 0x32, 0x36, 0x39, 0x3c, 0x3e, 0x3f, 0x3f, 0x3f, 0x3e, 0x3c, 0x3a, 0x37, 0x33, 0x2f, 0x2a, 0x26, 0x21, 0x1c, 0x17, 0x12, 0x0e, 0x0a, 0x07, 0x04, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x07, 0x0b, 0x0f, 0x13, 0x18, 0x1d}; flash unsigned char C3[39] = {0x20, 0x25, 0x2a, 0x2f, 0x33, 0x37, 0x3a, 0x3d, 0x3e, 0x3f, 0x3f, 0x3f, 0x3d, 0x3b, 0x37, 0x34, 0x2f, 0x2a, 0x25, 0x20, 0x1b, 0x16, 0x11, 0x0c, 0x09, 0x05, 0x03, 0x01, 0x00, 0x00, 0x00, 0x02, 0x04, 0x07, 0x0b, 0x0f, 0x14, 0x19, 0x1e}; //////////////////////////////////////////////////////////////////////// // Clarinet scales flash unsigned char C2_clar[77] = {0x2d, 0x2f, 0x30, 0x2f, 0x2e, 0x2c, 0x2a, 0x28, 0x27, 0x26, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2b, 0x2a, 0x29, 0x27, 0x26, 0x24, 0x23, 0x23, 0x23, 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x2b, 0x29, 0x26, 0x22, 0x1e, 0x1a, 0x16, 0x13, 0x11, 0x10, 0x10, 0x11, 0x12, 0x14, 0x16, 0x18, 0x19, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x14, 0x15, 0x16, 0x17, 0x19, 0x1b, 0x1c, 0x1c, 0x1c, 0x1b, 0x19, 0x17, 0x16, 0x14, 0x13, 0x14, 0x16, 0x18, 0x1c, 0x20, 0x24, 0x29, 0x2c}; flash unsigned char Cs2_clar[73] = {0x2d, 0x2f, 0x30, 0x2f, 0x2e, 0x2c, 0x2a, 0x28, 0x27, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2b, 0x2a, 0x29, 0x27, 0x25, 0x24, 0x23, 0x23, 0x23, 0x25, 0x27, 0x29, 0x2b, 0x2b, 0x2b, 0x2a, 0x27, 0x23, 0x1f, 0x1a, 0x16, 0x13, 0x10, 0x10, 0x10, 0x11, 0x13, 0x15, 0x17, 0x18, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x14, 0x15, 0x16, 0x17, 0x19, 0x1b, 0x1c, 0x1c, 0x1c, 0x1a, 0x18, 0x16, 0x15, 0x14, 0x14, 0x15, 0x18, 0x1c, 0x20, 0x25, 0x29, 0x2c}; flash unsigned char D2_clar[69] = {0x2d, 0x2f, 0x2f, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 0x26, 0x26, 0x27, 0x28, 0x2a, 0x2b, 0x2b, 0x2a, 0x29, 0x27, 0x25, 0x24, 0x23, 0x23, 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2b, 0x2a, 0x28, 0x24, 0x1f, 0x1a, 0x16, 0x12, 0x10, 0x0f, 0x10, 0x12, 0x14, 0x16, 0x18, 0x19, 0x19, 0x18, 0x17, 0x15, 0x14, 0x14, 0x15, 0x16, 0x18, 0x1a, 0x1b, 0x1c, 0x1c, 0x1b, 0x1a, 0x17, 0x15, 0x14, 0x14, 0x15, 0x17, 0x1b, 0x20, 0x25, 0x29, 0x2d}; flash unsigned char Ds2_clar[65] = {0x2d, 0x2f, 0x2f, 0x2f, 0x2d, 0x2a, 0x28, 0x27, 0x26, 0x27, 0x28, 0x29, 0x2b, 0x2b, 0x2b, 0x29, 0x27, 0x25, 0x24, 0x23, 0x23, 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2b, 0x29, 0x25, 0x21, 0x1b, 0x17, 0x13, 0x10, 0x0f, 0x10, 0x12, 0x14, 0x17, 0x18, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x14, 0x15, 0x17, 0x19, 0x1b, 0x1c, 0x1c, 0x1b, 0x19, 0x17, 0x15, 0x14, 0x14, 0x16, 0x19, 0x1e, 0x23, 0x28, 0x2c}; flash unsigned char E2_clar[62] = {0x2d, 0x2f, 0x2f, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x26, 0x27, 0x29, 0x2a, 0x2b, 0x2b, 0x2a, 0x28, 0x25, 0x24, 0x23, 0x23, 0x24, 0x27, 0x29, 0x2b, 0x2b, 0x2a, 0x27, 0x22, 0x1d, 0x18, 0x13, 0x10, 0x0f, 0x10, 0x12, 0x15, 0x17, 0x18, 0x19, 0x18, 0x17, 0x15, 0x14, 0x14, 0x15, 0x17, 0x19, 0x1b, 0x1c, 0x1c, 0x1b, 0x19, 0x17, 0x14, 0x14, 0x14, 0x17, 0x1b, 0x20, 0x26, 0x2b, 0x2e}; flash unsigned char F2_clar[58] = {0x2d, 0x2f, 0x2f, 0x2e, 0x2c, 0x29, 0x27, 0x26, 0x27, 0x28, 0x2a, 0x2b, 0x2b, 0x2a, 0x28, 0x26, 0x24, 0x23, 0x23, 0x25, 0x27, 0x2a, 0x2b, 0x2b, 0x29, 0x25, 0x20, 0x1a, 0x15, 0x11, 0x0f, 0x10, 0x12, 0x14, 0x17, 0x18, 0x19, 0x18, 0x16, 0x15, 0x14, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1c, 0x1c, 0x1a, 0x17, 0x15, 0x13, 0x14, 0x17, 0x1c, 0x21, 0x27, 0x2c}; flash unsigned char Fs2_clar[55] = {0x2d, 0x2f, 0x2f, 0x2e, 0x2b, 0x28, 0x27, 0x26, 0x27, 0x29, 0x2b, 0x2b, 0x2a, 0x29, 0x26, 0x24, 0x23, 0x23, 0x25, 0x28, 0x2a, 0x2c, 0x2b, 0x28, 0x23, 0x1d, 0x17, 0x12, 0x10, 0x0f, 0x11, 0x14, 0x17, 0x18, 0x19, 0x18, 0x16, 0x14, 0x14, 0x14, 0x16, 0x19, 0x1b, 0x1c, 0x1c, 0x1a, 0x17, 0x15, 0x13, 0x14, 0x17, 0x1c, 0x22, 0x28, 0x2d}; flash unsigned char G2_clar[52] = {0x2d, 0x2f, 0x2f, 0x2d, 0x2a, 0x28, 0x26, 0x27, 0x28, 0x2a, 0x2b, 0x2b, 0x29, 0x27, 0x24, 0x23, 0x23, 0x25, 0x28, 0x2a, 0x2c, 0x2a, 0x26, 0x21, 0x1a, 0x14, 0x11, 0x0f, 0x11, 0x13, 0x16, 0x18, 0x19, 0x18, 0x16, 0x14, 0x14, 0x15, 0x17, 0x1a, 0x1c, 0x1c, 0x1b, 0x19, 0x16, 0x14, 0x14, 0x16, 0x1b, 0x22, 0x28, 0x2d}; flash unsigned char Gs2_clar[49] = {0x2d, 0x30, 0x2f, 0x2d, 0x2a, 0x27, 0x26, 0x27, 0x29, 0x2b, 0x2b, 0x2a, 0x28, 0x25, 0x23, 0x23, 0x25, 0x28, 0x2b, 0x2c, 0x2a, 0x25, 0x1f, 0x18, 0x12, 0x10, 0x10, 0x12, 0x15, 0x18, 0x19, 0x18, 0x16, 0x14, 0x14, 0x15, 0x17, 0x1a, 0x1c, 0x1c, 0x1a, 0x17, 0x15, 0x13, 0x15, 0x19, 0x20, 0x26, 0x2c}; flash unsigned char A2_clar[46] = {0x2d, 0x2f, 0x2f, 0x2c, 0x29, 0x27, 0x26, 0x28, 0x2a, 0x2b, 0x2b, 0x28, 0x25, 0x23, 0x23, 0x24, 0x28, 0x2b, 0x2b, 0x29, 0x24, 0x1d, 0x16, 0x11, 0x0f, 0x11, 0x14, 0x17, 0x19, 0x18, 0x17, 0x15, 0x14, 0x15, 0x17, 0x1a, 0x1c, 0x1c, 0x1a, 0x16, 0x14, 0x14, 0x17, 0x1d, 0x24, 0x2b}; flash unsigned char As2_clar[44] = {0x2d, 0x30, 0x2f, 0x2c, 0x28, 0x26, 0x27, 0x29, 0x2b, 0x2b, 0x29, 0x26, 0x24, 0x23, 0x24, 0x27, 0x2a, 0x2c, 0x29, 0x23, 0x1c, 0x15, 0x10, 0x10, 0x12, 0x15, 0x18, 0x19, 0x17, 0x15, 0x14, 0x15, 0x17, 0x1a, 0x1c, 0x1c, 0x19, 0x16, 0x14, 0x14, 0x19, 0x20, 0x27, 0x2d}; flash unsigned char B2_clar[41] = {0x2d, 0x30, 0x2e, 0x2b, 0x28, 0x26, 0x27, 0x2a, 0x2b, 0x2a, 0x28, 0x24, 0x23, 0x24, 0x27, 0x2a, 0x2c, 0x29, 0x23, 0x1b, 0x13, 0x10, 0x10, 0x13, 0x17, 0x19, 0x18, 0x16, 0x14, 0x14, 0x16, 0x1a, 0x1c, 0x1c, 0x19, 0x15, 0x13, 0x15, 0x1b, 0x22, 0x2a}; flash unsigned char C3_clar[39] = {0x2d, 0x30, 0x2d, 0x2a, 0x27, 0x26, 0x28, 0x2a, 0x2b, 0x29, 0x26, 0x23, 0x23, 0x26, 0x2a, 0x2c, 0x29, 0x23, 0x1a, 0x13, 0x10, 0x11, 0x14, 0x18, 0x19, 0x17, 0x15, 0x14, 0x16, 0x19, 0x1c, 0x1c, 0x1a, 0x16, 0x14, 0x15, 0x1b, 0x24, 0x2b}; #pragma regalloc+ // Set the registers register char scale_size1 @7; // holds the length of the scale array register char scale_size2 @8; register char scale_size3 @12; register char note1 @18; // holds the index of the array register char note2 @19; register char note3 @13; register char num_notes @9; // number of notes played //register char one @10; register char two @10; // holds constants register char three @11; // Timer0 overflow ISR interrupt [TIM0_OVF] void timer0_overflow(void) { // Reload to force 1 mSec overflow TCNT0 = reload; // Decrement task counters to get 30 ms if (time0 > 0) --time0; //if (time1 > 0) --time1; } #pragma savereg- // Timer1 overflow ISR interrupt [TIM1_COMPA] void cmpA_overflow(void) { #asm push r17 in r17, SREG ;save SREG in register17 push r17 push r28 push r29 push r30 ;push registers used push r31 push r16 push r15 push r14 push r5 push r4 ldi r30, LOW(_scale1) ;scale address into ZLow ldi r31, HIGH(_scale1) clr r16 add r30,r18 ;add note1 index to ZLow to index wave value adc r31,r16 ;account for carry to ZHigh inc r18 ;increment note1 index ld r16, Z ;load 8bit wave value at address in Z in r16 cp r9,r10 ;check if 2 notes played, num_notes == 2 breq TWO cp r9,r11 ;check if 3 notes played, num_notes == 3 breq TWO out 0x15,r16 ;send wave value to PORTC cp r18,r7 ;check note1 < scale_size1 brne DONE clr r18 ;reset note1 clr r4 ;jump to DONE clr r5 cp r4,r5 breq DONE TWO: ldi r28, LOW(_scale2) ;load scale2 address to Y ldi r29, HIGH(_scale2) clr r14 clr r15 add r28,r19 ;add note2 index to Y to index wave value adc r29,r14 inc r19 ;increment note2 index ld r15, Y ;load 8bit wave value at address in Y in r15 add r15,r16 ;add two wave values together cp r9,r11 ;check if 3 notes played num_notes == 3 breq THREE out 0x15,r15 ;send bits of wave value to PORTC cp r18,r7 ;check note1 < scale_size1 brne SKIP clr r18 ;zero note1 index SKIP: cp r19,r8 ;check note2 < scale_size2 brne DONE clr r19 ;zero note2 index clr r4 ;jump to DONE clr r5 cp r4,r5 breq DONE THREE: ldi r28, LOW(_scale3) ;load scale3 address to Y ldi r29, HIGH(_scale3) clr r14 clr r16 add r28,r13 ;add note3 index to Y to index wave value adc r29,r14 inc r13 ;increment note3 index ld r16, Y ;load 8bit wave value at address in Y in r16 add r16,r15 ;add three wave values together out 0x15,r16 ;send bits of wave value to PORTC cp r18,r7 ;check note1 < scale_size1 brne SKIP1 clr r18 ;zero note1 index SKIP1: cp r19,r8 ;check note2 < scale_size2 brne SKIP2 clr r19 ;zero note2 index SKIP2: cp r13,r12 ;check note3 < scale_size3 brne DONE clr r13 ;zero note3 index DONE: pop r4 pop r5 pop r14 pop r15 pop r16 ;restore SREG and registers pop r31 pop r30 pop r29 pop r28 pop r17 out SREG, r17 pop r17 #endasm } #pragma savereg+ //UART character-ready ISR interrupt [UART_RXC] void uart_rec(void) { r_char=UDR; //get a char UDR=r_char; //then print it //build the input string if (r_char != '\r') r_buffer[r_index++]=r_char; else { putchar('\n'); //use putchar to avoid overwrite r_buffer[r_index]=0x00; //zero terminate r_busy=0; //and clean up r_ready=1; //signal cmd processor UCR.7=0; //stop rec ISR } } void gets_int(void) { r_busy=1; r_ready=0; r_index=0; UCR.7=1; } // Initialize the system void initialize(void) { // Set up the UART UCR = 0x10 + 0x08; UBRR = 51; // Set the ports DDRA=0x00; // PORT A is an input: piano keys DDRB=0x00; // PORT B is an input: piano keys DDRC=0xff; // PORT C is an output for the DAC DDRD=0xff; // PORT D is an output for the UART // Set up timer0 reload=256-125; // value for 1 Msec TCNT0=reload; // preload timer 1 so that it interrupts after 1 mSec. TCCR0=3; // prescalar to 64 TIMSK=2; // turn on timer 0 overflow ISR // Set up timer1 TIMSK = TIMSK | 0x40; // turn on timer 1 compare match interrupt TCCR1B = 0; //prescale1 + clear_on_match; // stop timer1 TCNT1 = 0; // zero timer1 // 8 Mhz clock, needs to overflow at rate of 20 Khz OCR1A = 400; // zero the variables time0 = t0; keypress = 0; num_notes = 0; two = 2; three = 3; scale_size1 = 0; scale_size2 = 0; scale_size3 = 0; note1 = 0; note2 = 0; note3 = 0; for (i=0; i<77; i++) { scale1[i] = 0; scale2[i] = 0; scale3[i] = 0; } cmd = 0; instrument = 0; // Crank up the ISRs #asm sei #endasm // Sets up the UART ISR gets_int(); } //************************************************************************ // Main void main(void) { initialize(); putsf("\r\nPlease select an Instrument\r\n"); putsf("\r\na=Piano, b=Clarinet\r\n"); while(1) { if(time0 == 0) checkbuttons(); if ( (r_ready ==1) && (strcmpf(r_buffer,"a")==0) && (cmd==0) ){ cmd = 1; //1 = piano instrument = 0; putsf("You've selected the Piano\r\n"); gets_int(); } if ( (r_ready ==1) && (cmd==1)) { cmd = 0; } if ( (r_ready ==1) && (strcmpf(r_buffer,"b")==0) && (cmd==0) ){ cmd = 2; //2 = clarinet instrument = 1; putsf("You've selected the Clarinet\r\n"); gets_int(); } if ( (r_ready ==1) && (cmd==2)) { cmd = 0; } } } //************************************************************************ // Checkbuttons // Check the keypad to see which notes have been pushed void checkbuttons() { time0 = t0; keypress = 0; // Middle C - C2 if(PINA.0 == 0) { scalesize[keypress] = 77; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; //printf("%d", scale1); } // D2 if(PINA.1 == 0){ scalesize[keypress] = 69; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // E2 if(PINA.2 == 0) { scalesize[keypress] = 62; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // F2 if(PINA.3 == 0) { scalesize[keypress] = 58; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // G2 if(PINA.4 == 0) { scalesize[keypress] = 52; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // A2 if(PINA.5 == 0) { scalesize[keypress] = 46; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // B2 if(PINA.6 == 0) { scalesize[keypress] = 41; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // C2 if(PINA.7 == 0) { scalesize[keypress] = 39; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // *************** SHARP KEYS ******************* // C# Sharp if(PINB.0 == 0) { scalesize[keypress] = 73; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // D# Sharp if(PINB.1 == 0) { scalesize[keypress] = 65; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // F# Sharp if(PINB.2 == 0) { scalesize[keypress] = 55; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // G# Sharp if(PINB.3 == 0) { scalesize[keypress] = 49; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // A# Sharp if(PINB.4 == 0) { scalesize[keypress] = 44; keypress++; TCNT1 = 0; TCCR1B = prescale1 + clear_on_match; } // stop playing note if no keys are pressed if((~PINA == 0x00) && (~PINB == 0x00)) { TCNT1 = 0; TCCR1B = 0; for (i=0; i<77; i++) { scale1[i] = 0; scale2[i] = 0; scale3[i] = 0; } } // Check if keypress = 1 if (keypress == 1) { // Set the scale size for the key scale_size1 = scalesize[0]; // Set number of notes to 1 num_notes = 1; switch(scale_size1) { case 77: for (i=0; i<77; i++) { if (instrument == 0) scale1[i] = C2[i]; //if (instrument == 1) { else scale1[i] = C2_clar[i]; } break; case 69: for (i=0; i<69; i++) { if (instrument == 0) scale1[i] = D2[i]; //if (instrument == 1) else scale1[i] = D2_clar[i]; } break; case 62: for (i=0; i<62; i++) { if (instrument == 0) scale1[i] = E2[i]; //if (instrument == 1) else scale1[i] = E2_clar[i]; } break; case 58: for (i=0; i<58; i++) { if (instrument == 0) scale1[i] = F2[i]; //if (instrument == 1) { else scale1[i] = F2_clar[i]; } break; case 52: for (i=0; i<52; i++) { if (instrument == 0) scale1[i] = G2[i]; //if (instrument == 1) { else scale1[i] = G2_clar[i]; } break; case 46: for (i=0; i<46; i++) { if (instrument == 0) scale1[i] = A2[i]; //if (instrument == 1) { else scale1[i] = A2_clar[i]; } break; case 41: for (i=0; i<41; i++) { if (instrument == 0) scale1[i] = B2[i]; //if (instrument == 1) { else scale1[i] = B2_clar[i]; } break; case 39: for (i=0; i<39; i++) { if (instrument == 0) scale1[i] = C3[i]; //if (instrument == 1) { else scale1[i] = C3_clar[i]; } break; case 73: for (i=0; i<73; i++) { if (instrument == 0) scale1[i] = Cs2[i]; //if (instrument == 1) { else scale1[i] = Cs2_clar[i]; } break; case 65: for (i=0; i<65; i++) { if (instrument == 0) scale1[i] = Ds2[i]; //if (instrument == 1) { else scale1[i] = Ds2_clar[i]; } break; case 55: for (i=0; i<55; i++) { if (instrument == 0) scale1[i] = Fs2[i]; //if (instrument == 1) { else scale1[i] = Fs2_clar[i]; } break; case 49: for (i=0; i<49; i++) { if (instrument == 0) scale1[i] = Gs2[i]; //if (instrument == 1) { else scale1[i] = Gs2_clar[i]; } break; case 44: for (i=0; i<44; i++) { if (instrument == 0) scale1[i] = As2[i]; //if (instrument == 1) { else scale1[i] = As2_clar[i]; } break; } } // check if two keys pressed else if(keypress == 2) { // Set the two scale sizes and scale types for both keys scale_size1 = scalesize[0]; scale_size2 = scalesize[1]; num_notes = 2; switch(scale_size1) { case 77: for (i=0; i<77; i++) { if (instrument == 0) scale1[i] = C2[i]; //printf("%d", scale1[i]); //if (instrument == 1) { else scale1[i] = C2_clar[i]; } break; case 69: for (i=0; i<69; i++) { if (instrument == 0) scale1[i] = D2[i]; //if (instrument == 1) { else scale1[i] = D2_clar[i]; } break; case 62: for (i=0; i<62; i++) { if (instrument == 0) scale1[i] = E2[i]; //if (instrument == 1) { else scale1[i] = E2_clar[i]; } break; case 58: for (i=0; i<58; i++) { if (instrument == 0) scale1[i] = F2[i]; //if (instrument == 1) { else scale1[i] = F2_clar[i]; } break; case 52: for (i=0; i<52; i++) { if (instrument == 0) scale1[i] = G2[i]; //if (instrument == 1) { else scale1[i] = G2_clar[i]; } break; case 46: for (i=0; i<46; i++) { if (instrument == 0) scale1[i] = A2[i]; //if (instrument == 1) { else scale1[i] = A2_clar[i]; } break; case 41: for (i=0; i<41; i++) { if (instrument == 0) scale1[i] = B2[i]; //if (instrument == 1) { else scale1[i] = B2_clar[i]; } break; case 39: for (i=0; i<39; i++) { if (instrument == 0) scale1[i] = C3[i]; //if (instrument == 1) { else scale1[i] = C3_clar[i]; } break; case 73: for (i=0; i<73; i++) { if (instrument == 0) scale1[i] = Cs2[i]; //if (instrument == 1) { else scale1[i] = Cs2_clar[i]; } break; case 65: for (i=0; i<65; i++) { if (instrument == 0) scale1[i] = Ds2[i]; //if (instrument == 1) { else scale1[i] = Ds2_clar[i]; } break; case 55: for (i=0; i<55; i++) { if (instrument == 0) scale1[i] = Fs2[i]; //if (instrument == 1) { else scale1[i] = Fs2_clar[i]; } break; case 49: for (i=0; i<49; i++) { if (instrument == 0) scale1[i] = Gs2[i]; //if (instrument == 1) { else scale1[i] = Gs2_clar[i]; } break; case 44: for (i=0; i<44; i++) { if (instrument == 0) scale1[i] = As2[i]; //if (instrument == 1) { else scale1[i] = As2_clar[i]; } break; } switch(scale_size2) { case 77: for (i=0; i<77; i++) { if (instrument == 0) scale2[i] = C2[i]; //if (instrument == 1) { else scale2[i] = C2_clar[i]; } break; case 69: for (i=0; i<69; i++) { if (instrument == 0) scale2[i] = D2[i]; //if (instrument == 1) { else scale2[i] = D2_clar[i]; } break; case 62: for (i=0; i<62; i++) { if (instrument == 0) scale2[i] = E2[i]; //if (instrument == 1) { else scale2[i] = E2_clar[i]; } break; case 58: for (i=0; i<58; i++) { if (instrument == 0) scale2[i] = F2[i]; //if (instrument == 1) { else scale2[i] = F2_clar[i]; } break; case 52: for (i=0; i<52; i++) { if (instrument == 0) scale2[i] = G2[i]; //if (instrument == 1) { else scale2[i] = G2_clar[i]; } break; case 46: for (i=0; i<46; i++) { if (instrument == 0) scale2[i] = A2[i]; //if (instrument == 1) { else scale2[i] = A2_clar[i]; } break; case 41: for (i=0; i<41; i++) { if (instrument == 0) scale2[i] = B2[i]; //if (instrument == 1) { else scale2[i] = B2_clar[i]; } break; case 39: for (i=0; i<39; i++) { if (instrument == 0) scale2[i] = C3[i]; //if (instrument == 1) { else scale2[i] = C3_clar[i]; } break; case 73: for (i=0; i<73; i++) { if (instrument == 0) scale2[i] = Cs2[i]; //if (instrument == 1) { else scale2[i] = Cs2_clar[i]; } break; case 65: for (i=0; i<65; i++) { if (instrument == 0) scale2[i] = Ds2[i]; //if (instrument == 1) { else scale2[i] = Ds2_clar[i]; } break; case 55: for (i=0; i<55; i++) { if (instrument == 0) scale2[i] = Fs2[i]; //if (instrument == 1) { else scale2[i] = Fs2_clar[i]; } break; case 49: for (i=0; i<49; i++) { if (instrument == 0) scale2[i] = Gs2[i]; //if (instrument == 1) { else scale2[i] = Gs2_clar[i]; } break; case 44: for (i=0; i<44; i++) { if (instrument == 0) scale2[i] = As2[i]; //if (instrument == 1) { else scale2[i] = As2_clar[i]; } break; } } // check if 3 keys pressed if(keypress == 3) { // Set the three scale sizes and scale types for all 3 keys scale_size1 = scalesize[0]; scale_size2 = scalesize[1]; scale_size3 = scalesize[2]; num_notes = 3; switch(scale_size1) { case 77: for (i=0; i<77; i++) { if (instrument == 0) scale1[i] = C2[i]; //printf("%d", scale1[i]); //if (instrument == 1) { else scale1[i] = C2_clar[i]; } break; case 69: for (i=0; i<69; i++) { if (instrument == 0) scale1[i] = D2[i]; //if (instrument == 1) { else scale1[i] = D2_clar[i]; } break; case 62: for (i=0; i<62; i++) { if (instrument == 0) scale1[i] = E2[i]; //if (instrument == 1) { else scale1[i] = E2_clar[i]; } break; case 58: for (i=0; i<58; i++) { if (instrument == 0) scale1[i] = F2[i]; //if (instrument == 1) { else scale1[i] = F2_clar[i]; } break; case 52: for (i=0; i<52; i++) { if (instrument == 0) scale1[i] = G2[i]; //if (instrument == 1) { else scale1[i] = G2_clar[i]; } break; case 46: for (i=0; i<46; i++) { if (instrument == 0) scale1[i] = A2[i]; //if (instrument == 1) { else scale1[i] = A2_clar[i]; } break; case 41: for (i=0; i<41; i++) { if (instrument == 0) scale1[i] = B2[i]; //if (instrument == 1) { else scale1[i] = B2_clar[i]; } break; case 39: for (i=0; i<39; i++) { if (instrument == 0) scale1[i] = C3[i]; //if (instrument == 1) { else scale1[i] = C3_clar[i]; } break; case 73: for (i=0; i<73; i++) { if (instrument == 0) scale1[i] = Cs2[i]; //if (instrument == 1) { else scale1[i] = Cs2_clar[i]; } break; case 65: for (i=0; i<65; i++) { if (instrument == 0) scale1[i] = Ds2[i]; //if (instrument == 1) { else scale1[i] = Ds2_clar[i]; } break; case 55: for (i=0; i<55; i++) { if (instrument == 0) scale1[i] = Fs2[i]; //if (instrument == 1) { else scale1[i] = Fs2_clar[i]; } break; case 49: for (i=0; i<49; i++) { if (instrument == 0) scale1[i] = Gs2[i]; //if (instrument == 1) { else scale1[i] = Gs2_clar[i]; } break; case 44: for (i=0; i<44; i++) { if (instrument == 0) scale1[i] = As2[i]; //if (instrument == 1) { else scale1[i] = As2_clar[i]; } break; } switch(scale_size2) { case 77: for (i=0; i<77; i++) { if (instrument == 0) scale2[i] = C2[i]; //printf("%d", scale1[i]); //if (instrument == 1) { else scale2[i] = C2_clar[i]; } break; case 69: for (i=0; i<69; i++) { if (instrument == 0) scale2[i] = D2[i]; //if (instrument == 1) { else scale2[i] = D2_clar[i]; } break; case 62: for (i=0; i<62; i++) { if (instrument == 0) scale2[i] = E2[i]; //if (instrument == 1) { else scale2[i] = E2_clar[i]; } break; case 58: for (i=0; i<58; i++) { if (instrument == 0) scale2[i] = F2[i]; //if (instrument == 1) { else scale2[i] = F2_clar[i]; } break; case 52: for (i=0; i<52; i++) { if (instrument == 0) scale2[i] = G2[i]; //if (instrument == 1) { else scale2[i] = G2_clar[i]; } break; case 46: for (i=0; i<46; i++) { if (instrument == 0) scale2[i] = A2[i]; //if (instrument == 1) { else scale2[i] = A2_clar[i]; } break; case 41: for (i=0; i<41; i++) { if (instrument == 0) scale2[i] = B2[i]; //if (instrument == 1) { else scale2[i] = B2_clar[i]; } break; case 39: for (i=0; i<39; i++) { if (instrument == 0) scale2[i] = C3[i]; //if (instrument == 1) { else scale2[i] = C3_clar[i]; } break; case 73: for (i=0; i<73; i++) { if (instrument == 0) scale2[i] = Cs2[i]; //if (instrument == 1) { else scale2[i] = Cs2_clar[i]; } break; case 65: for (i=0; i<65; i++) { if (instrument == 0) scale2[i] = Ds2[i]; //if (instrument == 1) { else scale2[i] = Ds2_clar[i]; } break; case 55: for (i=0; i<55; i++) { if (instrument == 0) scale2[i] = Fs2[i]; //if (instrument == 1) { else scale2[i] = Fs2_clar[i]; } break; case 49: for (i=0; i<49; i++) { if (instrument == 0) scale2[i] = Gs2[i]; //if (instrument == 1) { else scale2[i] = Gs2_clar[i]; } break; case 44: for (i=0; i<44; i++) { if (instrument == 0) scale2[i] = As2[i]; //if (instrument == 1) { else scale2[i] = As2_clar[i]; } break; } switch(scale_size3) { case 77: for (i=0; i<77; i++) { if (instrument == 0) scale3[i] = C2[i]; //printf("%d", scale1[i]); //if (instrument == 1) { else scale3[i] = C2_clar[i]; } break; case 69: for (i=0; i<69; i++) { if (instrument == 0) scale3[i] = D2[i]; //if (instrument == 1) { else scale3[i] = D2_clar[i]; } break; case 62: for (i=0; i<62; i++) { if (instrument == 0) scale3[i] = E2[i]; //if (instrument == 1) { else scale3[i] = E2_clar[i]; } break; case 58: for (i=0; i<58; i++) { if (instrument == 0) scale3[i] = F2[i]; //if (instrument == 1) { else scale3[i] = F2_clar[i]; } break; case 52: for (i=0; i<52; i++) { if (instrument == 0) scale3[i] = G2[i]; //if (instrument == 1) { else scale3[i] = G2_clar[i]; } break; case 46: for (i=0; i<46; i++) { if (instrument == 0) scale3[i] = A2[i]; //if (instrument == 1) { else scale3[i] = A2_clar[i]; } break; case 41: for (i=0; i<41; i++) { if (instrument == 0) scale3[i] = B2[i]; //if (instrument == 1) { else scale3[i] = B2_clar[i]; } break; case 39: for (i=0; i<39; i++) { if (instrument == 0) scale3[i] = C3[i]; //if (instrument == 1) { else scale3[i] = C3_clar[i]; } break; case 73: for (i=0; i<73; i++) { if (instrument == 0) scale3[i] = Cs2[i]; //if (instrument == 1) { else scale3[i] = Cs2_clar[i]; } break; case 65: for (i=0; i<65; i++) { if (instrument == 0) scale3[i] = Ds2[i]; //if (instrument == 1) { else scale3[i] = Ds2_clar[i]; } break; case 55: for (i=0; i<55; i++) { if (instrument == 0) scale3[i] = Fs2[i]; //if (instrument == 1) { else scale3[i] = Fs2_clar[i]; } break; case 49: for (i=0; i<49; i++) { if (instrument == 0) scale3[i] = Gs2[i]; //if (instrument == 1) { else scale3[i] = Gs2_clar[i]; } break; case 44: for (i=0; i<44; i++) { if (instrument == 0) scale3[i] = As2[i]; //if (instrument == 1) { else scale3[i] = As2_clar[i]; } break; } } //printf("%d", keypress); }