diff --git a/Arduinoboy/Arduinoboy.ino b/Arduinoboy/Arduinoboy.ino index cb05a3d..81d0f5c 100755 --- a/Arduinoboy/Arduinoboy.ino +++ b/Arduinoboy/Arduinoboy.ino @@ -1,7 +1,7 @@ /*************************************************************************** * A R D U I N O B O Y * * * - * Version: 0.8.5 * + * Version: 0.8.6 * * Date: March 07 2008 * * Name: Timothy Lamb * * Email: trash80@gmail.com * @@ -111,7 +111,7 @@ int countGbClockTicks =0; int countClockPause =0; int countIncommingMidiByte =0; int countStatusLedOn =0; - +unsigned int waitClock =0; /*************************************************************************** * Inbound Data Placeholders ***************************************************************************/ @@ -123,7 +123,9 @@ int incomingMidiData[] = {0, 0, 0}; int incomingMidiNote = 0; int incomingMidiVel = 0; byte readToggleMode; - +byte serialWriteBuffer[256]; +int writePosition=0; +int readPosition=0; /*************************************************************************** * LSDJ Keyboard mode settings ***************************************************************************/ diff --git a/Arduinoboy/Mode_LSDJ_Keyboard.ino b/Arduinoboy/Mode_LSDJ_Keyboard.ino index 1752f94..c82408e 100755 --- a/Arduinoboy/Mode_LSDJ_Keyboard.ino +++ b/Arduinoboy/Mode_LSDJ_Keyboard.ino @@ -13,10 +13,10 @@ void modeLSDJKeyboardSetup() { - sendByteToGameboy(0); - for(int rst=0;rst<5;rst++) sendByteToGameboy(keyboardOctDn); - for(int rst=0;rst<41;rst++) sendByteToGameboy(keyboardInsDn); - for(int rst=0;rst<41;rst++) sendByteToGameboy(keyboardTblDn); + addGameboyByte(0); + for(int rst=0;rst<5;rst++) addGameboyByte(keyboardOctDn); + for(int rst=0;rst<41;rst++) addGameboyByte(keyboardInsDn); + for(int rst=0;rst<41;rst++) addGameboyByte(keyboardTblDn); keyboardCurrentOct = 0; keyboardCurrentIns = 0; keyboardCurrentTbl = 0; @@ -27,8 +27,7 @@ void modeLSDJKeyboardSetup() void modeLSDJKeyboard() { while(1){ - setMode(); - updateStatusLed(); + if (Serial.available() > 0) { incomingMidiByte = Serial.read(); Serial.print(incomingMidiByte, BYTE); @@ -37,11 +36,19 @@ void modeLSDJKeyboard() case 0x90: midiNoteOnMode = true; incomingMidiData[0] = incomingMidiByte; + incomingMidiData[1] = false; break; case 0xC0: midiProgramChange = true; + midiNoteOnMode = false; incomingMidiData[0] = incomingMidiByte - 48; break; + default: + midiNoteOnMode = false; + midiProgramChange = false; + incomingMidiData[1] = false; + break; + } } else if(midiNoteOnMode) { if(!incomingMidiData[1]) { @@ -49,10 +56,7 @@ void modeLSDJKeyboard() } else { incomingMidiData[2] = incomingMidiByte; playLSDJKeyboard(); - midiNoteOnMode=false; - incomingMidiData[0] = false; incomingMidiData[1] = false; - incomingMidiData[2] = false; } } else if (midiProgramChange) { incomingMidiData[1] = incomingMidiByte; @@ -61,13 +65,19 @@ void modeLSDJKeyboard() incomingMidiData[0] = false; incomingMidiData[1] = false; } + updateGameboyByteFrame(); + updateStatusLed(); + setMode(); + } else { + updateGameboyByteFrame(); updateStatusLed(); + setMode(); } } } void playLSDJKeyboard() { - if(incomingMidiData[0] == keyboardInstrumentMidiChannel) { + if(incomingMidiData[0] == keyboardInstrumentMidiChannel && incomingMidiData[2] > 0x00) { playLSDJKeyboardNote(); } } @@ -79,12 +89,12 @@ void playLSDJProgramChange() if(keyboardCurrentIns > keyboardLastIns) { keyboardDiff = keyboardCurrentIns - keyboardLastIns; for(keyboardCount=0;keyboardCount= 0x3C - && incomingMidiData[2] > 0x00 - ) { + if(incomingMidiData[1] >= 0x3C) { incomingMidiData[1] = incomingMidiData[1] - 0x3C; if(incomingMidiData[1] >= 0x30) { keyboardCurrentOct = 4; @@ -115,67 +123,88 @@ void playLSDJKeyboardNote() keyboardDiff = keyboardCurrentOct - keyboardLastOct; for(keyboardCount=0;keyboardCount 100) { + waitClock=0; + statusLedOn(); + sendByteToGameboy(serialWriteBuffer[readPosition]); + readPosition++; + readPosition = readPosition % 256; + } + } +} + void sendByteToGameboy(byte send_byte) { for(countLSDJTicks=0;countLSDJTicks<8;countLSDJTicks++) { @@ -189,7 +218,5 @@ void sendByteToGameboy(byte send_byte) digitalWrite(pinGBClock,LOW); } digitalWrite(pinGBSerialOut,LOW); - delayMicroseconds(1600); - statusLedOn(); }