📄 mamidcnv.c
字号:
case 0xD0: /* Channel pressure */
pMt->dwOffset++;
break;
case 0xB0:
switch (pMt->pBase[pMt->dwOffset])
{
case 0x00: /* Bank MSB */
bCmd2 = pMt->pBase[pMt->dwOffset +1];
preBank[bCh] = (UINT16)((preBank[bCh] & 0x00FF) | ((UINT16)bCmd2 << 8));
pMt->dwOffset += 2;
break;
case 0x20: /* Bank LSB */
bCmd2 = pMt->pBase[pMt->dwOffset +1];
preBank[bCh] = (UINT16)((preBank[bCh] & 0xFF00) | ((UINT16)bCmd2));
pMt->dwOffset += 2;
break;
default:
pMt->dwOffset += 2;
break;
}
break;
case 0x90:
if ((gwBank[bCh] & 0xFF00) == 0x7800)
{
gdwDrumVoice4op[pMt->pBase[pMt->dwOffset]] = 1;
pMt->dwOffset += 2;
break;
}
if ((bCh == 9) && ((gwBank[bCh] & 0xFF00) != 0x7900))
{
gdwDrumVoice4op[pMt->pBase[pMt->dwOffset]] = 1;
pMt->dwOffset += 2;
break;
}
gdwMelodyVoice4op[gdwProg[bCh]] = 1;
pMt->dwOffset += 2;
break;
default:
pMt->dwOffset += 2;
}
}
else
{
switch (bCmd)
{
case 0xF0: /* SysEx */
case 0xF7: /* SysEx */
pMt->bSmfCmd = 0;
dwSize = 0;
do
{
bTemp = pMt->pBase[pMt->dwOffset++];
dwSize = (dwSize << 7) + (UINT32)(bTemp & 0x7f);
} while (bTemp >= 0x80);
pMt->dwOffset += dwSize;
break;
case 0xF1: /* System Msg */
case 0xF3: /* System Msg */
pMt->dwOffset++;
break;
case 0xF2: /* System Msg */
pMt->dwOffset += 2;
break;
case 0xF4: /* System Msg */
case 0xF5: /* System Msg */
case 0xF6: /* System Msg */
case 0xF8: /* System Msg */
case 0xF9: /* System Msg */
case 0xFA: /* System Msg */
case 0xFB: /* System Msg */
case 0xFC: /* System Msg */
case 0xFD: /* System Msg */
case 0xFE: /* System Msg */
break;
case 0xFF: /* Meta */
bCmd2 = pMt->pBase[pMt->dwOffset++]; /* Meta Command */
dwSize = 0; /* Size */
do
{
bTemp = pMt->pBase[pMt->dwOffset++];
dwSize = (dwSize << 7) + (UINT32)(bTemp & 0x7f);
} while (bTemp >= 0x80);
switch (bCmd2)
{
case 0x03:
if (dwTr == 0)
{
pI->pTitle = &pMt->pBase[pMt->dwOffset];
pI->dwSizeTitle = dwSize;
}
break;
case 0x02:
pI->pCopyright = &pMt->pBase[pMt->dwOffset];
pI->dwSizeCopyright = dwSize;
break;
case 0x2f: /* End */
dwEndFlag &= ~(1L << dwTr);
break;
case 0x51: /* Set Tempo */
switch (dwSize)
{
case 3:
case 4:
dwTime = ((UINT32)pMt->pBase[pMt->dwOffset] << 16) +
((UINT32)pMt->pBase[pMt->dwOffset + 1] << 8) +
(UINT32)pMt->pBase[pMt->dwOffset + 2];
if ((dwTotalTicks == 0) && (dwTime == 250000)) bSetup |= 0x02;
if (dwTotalTicks == (SINT32)pI->dwTimeResolution) bSetup |= 0x08;
dwTime = (dwTime << 7) / 125;
dwDelta = dwTime / pI->dwTimeResolution;
}
break;
case 0x58: /* Set TimeSignature */
if ((dwTotalTicks == 0) &&
(pMt->pBase[pMt->dwOffset] == 1) &&
(pMt->pBase[pMt->dwOffset + 1] == 2)) bSetup |= 0x01;
if (dwTotalTicks == (SINT32)pI->dwTimeResolution) bSetup |= 0x04;
break;
}
pMt->dwOffset += dwSize;
break;
}
}
GetTrackTime((UINT8)dwTr, pI, &dwEndFlag);
if (bSetup == 0x0B) break;
}
if (bSetup == 0x0B)
{
dwCurrentTime = 0;
pI->bSetupBar = 1;
pI->dwStart = pI->iTrack[0].dwOffset;
} else {
pI->dwTotalTicks = dwTotalTicks;
pI->dwDataEndTime = dwCurrentTime;
MASMFCNV_DBGMSG(("MaMidCnv : GetSMFInfo/ dwTotalTicks = %ld\n", dwTotalTicks));
MASMFCNV_DBGMSG(("MaMidCnv : GetSMFInfo/ dwCurrentTime = %ld\n", dwCurrentTime));
if ((pI->dwDataEndTime >> 10) <= MINIMUM_LENGTH) return (MASMW_ERROR_SHORT_LENGTH);
return (MASMW_SUCCESS);
}
}
/*--- Check Length -----------------------------*/
while (dwEndFlag != 0)
{
dwTr = GetLeastTimeTrack(pI, &dwEndFlag);
if (dwTr < 0) break;
pMt = &(pI->iTrack[dwTr]);
dwTime = pMt->dwTicks - dwTotalTicks;
dwCurrentTime += dwTime * dwDelta;
dwTotalTicks = pMt->dwTicks;
if (dwCurrentTime < 0)
{
MASMFCNV_DBGMSG(("MaMidCnv : GetSMFInfo Error/ CT2=%ld, %ld, %ld, %ld\n", dwCurrentTime, dwTime, dwDelta, dwTr));
return (MASMW_ERROR_LONG_LENGTH);
}
bCmd = pMt->pBase[pMt->dwOffset++];
if (bCmd < 0xf0)
{
bCh = (UINT8)(bCmd & 0x0F);
/*--- MidiMsg ---*/
if (bCmd < 0x80)
{
bCmd = pMt->bSmfCmd;
if (bCmd < 0x80) return (MASMW_ERROR_SMF_CMD);
pMt->dwOffset--;
bCh = (UINT8)(bCmd & 0x0F);
} else {
if (bCmd < 0xf8) pMt->bSmfCmd = bCmd;
}
switch (bCmd & 0xf0)
{
case 0xC0: /* Program change */
gwBank[bCh] = (UINT16)preBank[bCh];
gdwProg[bCh] = pMt->pBase[pMt->dwOffset];
pMt->dwOffset++;
break;
case 0xD0: /* Channel pressure */
pMt->dwOffset++;
break;
case 0xB0:
switch (pMt->pBase[pMt->dwOffset])
{
case 0x00: /* Bank MSB */
bCmd2 = pMt->pBase[pMt->dwOffset +1];
preBank[bCh] = (UINT16)((preBank[bCh] & 0x00FF) | ((UINT16)bCmd2 << 8));
pMt->dwOffset += 2;
break;
case 0x20: /* Bank LSB */
bCmd2 = pMt->pBase[pMt->dwOffset +1];
preBank[bCh] = (UINT16)((preBank[bCh] & 0xFF00) | ((UINT16)bCmd2));
pMt->dwOffset += 2;
break;
default:
pMt->dwOffset += 2;
break;
}
break;
case 0x90:
if ((gwBank[bCh] & 0xFF00) == 0x7800)
{
gdwDrumVoice4op[pMt->pBase[pMt->dwOffset]] = 1;
pMt->dwOffset += 2;
break;
}
if ((bCh == 9) && ((gwBank[bCh] & 0xFF00) != 0x7900))
{
gdwDrumVoice4op[pMt->pBase[pMt->dwOffset]] = 1;
pMt->dwOffset += 2;
break;
}
gdwMelodyVoice4op[gdwProg[bCh]] = 1;
pMt->dwOffset += 2;
break;
default:
pMt->dwOffset += 2;
}
}
else
{
switch (bCmd)
{
case 0xF0: /* SysEx */
case 0xF7: /* SysEx */
pMt->bSmfCmd = 0;
dwSize = 0;
do
{
bTemp = pMt->pBase[pMt->dwOffset++];
dwSize = (dwSize << 7) + (UINT32)(bTemp & 0x7f);
} while (bTemp >= 0x80);
pMt->dwOffset += dwSize;
break;
case 0xF1: /* System Msg */
case 0xF3: /* System Msg */
pMt->dwOffset++;
break;
case 0xF2: /* System Msg */
pMt->dwOffset += 2;
break;
case 0xF4: /* System Msg */
case 0xF5: /* System Msg */
case 0xF6: /* System Msg */
case 0xF8: /* System Msg */
case 0xF9: /* System Msg */
case 0xFA: /* System Msg */
case 0xFB: /* System Msg */
case 0xFC: /* System Msg */
case 0xFD: /* System Msg */
case 0xFE: /* System Msg */
break;
case 0xFF: /* Meta */
bCmd2 = pMt->pBase[pMt->dwOffset++]; /* Meta Command */
dwSize = 0; /* Size */
do
{
bTemp = pMt->pBase[pMt->dwOffset++];
dwSize = (dwSize << 7) + (UINT32)(bTemp & 0x7f);
} while (bTemp >= 0x80);
switch (bCmd2)
{
case 0x03:
pI->pTitle = &pMt->pBase[pMt->dwOffset];
pI->dwSizeTitle = dwSize;
break;
case 0x02:
pI->pCopyright = &pMt->pBase[pMt->dwOffset];
pI->dwSizeCopyright = dwSize;
break;
case 0x2f: /* End */
dwEndFlag &= ~(1L << dwTr);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -