/*--------------------------------------------------------------------------*/
/* Types */
/*--------------------------------------------------------------------------*/
-typedef struct _tagMidChInfo {
- unsigned long dKeyCon; /* 0:Melady, 1:OFF, 2:ON */
- unsigned long dLedSync; /* 0:OFF, 1:ON */
- unsigned long dVibSync; /* 0:OFF, 1:ON */
-} MIDCHINFO, *PMIDCHINFO;
typedef struct _tagTrack {
unsigned long dSmfCmd; /* CMD @ now */
- unsigned long dSize; /* [byte] 0 measns nothing in it. */
- unsigned char *pbBase; /* NULL measns nothing in it. */
+ unsigned long dSize; /* [byte] 0 means nothing in it. */
+ unsigned char *pbBase; /* NULL means nothing in it. */
unsigned long dOffset; /* offset byte */
long sdTicks; /* */
} TRACKINFO, *PTRACKINFO;
unsigned long dSizeCopyright; /* */
unsigned long dNumOfTracks; /* 1..32 */
unsigned long dSmfFormat; /* 0..1 */
- unsigned long dSetupBar; /* 0:No, 1:Yes */
- unsigned long dStart; /* Index after SetupBar */
- unsigned long dVibNoteVoice; /* 0:No, 1:Yes */
long sdTotalTicks; /* Total ticks */
long sdDataEndTime; /* (22.10)[ms] */
struct _tagOrderList *pDoneOrderList;
struct _tagOrderList *pBottomOrderList;
ORDERLIST OrderList[MAX_SMF_TRACKS + 3];
-
- MIDCHINFO ChInfo[16]; /* */
- unsigned long dValid; /* 0:none, 1:Valid */
- unsigned char bVoiceMap[NUM_OF_MAPS][128];/* 0:Empty, 1:Valid */
} MIDINFO, *PMIDINFO;
/*---------------------------------------------------------------------------*/
return true;
}
-static long __AvGetSizeOfFileInfo(void)
+static void __AvMidInfoInit(void)
{
- unsigned long dCmd;
- unsigned long dCmd2;
- unsigned long dSize;
-
- unsigned long dTemp;
- unsigned long dTime;
- unsigned long sdTotalTicks;
- long sdCurrentTime;
- long sdDelta;
- PMIDCHINFO pCh;
- unsigned long dCh;
-
- unsigned long dSetup; /* bit0:beat@0, bit1:tempo@0, bit2:GmOn@0, bit3:tempo@1 */
- PTRACKINFO pMt;
- unsigned long sdTr;
-
- static unsigned long dBank[16];
- static unsigned long dCurrBank[16];
-
- long sdNonConductorTime;
- long sdNonConductorTicks;
- unsigned long dConductorNote;
- dSetup = 0;
- sdTotalTicks = 0;
- sdCurrentTime = 0;
- sdNonConductorTime = 0x7FFFFFFF;
- sdNonConductorTicks = 0;
- dConductorNote = 0;
- sdDelta = (unsigned long)(500 << 10) / gPi->dTimeResolution; /* default=0.5sec */
-
gPi->pbText = NULL;
gPi->dSizeText = 0;
gPi->pbTitle = NULL;
gPi->dSizeTitle = 0;
gPi->pbCopyright = NULL;
gPi->dSizeCopyright = 0;
- gPi->dStart = 0;
- gPi->dSetupBar = 0;
- gPi->dVibNoteVoice = 0;
+}
- for (dCh = 0; dCh < NUM_OF_MAPS; dCh++) {
- for (dTemp = 0; dTemp < 128; dTemp++) {
- gPi->bVoiceMap[dCh][dTemp] = 0;
- }
- }
- gPi->bVoiceMap[MELODY_MAP][0] = 1; /* GM Default Piano */
-
- for (dCh = 0; dCh < 16; dCh++) {
- dBank[dCh] = 0;
- dCurrBank[dCh] = 0;
- pCh = &gPi->ChInfo[dCh];
- pCh->dKeyCon = 0;
- pCh->dVibSync = 0;
- pCh->dLedSync = 0;
- }
+static long __AvGetSizeOfFileInfo(void)
+{
+ unsigned long dCmd;
+ unsigned long dCmd2;
+ unsigned long dSize;
+
+ unsigned long dTemp;
+ unsigned long dTime;
+ unsigned long sdTotalTicks = 0;
+ long sdCurrentTime = 0;
+ long sdDelta = (unsigned long)(500 << 10) / gPi->dTimeResolution; /* default=0.5sec */
+
+ unsigned long dSetup = 0; /* bit0:beat@0, bit1:tempo@0, bit2:GmOn@0, bit3:tempo@1 */
+ PTRACKINFO pMt;
+ unsigned long sdTr;
+
+ long sdNonConductorTime = 0x7FFFFFFF;
+ long sdNonConductorTicks = 0;
+ unsigned long dConductorNote = 0;
+ __AvMidInfoInit();
__AvMidResetTimeInfo();
if (gPi->dSmfFormat != 0)
break;
}
- if (sdTr >= MAX_SMF_TRACKS) {
- debug_error(DEBUG, "__AvGetSizeOfFileInfo: Num of tracks is over MAX track number. !!\n");
- return -1;
- }
+ mm_file_retvm_if_fails(DEBUG, sdTr < MAX_SMF_TRACKS, -1);
pMt = &(gPi->TrackInfo[sdTr]);
- dTime = pMt->sdTicks - sdTotalTicks;
- sdCurrentTime += dTime * sdDelta;
+ sdCurrentTime += (pMt->sdTicks - sdTotalTicks) * sdDelta;
sdTotalTicks = pMt->sdTicks;
if ((sdCurrentTime < 0) || (sdTotalTicks > 0x07FFFFFFL))
return -1;
pMt->dSmfCmd = dCmd;
}
- dCh = dCmd & 0x0f;
-
switch (dCmd & 0xf0) {
case 0x90: /* NoteOn */
/* Conductor Track Note Check */
if (sdTr == 0)
dConductorNote |= 1;
- switch (dCurrBank[dCh] >> 8) {
- case 0x79:
- /* Melody */
- break;
- case 0x78:
- /* Drum */
- gPi->bVoiceMap[DRUM_MAP][pMt->pbBase[pMt->dOffset] & 0x7F] = 1;
- break;
-
- default:
- if (dCh == 9) {
- /* Unknown: default GM Drum */
- gPi->bVoiceMap[DRUM_MAP][pMt->pbBase[pMt->dOffset] & 0x7F] = 1;
- }
- }
pMt->dOffset += 2;
break;
case 0xC0: /* Program change */
- switch (dBank[dCh] >> 8) {
- case 0x79:
- if (dBank[dCh] != 0x7906) {
- /* Melody */
- gPi->bVoiceMap[MELODY_MAP][pMt->pbBase[pMt->dOffset] & 0x7F] = 1;
- } else {
- /* Vibration Note */
- gPi->dVibNoteVoice = 1;
- }
- break;
-
- case 0x78:
- /* Drum */
- break;
-
- default:
- /* default GM Melody */
- if (dCh != 9) {
- gPi->bVoiceMap[MELODY_MAP][pMt->pbBase[pMt->dOffset] & 0x7F] = 1;
- }
- }
-
- dCurrBank[dCh] = dBank[dCh];
- pMt->dOffset++;
- break;
-
+ /* Fall through */
case 0xD0: /* Channel pressure */
pMt->dOffset++;
break;
- case 0xB0: /* Control Change */
- switch (pMt->pbBase[pMt->dOffset]) {
- case 0x00: /* Bank select(MSB) */
- dBank[dCh] = (dBank[dCh] & 0x00FF) | (pMt->pbBase[pMt->dOffset + 1] << 8);
- break;
-
- case 0x20: /* Bank select (LSB) */
- dBank[dCh] = (dBank[dCh] & 0xFF00) | pMt->pbBase[pMt->dOffset + 1];
- break;
- default:
- break;
- }
- pMt->dOffset += 2;
- break;
-
default:
pMt->dOffset += 2;
break;
} else {
switch (dCmd) {
case 0xF0: /* SysEx */
+ /* Fall through */
case 0xF7: /* SysEx */
pMt->dSmfCmd = 0;
dSize = 0;
if (sdTotalTicks == 0) {
dSetup |= 0x04;
}
- } else {
- if (gPi->dSetupBar == 0) {
- if ((dSize == 22) &&
- (pMt->pbBase[pMt->dOffset] == 0x43) &&
- (pMt->pbBase[pMt->dOffset + 1] == 0x79) &&
- (pMt->pbBase[pMt->dOffset + 2] == 0x06) &&
- (pMt->pbBase[pMt->dOffset + 3] == 0x7C) &&
- (pMt->pbBase[pMt->dOffset + 4] == 0x02)) {
- /* Channel status */
- for (dCh = 0; dCh < 16; dCh++) {
- pCh = &gPi->ChInfo[dCh];
- dTemp = pMt->pbBase[pMt->dOffset + 5 + dCh];
- pCh->dKeyCon = (dTemp >> 2) & 0x03;
- pCh->dVibSync = (dTemp >> 1) & 0x01;
- pCh->dLedSync = dTemp & 0x01;
- }
- }
- }
}
pMt->dOffset += dSize;
break;
case 0xF1: /* System Msg */
+ /* Fall through */
case 0xF3: /* System Msg */
pMt->dOffset++;
break;
case 0x51: /* Set Tempo */
switch (dSize) {
case 3:
+ /* Fall through */
case 4:
dTime = ((unsigned long)pMt->pbBase[pMt->dOffset] << 16) +
((unsigned long)pMt->pbBase[pMt->dOffset + 1] << 8) +
(unsigned long)pMt->pbBase[pMt->dOffset + 2];
- if ((sdTotalTicks == 0) && (dTime == 250000)) dSetup |= 0x02;
- if (sdTotalTicks == (unsigned long)gPi->dTimeResolution) dSetup |= 0x08;
+ if ((sdTotalTicks == 0) && (dTime == 250000))
+ dSetup |= 0x02;
+ if (sdTotalTicks == (unsigned long)gPi->dTimeResolution)
+ dSetup |= 0x08;
sdDelta = (unsigned long)(dTime / (gPi->dTimeResolution > 0 ? gPi->dTimeResolution : 1));
break;
if (dSetup == 0x0F) {
dSetup |= 0x10;
sdCurrentTime = 0;
- gPi->dSetupBar = 1;
- gPi->dStart = gPi->TrackInfo[0].dOffset;
}
}
gPi->sdDataEndTime = sdNonConductorTime;
}
- if (gPi->dSetupBar == 0) {
- for (dCh = 0; dCh < 16; dCh++) {
- pCh = &gPi->ChInfo[dCh];
- pCh->dKeyCon = 0;
- pCh->dVibSync = 0;
- pCh->dLedSync = 0;
- }
- }
if ((gPi->sdDataEndTime >> 10) <= MINIMUM_LENGTH)
return -1;