?? marmdcnv.c
字號:
/****************************************************************************
*
* Copyright (C) 2002-2003 YAMAHA CORPORATION. All rights reserved.
*
* Module : marmdcnv.c
*
* Description : Realtime MIDI/GML Stream Converter Module.
*
* Version : 1.0.3 2003.06.26
*
****************************************************************************/
#include "marmdcnv.h"
/*--------------------------------------------------------------------------*/
/* Defines */
/*--------------------------------------------------------------------------*/
#define RMD_MAX_GAIN 76 /* - 9[dB] */
/* - 6[dB] : 90 */
/* - 9[dB] : 76 */
/* -12[dB] : 64 */
/* -18[dB] : 45 */
#define RMD_INTERVAL_CB (17)
#define ENC_8BIT (0)
#define ENC_7BIT (1)
#define MAX_NUM_OF_WAVES (32)
#define MODE_DRUM (0x00) /* GMX */
/*--------------------------------------------------------------------------*/
/* Types */
/*--------------------------------------------------------------------------*/
typedef struct _MASMW_MIDIMSG
{
UINT8* pbMsg; /* pointer to MIDI message */
UINT32 dSize; /* size of MIDI message */
} MASMW_MIDIMSG, *PMASMW_MIDIMSG;
typedef struct _MASMW_GETCTL
{
UINT8 bControl; /* contorl number */
UINT8 bCh; /* channel number */
} MASMW_GETCTL, *PMASMW_GETCTL;
typedef struct _tagRmdGlobals
{
SINT32 (*pfnCallbackFunc)(UINT8 bId); /* */
SINT32 sdSeqID; /* Sequence ID */
SINT32 sdFileID; /* File ID */
UINT32 dOpend; /* 0:Closed, 1:Opend */
UINT32 dNumOfLoaded; /* */
UINT32 dIntervalTime; /* 0 or 20[ms] */
UINT32 dMaxGain; /* MaxGain (0..127) */
UINT32 dMasterVolume; /* MasterVolume (0..127) */
UINT32 dRamBase; /* */
UINT32 dRamOffset; /* */
UINT32 dRamSize; /* */
UINT32 dBankTable[16]; /* 0..0x7F7F */
UINT32 dRPNTable[16]; /* 0..0xFF7F */
UINT32 dChVolumeTable[16]; /* 0..127 */
UINT32 dExpressionTable[16]; /* 0..127 */
UINT32 dFineTune[16]; /* 0..0x3FFF */
UINT32 dWtAdrTable[MAX_NUM_OF_WAVES]; /* */
} RMDGLOBAL, *PRMDGLOBAL;
/*--------------------------------------------------------------------------*/
/* Consts */
/*--------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Globals */
/*---------------------------------------------------------------------------*/
static RMDGLOBAL gRmdInfo;
static PRMDGLOBAL gpRmdInfo;
/*---------------------------------------------------------------------------*/
/* Functions (internal use only) */
/*---------------------------------------------------------------------------*/
/****************************************************************************
* SendMasterVolume(UINT32 dVol)
*
* Description
* Send SetMasterVolume message
* Param
* dVol Master volume (0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendMasterVolume(UINT32 dVol)
{
if (gpRmdInfo->sdSeqID > 0)
{
MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_MASTER_VOLUME, dVol, 0, 0);
}
return (MASMW_SUCCESS);
}
/****************************************************************************
* ErrorFunction(UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
*
* Description
* Invalid messages
*
* Param
* dCh MIDI channel (0..15)
* dPara1 Undefined
* dPara2 Undefined
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 ErrorFunction(UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
{
(void)dCh;
(void)dPara1;
(void)dPara2;
MARMDCNV_DBGMSG(("ErrorFunction\n"));
return (MASMW_ERROR_ARGUMENT);
}
/****************************************************************************
* NotSupported(UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
*
* Description
* Unsupported messages
* Param
* dCh MIDI channel (0..15)
* dPara1 Undefined
* dPara2 Undefined
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 NotSupported(UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
{
(void)dCh;
(void)dPara1;
(void)dPara2;
MARMDCNV_DBGMSG(("NotSupported\n"));
return (MASMW_SUCCESS);
}
/****************************************************************************
* SendNoteOff(UINT32 dCh, UNIT32 dKey, UINT32 dVel)
*
* Description
* Send NoteOff message
* Param
* dCh ... #Channel(0..15)
* dKey ... #Key (0..127)
* dVel ... Velocity (0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendNoteOff(UINT32 dCh, UINT32 dKey, UINT32 dVel)
{
(void)dVel;
MARMDCNV_DBGMSG(("SendNoteOff[%ld, %ld] \n", dCh, dKey));
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_NOTE_OFF, dCh, dKey, 0));
}
/****************************************************************************
* SendNoteOn(UINT32 dCh, UINT32 dKey, UINT32 dVel)
*
* Description
* Send NoteOn message
* Param
* dCh ... #Channel(0..15)
* dKey ... #Key (0..127)
* dVel ... Velocity (0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendNoteOn(UINT32 dCh, UINT32 dKey, UINT32 dVel)
{
if (dVel == 0) return(SendNoteOff(dCh, dKey, dVel));
MARMDCNV_DBGMSG(("SendNoteOn[%ld, %ld, %ld]\n", dCh, dKey, dVel));
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_NOTE_ON, dCh, dKey, dVel));
}
/****************************************************************************
* SendProgram(UINT32 dCh, UNIT32 dProg, UINT32 dPara2)
*
* Description
* Send Program message
* Param
* dCh ... #Channel(0..15)
* dProg ... #Program(0..127)
* dPara2
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendProgram(UINT32 dCh, UINT32 dProg, UINT32 dPara2)
{
UINT8 bBk, bPg;
UINT32 dBb;
UINT8 bPp;
static const UINT8 bMBank[128] =
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
(void)dPara2;
MARMDCNV_DBGMSG(("SendProgram[%ld] = %ld\n", dCh, dProg));
bPp = (UINT8)(dProg & 0x7f);
dBb = gpRmdInfo->dBankTable[dCh];
switch (dBb)
{
case 0x7900: /* Melody */
bBk = 0;
bPg = bPp;
break;
case 0x7800: /* Drum */
bBk = 128;
bPg = 0;
break;
default: /* Unknown : default GM */
switch (dBb >> 8)
{
case 0x79: /* Default Melody */
bBk = 0;
bPg = bPp;
break;
case 0x7C: /* Ex Melody */
bBk = (UINT8)(bMBank[dBb & 0x7F]);
bPg = bPp;
break;
case 0x7D: /* Ex Drum */
bBk = (UINT8)(128 + bMBank[bPp]);
bPg = 0;
break;
default:
if (dCh == 9)
{
bBk = 128;
bPg = 0;
} else {
bBk = 0;
bPg = bPp;
}
}
}
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_PROGRAM_CHANGE, dCh, (UINT32)bBk, (UINT32)bPg));
}
/****************************************************************************
* SendModDepth(UINT32 dCh, UINT32 dMod)
*
* Description
* Send SetModulation message
* Param
* dCh ... #Channel(0..15)
* dMod ... Modulation(0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendModDepth(UINT32 dCh, UINT32 dMod)
{
static const UINT8 bModTable[128] =
{
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
};
MARMDCNV_DBGMSG(("SendModDepth[%ld] = %ld\n", dCh, dMod));
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_MODULATION_DEPTH, dCh, (UINT32)bModTable[dMod], 0));
}
/****************************************************************************
* SendChVol(UINT32 dCh, UINT32 dVol)
*
* Description
* Send ChannelVolume message
* Param
* dCh ... #Channel(0..15)
* dVol ... Volume(0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendChVol(UINT32 dCh, UINT32 dVol)
{
MARMDCNV_DBGMSG(("SendChVol[%ld] = %ld\n", dCh, dVol));
gpRmdInfo->dChVolumeTable[dCh] = dVol;
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_CHANNEL_VOLUME, dCh, dVol, 0));
}
/****************************************************************************
* SendExpression(UINT32 dCh, UINT32 dVol)
*
* Description
* Send Expression message
* Param
* dCh ... #Channel(0..15)
* dVol ... Volume(0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendExpression(UINT32 dCh, UINT32 dVol)
{
UINT32 dMix;
MARMDCNV_DBGMSG(("SendExpression[%ld] = %ld\n", dCh, dVol));
gpRmdInfo->dExpressionTable[dCh] = dVol;
dMix = MaSndDrv_Mix40LogVol(dVol, gpRmdInfo->dMasterVolume);
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_EXPRESSION, dCh, dMix, 0));
}
/****************************************************************************
* SendPanpot(UINT32 dCh, UINT32 dPan)
*
* Description
* Send Panpot message
* Param
* dCh ... #Channel(0..15)
* bPan ... Panpot(0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendPanpot(UINT32 dCh, UINT32 dPan)
{
MARMDCNV_DBGMSG(("SendPanpot[%ld] = %ld\n", dCh, dPan));
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_PANPOT, dCh, dPan, 0));
}
/****************************************************************************
* SendHold1(UINT32 dCh, UINT32 dVal)
*
* Description
* Send Hold1 message
* Param
* dCh ... #Channel(0..15)
* dVal ... Hold1(0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 SendHold1(UINT32 dCh, UINT32 dVal)
{
MARMDCNV_DBGMSG(("SendHold1[%ld] = %ld\n", dCh, dVal));
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_HOLD1, dCh, (UINT32)((dVal < 64) ? 0 : 1), 0));
}
/****************************************************************************
* DataEntryMSB(UINT32 dCh, UINT32 dVal)
*
* Description
* Send RPN message
* Param
* dCh ... #Channel(0..15)
* dVal ... data(0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 DataEntryMSB(UINT32 dCh, UINT32 dVal)
{
MARMDCNV_DBGMSG(("DataEntryMSB[%ld] = %ld\n", dCh, dVal));
dVal &= 0x7f;
switch (gpRmdInfo->dRPNTable[dCh])
{
case 0: /* BendSens */
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_BEND_RANGE, dCh, dVal, 0));
case 1: /* FineTune */
gpRmdInfo->dFineTune[dCh] = dVal << 7;
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_FINE_TUNE, dCh, gpRmdInfo->dFineTune[dCh], 0));
break;
case 2: /* CoaseTune */
return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_COASE_TUNE, dCh, dVal, 0));
break;
}
return (MASMW_SUCCESS);
}
/****************************************************************************
* DataEntryLSB(UINT32 dCh, UINT32 dVal)
*
* Description
* Send RPN message
* Param
* dCh ... #Channel(0..15)
* dVal ... data(0..127)
* Return
* 0 : NoError, < 0 : Error
****************************************************************************/
static SINT32 DataEntryLSB(UINT32 dCh, UINT32 dVal)
{
MARMDCNV_DBGMSG(("DataEntryLSB[%ld] = %ld\n", dCh, dVal));
switch (gpRmdInfo->dRPNTable[dCh])
{
case 1: /* FineTune */
gpRmdInfo->dFineTune[dCh] &= 0x3F80;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -