📄 marmdcnv.c
字号:
/*==============================================================================
// Function Name : SINT32 DataEntryMSB(UINT8 bCh, UINT8 bVal)
//
// Description : Send BendRange message
//
// Argument : bCh ... #Channel(0..15)
// bVal ... data(0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 DataEntryMSB(UINT8 bCh, UINT8 bVal)
{
MARMDCNV_DBGMSG(("DataEntryMSB[%d] = %d\n", bCh, bVal));
if (gwRPN[bCh] != 0) return (MA3RMDERR_NOERROR);
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_BEND_RANGE, (UINT32)bCh, (UINT32)bVal, 0));
}
/*==============================================================================
// Function Name : SINT32 SendAllSoundOff(UINT8 bCh)
//
// Description : Send AllSoundOff message
//
// Argument : bCh ... #Channel(0..15)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendAllSoundOff(UINT8 bCh)
{
MARMDCNV_DBGMSG(("SendAllSoundOff[%d] \n", bCh));
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_ALL_SOUND_OFF, (UINT32)bCh, 0, 0));
}
/*==============================================================================
// Function Name : SINT32 SendAllNoteOff(UINT8 bCh)
//
// Description : Message AllNoteOff message
//
// Argument : bCh ... #Channel(0..15)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendAllNoteOff(UINT8 bCh)
{
MARMDCNV_DBGMSG(("SendAllNoteOff[%d] \n", bCh));
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_ALL_NOTE_OFF, (UINT32)bCh, 0, 0));
}
/*==============================================================================
// Function Name : SINT32 SendResetAllCtl(UINT8 bCh)
//
// Description : Send ResetAllControllers message
//
// Argument : bCh ... #Channel(0..15)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendResetAllCtl(UINT8 bCh)
{
MARMDCNV_DBGMSG(("SendResetAllCtl[%d] \n", bCh));
gwRPN[bCh] = 0x7F7F;
gbExpression[bCh] = 127;
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_RESET_ALL_CONTROLLERS, (UINT32)bCh, 0, 0));
}
/*==============================================================================
// Function Name : SINT32 SendMonoOn(UINT8 bCh, UINT8 bVal)
//
// Description : Send MonoOn message
//
// Argument : bCh ... #Channel(0..15)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendMonoOn(UINT8 bCh, UINT8 bVal)
{
MARMDCNV_DBGMSG(("SendMonoOn[%d] \n", bCh));
if (bVal != 1) return (MA3RMDERR_NOERROR);
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_MONO_MODE_ON, (UINT32)bCh, 0, 0));
}
/*==============================================================================
// Function Name : SINT32 SendPolyOn(UINT8 bCh, UINT8 bVal)
//
// Description : Send PolyOn message
//
// Argument : bCh ... #Channel(0..15)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendPolyOn(UINT8 bCh, UINT8 bVal)
{
MARMDCNV_DBGMSG(("SendPolyOn[%d] \n", bCh));
if (bVal != 0) return (MA3RMDERR_NOERROR);
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_POLY_MODE_ON, (UINT32)bCh, 0, 0));
}
/*==============================================================================
// Function Name : SINT32 SendControl(UINT8 bCh, UNIT8 bMsg2, UINT8 bMsg3)
//
// Description : Control messages
//
// Argument : bCh ... #Channel(0..15)
// bMsg2 ... Param-1
// bMsg3 ... Param-2
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendControl(UINT8 bCh, UINT8 bMsg2, UINT8 bMsg3)
{
MARMDCNV_DBGMSG(("SendControl[%d, %d, %d] \n", bCh, bMsg2, bMsg3));
switch (bMsg2)
{
case 0x00: /* Bank select(MSB) */
gwBank[bCh] = (UINT16)((gwBank[bCh] & 0x00FF) | ((UINT16)bMsg3 << 8));
break;
case 0x20: /* Bank select (LSB) */
gwBank[bCh] = (UINT16)((gwBank[bCh] & 0xFF00) | ((UINT16)bMsg3));
break;
case 0x01:
return (SendModDepth(bCh, bMsg3));
case 0x06:
return (DataEntryMSB(bCh, bMsg3));
case 0x07:
return (SendChVol(bCh, bMsg3));
case 0x0A:
return (SendPanpot(bCh, bMsg3));
case 0x0B:
return (SendExpression(bCh, bMsg3));
case 0x40:
return (SendHold1(bCh, bMsg3));
case 0x62: /* NRPN (LSB) */
case 0x63: /* NRPN (MSB) */
gwRPN[bCh] |= 0x8000;
break;
case 0x64: /* RPN (LSB) */
gwRPN[bCh] = (UINT16)((gwRPN[bCh] & 0x7F00) | ((UINT16)bMsg3));
break;
case 0x65: /* RPN (MSB) */
gwRPN[bCh] = (UINT16)((gwRPN[bCh] & 0x007F) | ((UINT16)bMsg3 << 8));
break;
case 0x78:
return (SendAllSoundOff(bCh));
case 0x7B:
return (SendAllNoteOff(bCh));
case 0x79:
return (SendResetAllCtl(bCh));
case 0x7e:
SendAllNoteOff(bCh);
return (SendMonoOn(bCh,bMsg3));
case 0x7f:
SendAllNoteOff(bCh);
return (SendPolyOn(bCh, bMsg3));
default:
return (MA3RMDERR_NOERROR);
}
return (MA3RMDERR_NOERROR);
}
/*==============================================================================
// Function Name : SINT32 SendPitchBend(UINT8 bCh, UNIT8 bLl, UINT8 bHh)
//
// Description : Send PitchBend message
//
// Argument : bCh ... #Channel(0..15)
// bLl ... Lower 7bit of PitchBend (0..127)
// bHh ... Upper 7bit of PitchBend (0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendPitchBend(UINT8 bCh, UINT8 bLl, UINT8 bHh)
{
MARMDCNV_DBGMSG(("SendPitchBend[%d] = %d\n", bCh, bHh));
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_PITCH_BEND, (UINT32)bCh, (((UINT32)bHh << 7) | ((UINT32)bLl)), 0));
}
/*==============================================================================
// Function Name : SINT32 SendGmOn(void)
//
// Description : Send GM_ON message
//
// Argument : none
//
// Return : 0:NoError丂 <0:僄儔乕僐乕僪
//
==============================================================================*/
static SINT32 SendGmOn(void)
{
UINT8 bCh;
MARMDCNV_DBGMSG(("SendGmOn\n"));
gbMaxGain = MAX_MID_GAIN;
gbMasterVolume = 127;
for (bCh = 0; bCh < 16; bCh++)
{
SendAllSoundOff(bCh);
gwRPN[bCh] = 0x7f7f;
gwBank[bCh] = (bCh == 9) ? 0x7800 : 0x7900;
gbChVolume[bCh] = 100;
gbExpression[bCh] = 127;
}
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_SYSTEM_ON, 0, 0, 0));
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Initialize(void)
//
// Description : Initialize RealtimeMIDI converter
//
// Argument : none
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Initialize(void)
{
UINT8 i;
MARMDCNV_DBGMSG(("MaRmdCnv_Initialize \n"));
gSeqID = -1; /* Sequence ID */
gFileID = -1; /* File ID */
gEnable = 0; /* 0:disabel */
gNumOfLoaded = 0; /* */
gbMaxGain = MAX_MID_GAIN; /* MAX_MID_GAIN[dB] */
gbMasterVolume = 127;
gRamBase = 0;
gRamOffset = 0;
gRamSize = 0;
for (i = 0; i < 128 ; i++) gWtWaveAdr[i] = 0;
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_End(void)
//
// Description : Ending of RealtimeMIDI converter
//
// Argument : none
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_End(void)
{
MARMDCNV_DBGMSG(("MaRmdCnv_End \n"));
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Load(UINT8* file_ptr, UINT32 file_size, UINT8 mode,
// SINT32 (*func)(UINT8 id), void* ext_args)
//
// Description : Load MIDI settings
//
// Argument : file_ptr ... pointer to the data
// file_size ... size fo the data
// mode ... error check (0:No, 1:Yes, 2:Check)
// func ... pointer of rhe callback function
// ext_args ... NULL
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Load(UINT8* file_ptr, UINT32 file_size, UINT8 mode, SINT32 (*func)(UINT8 id), void* ext_args)
{
(void)file_ptr;
(void)file_size;
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Load[%08lX %08lX %02X] \n", file_ptr, file_size, mode));
if (mode > 1) return (MA3RMDERR_NOERROR);
if (gNumOfLoaded > 0) return (MA3RMDERR_GENERAL);
gNumOfLoaded++;
gCallbackFunc = func;
gFileID = gNumOfLoaded;
gbIntervalTime = 0;
return ((SINT32)gFileID);
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Unload(SINT32 file_id, void* ext_args)
//
// Description : Unload MIDI settings
//
// Argument : file_id ... 僨乕僞file ID
// ext_args ... NULL
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Unload(SINT32 file_id, void* ext_args)
{
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Unload[%d] \n", file_id));
if ((file_id < 0) || (file_id != (SINT32)gFileID))
{
return (MA3RMDERR_GENERAL);
}
gNumOfLoaded = 0;
gFileID = -1;
return (MA3RMDERR_NOERROR);
}
/*=============================================================================
// Function Name : MaRmdCnv_Open(SINT32 file_id, UINT16 mode, void* ext_args)
//
// Description : Enable MIDI
//
// Argument : file_id ... file ID
// mode ... 0..16
// ext_args ... NULL
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Open(SINT32 file_id, UINT16 mode, void* ext_args)
{
UINT32 Ram;
UINT32 Size;
(void)mode;
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Open[%d] \n", file_id));
if ((file_id < 0) || (file_id != gFileID))
{
return (MA3RMDERR_GENERAL);
}
gSeqID = MaSndDrv_Create(
(UINT8)MASMW_SEQTYPE_DIRECT,
gbIntervalTime, /* No Timer */
(UINT8)(DRUM_GML1 + /* */
DRUM_NORMAL + /* */
MELODY_NORMAL + /* */
DVA_SIMPLE + /* */
RMD_DEF_FM_MODE), /* */
(UINT8)0, /* */
(UINT8)0, /* Num of Streams */
MaRmdCnv_Convert, /* */
&Ram, /* */
&Size); /* */
MARMDCNV_DBGMSG(("MaRmdCnv_Open/SeqID=%ld \n", gSeqID));
if (gSeqID < 0) return (MA3RMDERR_GENERAL);
gRamBase = Ram;
gRamSize = Size;
gbMaxGain = MAX_MID_GAIN;
gbMasterVolume = 127;
gEnable = 1;
SendMasterVolume(gbMaxGain);
return (SendGmOn());
}
/*=============================================================================
// Function Name : SINT32 MaRmdCnv_Close(SINT32 file_id, void* ext_args)
//
// Description : Disable MIDI
//
// Argument : file_id ... file ID
// ext_args ... NULL
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
SINT32 MaRmdCnv_Close(SINT32 file_id, void* ext_args)
{
UINT8 ch;
(void)ext_args;
MARMDCNV_DBGMSG(("MaRmdCnv_Close[%d] \n", file_id));
if ((file_id < 0) || (file_id != gFileID))
{
return (MA3RMDERR_GENERAL);
}
for (ch = 0; ch < 15; ch++)
{
MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_ALL_SOUND_OFF, ch, 0, 0);
}
MaSndDrv_Free(gSeqID);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -