fix USB midi issue for ST
This commit is contained in:
parent
f8bafeb06b
commit
77cb348ff8
6 changed files with 139 additions and 73 deletions
|
|
@ -1108,13 +1108,15 @@ int emu_KeyboardDetected(void) {
|
|||
|
||||
#ifdef HAS_USBKEY
|
||||
static unsigned char midiBuffer[16];
|
||||
static unsigned char midiLastCmd=0;
|
||||
static int midiDataCnt=0;
|
||||
static int midiLastCmd=0;
|
||||
static int midiCmdNbParam=0;
|
||||
#endif
|
||||
|
||||
void emu_MidiOnDataReceived(unsigned char value) {
|
||||
|
||||
#ifdef HAS_USBKEY
|
||||
//Serial.println(value, HEX);
|
||||
//10000000 = 128 = note off
|
||||
//10010000 = 144 = note on
|
||||
//10100000 = 160 = aftertouch
|
||||
|
|
@ -1127,44 +1129,95 @@ void emu_MidiOnDataReceived(unsigned char value) {
|
|||
midiDataCnt = 0;
|
||||
midiLastCmd = value;
|
||||
switch (value & 0xF0) {
|
||||
case 128:
|
||||
case 128: // 0x80
|
||||
midiCmdNbParam = 2;
|
||||
Serial.print("note off: ");
|
||||
Serial.println(value&0xf);
|
||||
//Serial.print("note off: ");
|
||||
//Serial.println(value&0xf);
|
||||
break;
|
||||
case 144:
|
||||
case 144: //0x90
|
||||
midiCmdNbParam = 2;
|
||||
Serial.print("note on: ");
|
||||
Serial.println(value&0xf);
|
||||
//Serial.print("note on: ");
|
||||
//Serial.println(value&0xf);
|
||||
break;
|
||||
case 160:
|
||||
case 160: //0xA0
|
||||
midiCmdNbParam = 2;
|
||||
Serial.print("aftertouch: ");
|
||||
Serial.println(value&0xf);
|
||||
//Serial.print("aftertouch: "); // rare
|
||||
//Serial.println(value&0xf);
|
||||
break;
|
||||
case 176:
|
||||
case 176: //0xB0
|
||||
midiCmdNbParam = 2;
|
||||
Serial.print("continuous controller: ");
|
||||
Serial.println(value&0xf);
|
||||
//Serial.print("continuous controller: ");
|
||||
//Serial.println(value&0xf);
|
||||
break;
|
||||
case 192:
|
||||
case 192: //0xC0
|
||||
midiCmdNbParam = 1;
|
||||
Serial.print("patch change: ");
|
||||
Serial.println(value&0xf);
|
||||
//Serial.print("patch change: "); //some
|
||||
//Serial.println(value&0xf);
|
||||
break;
|
||||
case 208:
|
||||
case 208: //0xD0
|
||||
midiCmdNbParam = 1;
|
||||
Serial.print("channel pressure: ");
|
||||
Serial.println(value&0xf);
|
||||
break;
|
||||
case 224:
|
||||
case 224: //0xE0
|
||||
midiCmdNbParam = 2;
|
||||
Serial.print("pitch bend: ");
|
||||
Serial.println(value&0xf);
|
||||
//Serial.print("pitch bend: ");
|
||||
//Serial.println(value&0xf);
|
||||
break;
|
||||
case 240:
|
||||
Serial.print("non-musical commands: ");
|
||||
Serial.println(value&0xf);
|
||||
case 240: //0xF0
|
||||
// non-musical commands
|
||||
switch (value) {
|
||||
case 0xF0:
|
||||
//Serial.println("NI: System Exclusive");
|
||||
break;
|
||||
case 0xF1:
|
||||
//Serial.println("NI: System Common - MIDI Time Code Quarter Frame");
|
||||
break;
|
||||
case 0xF2:
|
||||
midiCmdNbParam = 2;
|
||||
break;
|
||||
case 0xF3:
|
||||
//Serial.println("NI: System Common - Song Select");
|
||||
break;
|
||||
case 0xF6:
|
||||
//Serial.println("NI: System Common - Tune Request");
|
||||
break;
|
||||
case 0xF8:
|
||||
//Serial.println("System Real Time - Timing Clock");
|
||||
midi1.sendRealTime(value, 0);
|
||||
break;
|
||||
case 0xFA:
|
||||
//Serial.println("System Real Time - Start");
|
||||
midi1.sendRealTime(value, 0);
|
||||
break;
|
||||
case 0xFB:
|
||||
//Serial.println("System Real Time - Continue");
|
||||
midi1.sendRealTime(value, 0);
|
||||
break;
|
||||
case 0xFC:
|
||||
//Serial.println("System Real Time - Stop");
|
||||
midi1.sendRealTime(value, 0);
|
||||
break;
|
||||
case 0xFE:
|
||||
//Serial.println("System Real Time - Active Sensing");
|
||||
midi1.sendRealTime(value, 0);
|
||||
break;
|
||||
case 0xFF:
|
||||
//Serial.println("System Real Time - System Reset");
|
||||
midi1.sendRealTime(value, 0);
|
||||
break;
|
||||
}
|
||||
//SystemExclusive = 0xF0, // System Exclusive
|
||||
//TimeCodeQuarterFrame = 0xF1, // System Common - MIDI Time Code Quarter Frame
|
||||
//SongPosition = 0xF2, // System Common - Song Position Pointer
|
||||
//SongSelect = 0xF3, // System Common - Song Select
|
||||
//TuneRequest = 0xF6, // System Common - Tune Request
|
||||
//Clock = 0xF8, // System Real Time - Timing Clock
|
||||
//Start = 0xFA, // System Real Time - Start
|
||||
//Continue = 0xFB, // System Real Time - Continue
|
||||
//Stop = 0xFC, // System Real Time - Stop
|
||||
//ActiveSensing = 0xFE, // System Real Time - Active Sensing
|
||||
//SystemReset = 0xFF, // System Real Time - System Reset
|
||||
break;
|
||||
default:
|
||||
Serial.print("??: ");
|
||||
|
|
@ -1174,45 +1227,49 @@ void emu_MidiOnDataReceived(unsigned char value) {
|
|||
}
|
||||
else {
|
||||
if (midiDataCnt<16) midiBuffer[midiDataCnt++] = value ;
|
||||
Serial.print("DATA ");
|
||||
Serial.println(value);
|
||||
if (midiDataCnt == midiCmdNbParam) {
|
||||
if ( (midiLastCmd & 0xF0) == 240) {
|
||||
if (midiLastCmd == 0xF2) {
|
||||
if (midiDataCnt == midiCmdNbParam) {
|
||||
//Serial.println("System Common - Song Position Pointer");
|
||||
midi1.sendSongPosition(((int)midiBuffer[1]<<7)+(int)midiBuffer[0], 0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
Serial.println(value);
|
||||
}
|
||||
}
|
||||
else if (midiDataCnt == midiCmdNbParam) {
|
||||
unsigned char chan = (midiLastCmd&0xf)+1;
|
||||
//Serial.print("ch ");
|
||||
//Serial.println(chan);
|
||||
switch (midiLastCmd & 0xF0) {
|
||||
case 128:
|
||||
midiCmdNbParam = 2;
|
||||
midi1.sendNoteOff(midiBuffer[0], midiBuffer[1], midiLastCmd&0xf);
|
||||
case 128: //0x80
|
||||
//Serial.print("note off: ");
|
||||
midi1.sendNoteOff(midiBuffer[0], midiBuffer[1], chan);
|
||||
break;
|
||||
case 144:
|
||||
midiCmdNbParam = 2;
|
||||
midi1.sendNoteOn(midiBuffer[0], midiBuffer[1], midiLastCmd&0xf);
|
||||
case 144: //0x90
|
||||
//Serial.print("note on: ");
|
||||
midi1.sendNoteOn(midiBuffer[0], midiBuffer[1], chan);
|
||||
break;
|
||||
case 160:
|
||||
midiCmdNbParam = 2;
|
||||
midi1.sendAfterTouchPoly(midiBuffer[0], midiBuffer[1], midiLastCmd&0xf);
|
||||
//Serial.print("aftertouch: ");
|
||||
case 160: //0xA0
|
||||
//Serial.print("aftertouch: ");
|
||||
midi1.sendPolyPressure(midiBuffer[0], midiBuffer[1], chan);
|
||||
break;
|
||||
case 176:
|
||||
midiCmdNbParam = 2;
|
||||
case 176: //0xB0
|
||||
//Serial.print("continuous controller: ");
|
||||
midi1.sendControlChange(midiBuffer[0], midiBuffer[1], midiLastCmd&0xf);
|
||||
midi1.sendControlChange(midiBuffer[0], midiBuffer[1], chan);
|
||||
break;
|
||||
case 192:
|
||||
midiCmdNbParam = 1;
|
||||
case 192: //0xC0
|
||||
//Serial.print("patch change: ");
|
||||
midi1.sendProgramChange(midiBuffer[0], midiLastCmd&0xf);
|
||||
midi1.sendProgramChange(midiBuffer[0], chan);
|
||||
break;
|
||||
case 208:
|
||||
midiCmdNbParam = 1;
|
||||
//Serial.print("channel pressure: ");
|
||||
midi1.sendProgramChange(midiBuffer[0], midiLastCmd&0xf);
|
||||
case 208: //0xD0
|
||||
//Serial.print("channel pressure: ");
|
||||
midi1.sendAfterTouch(midiBuffer[0], chan);
|
||||
break;
|
||||
case 224:
|
||||
midiCmdNbParam = 2;
|
||||
//Serial.print("pitch bend: ");
|
||||
midi1.sendProgramChange(midiBuffer[1]<<7+midiBuffer[0], midiLastCmd&0xf);
|
||||
break;
|
||||
case 240:
|
||||
Serial.print("non-musical commands: ");
|
||||
case 224: //0xE0
|
||||
//Serial.print("pitch bend: ");
|
||||
midi1.sendPitchBend((((int)midiBuffer[1]<<7)+(int)midiBuffer[0])-8192, chan);
|
||||
break;
|
||||
default:
|
||||
Serial.print("??: ");
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ extern void emu_DrawVsync(void);
|
|||
extern void emu_DrawWaitLine(int line);
|
||||
extern int emu_FrameSkip(void);
|
||||
extern void * emu_LineBuffer(int line);
|
||||
extern void emu_tweakVideo(int shiftdelta, int numdelta, int denomdelta);
|
||||
|
||||
extern void emu_InitJoysticks(void);
|
||||
extern int emu_SwapJoysticks(int statusOnly);
|
||||
|
|
|
|||
|
|
@ -584,7 +584,6 @@ static void Audio_CallBack(void *userdata, uint8 *stream, int len)
|
|||
int i;
|
||||
|
||||
uint16 *pBuffer;
|
||||
//len/=2;
|
||||
|
||||
|
||||
/* If there are only some samples missing to have a complete buffer,
|
||||
|
|
@ -602,8 +601,7 @@ static void Audio_CallBack(void *userdata, uint8 *stream, int len)
|
|||
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
*pBuffer++ = ((int)
|
||||
((char)MixBuffer[(CompleteSndBufIdx + i) % MIXBUFFER_SIZE]))*256;
|
||||
*pBuffer++ = ((int)((char)MixBuffer[(CompleteSndBufIdx + i) % MIXBUFFER_SIZE]))*256;
|
||||
}
|
||||
|
||||
/* We should now have generated a complete frame of samples.
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
#define SOUND_FREQ 22050
|
||||
#endif
|
||||
|
||||
#define SOUND_BUFFER_SIZE 1024
|
||||
#define SOUND_BUFFER_SIZE 512 //1024
|
||||
|
||||
void Sound_Reset(void);
|
||||
void Sound_ClearMixBuffer(void);
|
||||
|
|
|
|||
|
|
@ -218,6 +218,13 @@ void * emu_LineBuffer(int line)
|
|||
#endif
|
||||
}
|
||||
|
||||
void emu_tweakVideo(int shiftdelta, int numdelta, int denomdelta) {
|
||||
#ifdef HAS_T4_VGA
|
||||
tft.tweak_video(shiftdelta, numdelta, denomdelta);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// ****************************************************
|
||||
// the setup() method runs once, when the sketch starts
|
||||
// ****************************************************
|
||||
|
|
|
|||
|
|
@ -98,8 +98,8 @@ void Redraw16 ( int row, int vid_adr )
|
|||
}
|
||||
}
|
||||
#ifdef HIRES
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row*2);
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row*2+1);
|
||||
emu_DrawLine16(&line[0], XRES, YRES*2, row*2);
|
||||
emu_DrawLine16(&line[0], XRES, YRES*2, row*2+1);
|
||||
#else
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
|
|
@ -137,8 +137,8 @@ void Redraw16_med ( int row, int vid_adr )
|
|||
}
|
||||
}
|
||||
#ifdef HIRES
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES, row*2);
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES, row*2+1);
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES*2, row*2);
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES*2, row*2+1);
|
||||
#else
|
||||
emu_DrawLine16(&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
|
|
@ -167,7 +167,7 @@ void Redraw16_hi ( int row, int vid_adr )
|
|||
}
|
||||
}
|
||||
#ifdef HIRES
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES, row*2);
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES*2, row*2);
|
||||
#endif
|
||||
line_o= &line[0];
|
||||
for (col=0; col<40; col++) {
|
||||
|
|
@ -180,7 +180,7 @@ void Redraw16_hi ( int row, int vid_adr )
|
|||
}
|
||||
}
|
||||
#ifdef HIRES
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES, row*2+1);
|
||||
emu_DrawLine16(&line[0], XRES*2, YRES*2, row*2+1);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
|
@ -639,7 +639,7 @@ static void renderScreen(void) {
|
|||
*line_o++ = palmap [ ind ];
|
||||
}
|
||||
}
|
||||
emu_DrawLine8((vga_pixel*)&line[0], XRES*2, YRES, row*2);
|
||||
emu_DrawLine8((vga_pixel*)&line[0], XRES*2, YRES*2, row*2);
|
||||
line_o= (vga_pixel *)&line[0];
|
||||
for (col=0; col<40; col++) {
|
||||
register unsigned short pl0=*line_i++;
|
||||
|
|
@ -648,7 +648,7 @@ static void renderScreen(void) {
|
|||
*line_o++ = palmap [ ind ];
|
||||
}
|
||||
}
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES*2, YRES, row*2+1);
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES*2, YRES*2, row*2+1);
|
||||
#endif
|
||||
}
|
||||
else if (mode==COL2) {
|
||||
|
|
@ -667,8 +667,8 @@ static void renderScreen(void) {
|
|||
}
|
||||
#ifdef HAS_T4_VGA
|
||||
#ifdef HIRES
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES*2, YRES, row*2);
|
||||
emu_CopyLine(XRES*2, YRES, row*2, row*2+1);
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES*2, YRES*2, row*2);
|
||||
emu_CopyLine(XRES*2, YRES*2, row*2, row*2+1);
|
||||
#else
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
|
|
@ -676,7 +676,7 @@ static void renderScreen(void) {
|
|||
emu_DrawLine16(&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
else { // COL4
|
||||
for (col=0; col<20; col++) {
|
||||
register unsigned short pl0=*line_i++,pl1=*line_i++,pl2=*line_i++,pl3=*line_i++;
|
||||
for (bit=15;bit>=0;bit--) {
|
||||
|
|
@ -689,8 +689,8 @@ static void renderScreen(void) {
|
|||
}
|
||||
#ifdef HAS_T4_VGA
|
||||
#ifdef HIRES
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES, YRES, row*2);
|
||||
emu_CopyLine(XRES*2, YRES, row*2, row*2+1);
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES, YRES*2, row*2);
|
||||
emu_CopyLine(XRES*2, YRES*2, row*2, row*2+1);
|
||||
#else
|
||||
emu_DrawLine8((unsigned char*)&line[0], XRES, YRES, row);
|
||||
#endif
|
||||
|
|
@ -926,12 +926,15 @@ void ast_Step(void)
|
|||
{
|
||||
#ifdef DOUBLE_BUFFERING
|
||||
if (vid_shiftmode==MONO) {
|
||||
emu_DrawWaitLine(400);
|
||||
emu_DrawWaitLine(440);
|
||||
emu_tweakVideo(1,0,0);
|
||||
}
|
||||
else if (vid_shiftmode==COL2) {
|
||||
emu_DrawWaitLine(400);
|
||||
emu_DrawWaitLine(440);
|
||||
emu_tweakVideo(1,0,0);
|
||||
} else {
|
||||
emu_DrawWaitLine(400);
|
||||
emu_DrawWaitLine(440);
|
||||
emu_tweakVideo(0,0,0);
|
||||
}
|
||||
renderScreen();
|
||||
#else
|
||||
|
|
|
|||
Loading…
Reference in a new issue