📄 marmdcnv.c
字号:
gSeqID = -1;
gEnable = 0;
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Standby(SINT32 file_id, void* ext_args)
//
// Description : Initialize MIDI Engine
//
// Argument : file_id ... file ID
// ext_args ... NULL
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Standby(SINT32 file_id, void* ext_args)
{
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Standby[%d] \n", file_id));
if ((file_id < 0) || (file_id != gFileID))
{
return (MA3RMDERR_GENERAL);
}
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Seek(SINT32 file_id, UINT32 pos, UINT8 flag, void* ext_args)
//
// Description : No effect
//
// Argument : file_id ... file ID
// pos ... Start point(msec)
// flag ... Wait丂0:No wait丂1: 20[ms] wait
// ext_args ... NULL
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Seek(SINT32 file_id, UINT32 pos, UINT8 flag, void* ext_args)
{
(void)pos;
(void)flag;
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Seek[%d %ld] \n", file_id, pos));
if ((file_id < 0) || (file_id != gFileID))
{
return (MA3RMDERR_GENERAL);
}
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Start(SINT32 file_id, void* ext_args)
//
// Description : No effect
//
// Argument : file_id ... file ID
// ext_args ... NULL
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Start(SINT32 file_id, void* ext_args)
{
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Start[%d] \n", file_id));
if ((file_id < 0) || (file_id != gFileID))
{
return (MA3RMDERR_GENERAL);
}
MaSndDrv_ControlSequencer(gSeqID, 1);
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Stop(SINT32 file_id, void* ext_args)
//
// Description : Stop MIDI Play
//
// Argument : file_id ... file ID
// ext_args ... NULL
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Stop(SINT32 file_id, void* ext_args)
{
UINT8 bCh;
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Stop[%d] \n", file_id));
if ((file_id < 0) || (file_id != gFileID))
{
return (MA3RMDERR_GENERAL);
}
MaSndDrv_ControlSequencer(gSeqID, 0);
for (bCh = 0; bCh < 16; bCh++)
{
MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_ALL_SOUND_OFF, bCh, 0, 0);
}
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_SetShortMsg(SINT32 file_id, UINT32 dwMsg)
//
// Description : Send MIDI short message
//
// Argument : file_id ... file ID
// dwMsg ... MIDI message
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
static SINT32 MaRmdCnv_SetShortMsg(SINT32 file_id, UINT32 dwMsg)
{
UINT8 bMsg1, bMsg2, bMsg3;
UINT8 bCh;
static SINT32 (*MidiMsg[16])(UINT8 bChannel, UINT8 bPara1, UINT8 bPara2) =
{
ErrorFunction, ErrorFunction, ErrorFunction, ErrorFunction,
ErrorFunction, ErrorFunction, ErrorFunction, ErrorFunction,
SendNoteOff, SendNoteOn, NotSupported, SendControl,
SendProgram, NotSupported, SendPitchBend, NotSupported
};
(void)file_id;
MARMDCNV_DBGMSG(("MaRmdCnv_SetShortMsg[%08lX]\n", dwMsg));
if (gEnable == 0) return (MA3RMDERR_NOERROR);
bMsg1 = (UINT8)((dwMsg & 0xf0) >> 4);
bCh = (UINT8)(dwMsg & 0x0f);
bMsg2 = (UINT8)((dwMsg >> 8) & 0x7f);
bMsg3 = (UINT8)((dwMsg >> 16) & 0x7f);
return (MidiMsg[bMsg1](bCh, bMsg2, bMsg3));
}
/*=============================================================================*/
/* Decode7Enc() */
/* */
/* Desc. */
/* 7bit->8bit decoder */
/* Param */
/* none */
/* Return */
/* size of decoded data */
/*=============================================================================*/
static UINT32 Decode7Enc(UINT8* pSrc, UINT32 sSize, UINT8* pDst, UINT32 dSize)
{
UINT32 i, j;
UINT8* sEnd;
UINT8 tag;
i = 0;
sEnd = pSrc + sSize;
while (i < dSize)
{
tag = *(pSrc++);
if (pSrc >= sEnd) break;
for (j = 0; j < 7; j++)
{
tag <<= 1;
pDst[i++] = (UINT8)((tag & 0x80) | *(pSrc++));
if (pSrc >= sEnd) break;
if (i >= dSize) return (i);
}
}
return (i);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_SetLongMsg(SINT32 file_id, UINT8* pMsg, UINT32 dwSize)
//
// Description : Send MIDI Long message
//
// Argument : file_id ... file ID
// pMsg ... pointer to the SysEx meassage
// dwSize ... Size of the message[byte]
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
static SINT32 MaRmdCnv_SetLongMsg(SINT32 file_id, UINT8* pMsg, UINT32 dwSize)
{
SINT32 dwRet;
UINT8 bBk, bPg, bKey;
UINT8 bBl, bPc, bFlg;
UINT32 dwKey, dwAdr, dwRom;
UINT32 dwWsize;
UINT8 bWaveID;
UINT8 bVoice[32];
UINT8 bCh;
(void)file_id;
MARMDCNV_DBGMSG(("MaRmdCnv_SetLongMsg[0x%08lX, %ld] \n", pMsg, dwSize));
dwRet = MA3RMDERR_NOERROR;
if (gEnable == 0) return (MA3RMDERR_NOERROR);
if (dwSize < 6) return (MA3RMDERR_NOERROR);
if (pMsg[0] != 0xf0) return (MA3RMDERR_GENERAL);
if (pMsg[dwSize - 1] != 0xf7) return (MA3RMDERR_GENERAL);
if ((pMsg[1] == 0x7e) &&
(pMsg[2] == 0x7f) &&
(pMsg[3] == 0x09) &&
((pMsg[4] == 0x01) || (pMsg[4] == 0x03)) &&
(dwSize == 6)) return (SendGmOn());
if ((pMsg[1] == 0x7f) &&
(pMsg[2] == 0x7f) &&
(pMsg[3] == 0x04) &&
(pMsg[4] == 0x01) &&
(dwSize == 8))
{
gbMasterVolume = pMsg[6] & 0x7f;
SendExpression(0, gbExpression[0]);
for (bCh = 1; bCh < 16; bCh++) SendExpression(bCh, gbExpression[bCh]);
return (MA3RMDERR_NOERROR);
}
if ((pMsg[1] != 0x43) ||
(pMsg[2] != 0x79) ||
(pMsg[3] != 0x06) ||
(pMsg[4] != 0x7f) ||
(dwSize < 8)) return (MA3RMDERR_NOERROR);
switch (pMsg[5])
{
case 0x00: /* Max Gain */
if (dwSize != 8) return (MA3RMDERR_GENERAL);
gbMaxGain = (UINT8)(pMsg[6] & 0x7f);
SendMasterVolume(gbMaxGain);
return (MA3RMDERR_NOERROR);
case 0x10: /* UserEvent */
if (dwSize != 8) return (MA3RMDERR_GENERAL);
if (gCallbackFunc == NULL) return (MA3RMDERR_GENERAL);
return (gCallbackFunc((UINT8)(pMsg[6] & 0x0f)));
case 0x01: /* Set Voice params */
if (dwSize < 31) return (MA3RMDERR_GENERAL);
bBl = (UINT8)(pMsg[7] & 0x7f);
bPc = (UINT8)(pMsg[8] & 0x7f);
bKey = (UINT8)(pMsg[9] & 0x7f);
bFlg = (UINT8)(pMsg[10] + 1);
switch (pMsg[6])
{
case 0x7c:
bBk = (UINT8)(1 + bBl);
bPg = bPc;
break;
case 0x7d:
bBk = (UINT8)(129 + bPc);
bPg = bKey;
break;
default:
return (MA3RMDERR_GENERAL);
}
dwAdr = gRamBase + gRamOffset;
switch (dwSize)
{
case 31: /* WT */
if (bFlg != 2) return (MA3RMDERR_GENERAL);
if ((gRamOffset + 13) > gRamSize) return (MA3RMDERR_NOERROR);
Decode7Enc(&pMsg[11], 19, bVoice, 16);
dwKey = ((UINT32)bVoice[0] << 8) | (UINT32)bVoice[1];
bWaveID = bVoice[15];
if (bWaveID < 128)
{
bVoice[9] = (UINT8)((gWtWaveAdr[bWaveID] >> 8) & 0xff);
bVoice[10] = (UINT8)(gWtWaveAdr[bWaveID] & 0xff);
} else {
dwRom = MaResMgr_GetDefWaveAddress((UINT8)(bWaveID & 0x7f));
if (dwRom <= 0) return (MA3RMDERR_GENERAL);
bVoice[9] = (UINT8)((dwRom >> 8) & 0xff);
bVoice[10] = (UINT8)(dwRom & 0xff);
}
MaDevDrv_SendDirectRamData(dwAdr, ENC_8BIT, &bVoice[2], 13);
dwRet = MaSndDrv_SetVoice(gSeqID, bBk, bPg, bFlg, dwKey, dwAdr);
gRamOffset += 14;
break;
case 32: /* 2-OP FM */
if (bFlg != 1) return (MA3RMDERR_GENERAL);
if ((gRamOffset + 16) > gRamSize) return (MA3RMDERR_NOERROR);
Decode7Enc(&pMsg[11], 20, bVoice, 17);
dwKey = bVoice[0];
MaDevDrv_SendDirectRamData(dwAdr, ENC_8BIT, &bVoice[1], 16);
dwRet = MaSndDrv_SetVoice(gSeqID, bBk, bPg, bFlg, dwKey, dwAdr);
gRamOffset += 16;
break;
case 48: /* 4-OP FM */
if (RMD_DEF_FM_MODE != FM_4OP_MODE) return (MA3RMDERR_GENERAL);
if (bFlg != 1) return (MA3RMDERR_GENERAL);
if ((gRamOffset + 31) > gRamSize) return (MA3RMDERR_NOERROR);
Decode7Enc(&pMsg[11], 36, bVoice, 31);
dwKey = bVoice[0];
MaDevDrv_SendDirectRamData(dwAdr, ENC_8BIT, &bVoice[1], 30);
dwRet = MaSndDrv_SetVoice(gSeqID, bBk, bPg, bFlg, dwKey, dwAdr);
gRamOffset += 30;
break;
default:
return (MA3RMDERR_GENERAL);
}
break;
case 0x03: /* Set Wave */
dwAdr = gRamBase + gRamOffset;
if (dwSize < 10) return (MA3RMDERR_GENERAL);
if (pMsg[dwSize - 1] != 0xf7) return (MA3RMDERR_GENERAL);
dwWsize = dwSize - 9;
dwWsize = (dwWsize >> 3) * 7 + (((dwWsize & 0x07) == 0) ? 0 : ((dwWsize & 0x07)-1));
if ((gRamOffset + dwWsize) > gRamSize) return (MA3RMDERR_NOERROR);
bPc = (UINT8)(pMsg[6] & 0x7f);
bFlg = (UINT8)(pMsg[7] & 0x7f);
dwRet = MaDevDrv_SendDirectRamData(dwAdr, ENC_7BIT, &(pMsg[8]), dwSize - 9);
gRamOffset += ((dwWsize + 1) >> 1) << 1;
gWtWaveAdr[bPc] = dwAdr;
break;
default:
return (MA3RMDERR_NOERROR);
}
return (dwRet);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Control(SINT32 file_id, UINT8 ctrl_num, void* prm, void* ext_args)
//
// Description : Special commands
//
// Argument : file_id ... file ID
// ctrl_num ... Command ID
// prm ... param for the command
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Control(SINT32 file_id, UINT8 ctrl_num, void* prm, void* ext_args)
{
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Control[%d, %d] \n", file_id, ctrl_num));
if ((file_id < 0) || (file_id != gFileID))
{
return (MA3RMDERR_GENERAL);
}
switch(ctrl_num)
{
case MASMW_SET_VOLUME :
return (MaSndDrv_SetVolume(gSeqID, *((UINT8*)prm)));
case MASMW_SEND_MIDIMSG :
return (MaRmdCnv_SetShortMsg(file_id, *((UINT32*)prm)));
case MASMW_SEND_SYSEXMIDIMSG :
return (MaRmdCnv_SetLongMsg(file_id, ((PMASMW_MIDIMSG)prm)->pbMsg, ((PMASMW_MIDIMSG)prm)->dSize));
case MASMW_GET_LENGTH :
return (1000); /* dummy length (1sec)*/
case MASMW_SET_REPEAT :
return (MASMW_SUCCESS); /* dummy func */
case MASMW_GET_CONTROL_VAL:
switch (((PMASMW_GETCTL)prm)->bControl)
{
case 0: /* Master Volume */
return (gbMasterVolume);
case 1: /* Channel Volume */
if (((PMASMW_GETCTL)prm)->bCh >= 16) return (MASMW_ERROR);
return (gbChVolume[((PMASMW_GETCTL)prm)->bCh]);
}
return (MASMW_ERROR);
case MASMW_SET_CB_INTERVAL:
if ((*(UINT8*)prm != 0) && (*(UINT8*)prm != 20)) return (MASMW_ERROR);
gbIntervalTime = *(UINT8*)prm;
return (MASMW_SUCCESS);
}
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Convert(void)
//
// Description : No effect
//
// Argument : none
//
// Return : 1 : Continue
=============================================================================*/
SINT32 MaRmdCnv_Convert(void)
{
if ((gbIntervalTime > 0) && (gCallbackFunc != NULL))
{
gCallbackFunc(RMD_INTERVAL_CB);
}
return (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -