?? marmdcnv.c
字號:
/*==============================================================================
// Copyright (C) 2001-2003 YAMAHA CORPORATION
//
// Title : MARMDCNV.C
//
// Description : MA-3 Realtime MIDI/GML Stream Converter Module.
//
// Version : 1.5.2.0
//
// History :
// May 8, 2001 1st try.
// July 16, 2001 Fix warnings.
// July 18, 2001 Add #BankMSB = 0x78/0x79.
// July 24, 2001 Fix MidVolTable.
// July 31, 2001 Change MonoModeOn message.
// September 18, 2001 Set MAX_MID_GAIN = -9[dB].
// Nobember 2, 2001 Change NoteOn(vel=0) => NoteOff().
// May 15, 2002 Add MasterVolume(Universal SysEx).
//============================================================================*/
#include "marmdcnv.h"
#define MAX_MID_GAIN 76 /* - 9[dB] : 76 */
/* -12[dB] : 64 */
/* -18[dB] : 45 */
#define RMD_INTERVAL_CB 17
#define DVA_NORMAL 0
#define DVA_SIMPLE 2
#define DVA_MONO 4
#define DRUM_NORMAL 0
#define DRUM_SIMPLE 1
#define MELODY_NORMAL 0
#define MELODY_SIMPLE 8
#define DRUM_GML1 0x20
#define ENC_8BIT 0
#define ENC_7BIT 1
typedef struct _MASMW_GETCTL
{
UINT8 bControl; /* contorl number */
UINT8 bCh; /* channel number */
} MASMW_GETCTL, *PMASMW_GETCTL;
/*=============================================================================
// gloval values
=============================================================================*/
static const UINT32 gdwDBVolTable[128] = /* -80 * Log(index/127) */
{
192, 168, 144, 130, 120, 112, 106, 101,
96, 92, 88, 85, 82, 79, 77, 74,
72, 70, 68, 66, 64, 63, 61, 59,
58, 56, 55, 54, 53, 51, 50, 49,
48, 47, 46, 45, 44, 43, 42, 41,
40, 39, 38, 38, 37, 36, 35, 35,
34, 33, 32, 32, 31, 30, 30, 29,
28, 28, 27, 27, 26, 25, 25, 24,
24, 23, 23, 22, 22, 21, 21, 20,
20, 19, 19, 18, 18, 17, 17, 16,
16, 16, 15, 15, 14, 14, 14, 13,
13, 12, 12, 12, 11, 11, 10, 10,
10, 9, 9, 9, 8, 8, 8, 7,
7, 7, 6, 6, 6, 5, 5, 5,
4, 4, 4, 3, 3, 3, 3, 2,
2, 2, 1, 1, 1, 1, 0, 0
};
static const UINT32 gdwMidVolTable[193] = /* 127*10^(index / 80) */
{
127, 123, 120, 116, 113, 110, 107, 104,
101, 98, 95, 93, 90, 87, 85, 82,
80, 78, 76, 74, 71, 69, 67, 66,
64, 62, 60, 58, 57, 55, 54, 52,
51, 49, 48, 46, 45, 44, 43, 41,
40, 39, 38, 37, 36, 35, 34, 33,
32, 31, 30, 29, 28, 28, 27, 26,
25, 25, 24, 23, 23, 22, 21, 21,
20, 20, 19, 18, 18, 17, 17, 16,
16, 16, 15, 15, 14, 14, 13, 13,
13, 12, 12, 12, 11, 11, 11, 10,
10, 10, 10, 9, 9, 9, 8, 8,
8, 8, 8, 7, 7, 7, 7, 7,
6, 6, 6, 6, 6, 6, 5, 5,
5, 5, 5, 5, 5, 4, 4, 4,
4, 4, 4, 4, 4, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3,
3, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 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, 1, 1, 1, 1, 1, 1,
0
};
static SINT32 (*gCallbackFunc)(UINT8 id); /* */
static SINT32 gSeqID; /* Sequence ID */
static SINT32 gFileID; /* File ID */
static UINT8 gEnable; /* 0:disabel */
static UINT8 gNumOfLoaded; /* */
static UINT8 gbMaxGain; /* MaxGain */
static UINT8 gbMasterVolume; /* MasterVolume */
static UINT32 gRamBase; /* */
static UINT32 gRamOffset; /* */
static UINT32 gRamSize; /* */
static UINT32 gWtWaveAdr[128]; /* */
static UINT16 gwBank[16];
static UINT16 gwRPN[16];
static UINT8 gbExpression[16];
static UINT8 gbChVolume[16]; /* */
static UINT8 gbIntervalTime; /* 0 or 20[ms] */
/*=============================================================================
// Function Name : SINT32 SendMasterVolume(UINT8 bVol)
//
// Description : Send SetMasterVolume message
//
// Argument : bVol Master volume (0..127)
//
// Return : 0 : NoError, < 0 : Error
=============================================================================*/
static SINT32 SendMasterVolume(UINT8 bVol)
{
if (gSeqID > 0)
{
MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_MASTER_VOLUME, (UINT32)bVol, 0, 0);
}
return (MA3RMDERR_NOERROR);
}
/*==============================================================================
// Function Name : SINT32 ErrorFunction(UINT8 bCh, UINT8 bPara1, UINT8 bPara2)
//
// Description : Invalid messages
//
// Argument : bCh MIDI channel (0..15)
// bPara1 Undefined
// bPara1 Undefined
//
// Return : 0 : NoError, < 0 : Error
//
==============================================================================*/
static SINT32 ErrorFunction(UINT8 bCh, UINT8 bPara1, UINT8 bPara2)
{
(void)bCh;
(void)bPara1;
(void)bPara2;
MARMDCNV_DBGMSG(("ErrorFunction\n"));
return (MA3RMDERR_ARGUMENT);
}
/*==============================================================================
// Function Name : SINT32 NotSupported(UINT8 bCh, UINT8 bPara1, UINT8 bPara2)
//
// Description : Unsupported messages
//
// Argument : bCh MIDI channel (0..15)
// bPara1 Undefined
// bPara1 Undefined
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 NotSupported(UINT8 bCh, UINT8 bPara1, UINT8 bPara2)
{
(void)bCh;
(void)bPara1;
(void)bPara2;
MARMDCNV_DBGMSG(("NotSupported\n"));
return (MA3RMDERR_NOERROR);
}
/*==============================================================================
// Function Name : SINT32 SendNoteOff(UINT8 bCh, UNIT8 bKey, UINT8 bVel)
//
// Description : Send NoteOff message
//
// Argument : bCh ... #Channel(0..15)
// bKey ... #Key (0..127)
// bVel ... Velocity (0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendNoteOff(UINT8 bCh, UINT8 bKey, UINT8 bVel)
{
(void)bVel;
MARMDCNV_DBGMSG(("SendNoteOff[%d, %d] \n", bCh, bKey));
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_NOTE_OFF, (UINT32)bCh, (UINT32)bKey, 0));
}
/*==============================================================================
// Function Name : SINT32 SendNoteOn(UINT8 bCh, UINT8 bKey, UINT8 bVel)
//
// Description : Send NoteOn message
//
// Argument : bCh ... #Channel(0..15)
// bKey ... #Key (0..127)
// bVel ... Velocity (0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendNoteOn(UINT8 bCh, UINT8 bKey, UINT8 bVel)
{
#if !RMD_DEF_VELOCITY_MODE
static const UINT8 VelocityTable[128] =
{
0, 0, 16, 20, 23, 25, 28, 30,
32, 34, 36, 38, 39, 40, 43, 44,
45, 46, 48, 49, 51, 52, 54, 54,
55, 57, 57, 58, 60, 60, 62, 64,
64, 66, 66, 67, 67, 69, 69, 69,
71, 71, 74, 74, 76, 76, 76, 78,
78, 78, 80, 80, 80, 82, 82, 82,
85, 85, 85, 87, 87, 87, 90, 90,
90, 90, 93, 93, 93, 93, 95, 95,
95, 95, 98, 98, 98, 98, 101, 101,
101, 101, 101, 104, 104, 104, 104, 104,
107, 107, 107, 107, 107, 110, 110, 110,
110, 110, 110, 113, 113, 113, 113, 113,
116, 116, 116, 116, 116, 116, 120, 120,
120, 120, 120, 120, 120, 123, 123, 123,
123, 123, 123, 123, 127, 127, 127, 127
};
#endif
if (bVel == 0) return(SendNoteOff(bCh, bKey, bVel));
MARMDCNV_DBGMSG(("SendNoteOn[%d, %d, %d]\n", bCh, bKey, bVel));
#if RMD_DEF_VELOCITY_MODE
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_NOTE_ON, (UINT32)bCh, (UINT32)bKey, (UINT32)bVel));
#else
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_NOTE_ON, (UINT32)bCh, (UINT32)bKey, (UINT32)VelocityTable[bVel & 0x7f]));
#endif
}
/*==============================================================================
// Function Name : SINT32 SendProgram(UINT8 bCh, UNIT8 bProg, UINT8 bPara2)
//
// Description : Send SetProgram message
//
// Argument : bCh ... #Channel(0..15)
// bProg ... #Program(0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendProgram(UINT8 bCh, UINT8 bProg, UINT8 bPara2)
{
UINT8 bBk, bPg;
UINT16 wBb;
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)bPara2;
MARMDCNV_DBGMSG(("SendProgram[%d] = %d\n", bCh, bProg));
bPp = (UINT8)(bProg & 0x7f);
wBb = gwBank[bCh];
if (wBb == 0)
{
if (bCh == 9)
{
bBk = 128;
bPg = 0;
} else {
bBk = 0;
bPg = bPp;
}
} else {
switch (wBb & 0xFF00)
{
case 0x7900: /* Melody */
bBk = 0;
bPg = bPp;
break;
case 0x7800: /* Drum */
bBk = 128;
bPg = 0;
break;
case 0x7C00: /* Melody */
bBk = (UINT8)(bMBank[wBb & 0x7F]);
bPg = bPp;
break;
case 0x7D00: /* Drum */
bBk = (UINT8)(128 + bMBank[bPp]);
bPg = 0;
break;
default:
return (MA3RMDERR_ARGUMENT);
}
}
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_PROGRAM_CHANGE, (UINT32)bCh, (UINT32)bBk, (UINT32)bPg));
}
/*==============================================================================
// Function Name : SINT32 SendModDepth(UINT8 bCh, UINT8 bMod)
//
// Description : Send SetModulation message
//
// Argument : bCh ... #Channel(0..15)
// bMod ... Modulation(0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendModDepth(UINT8 bCh, UINT8 bMod)
{
static const UINT8 ModTable[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[%d] = %d\n", bCh, bMod));
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_MODULATION_DEPTH, (UINT32)bCh, (UINT32)ModTable[bMod], 0));
}
/*==============================================================================
// Function Name : SINT32 SendChVol(UINT8 bCh, UINT8 bVol)
//
// Description : Send ChannelVolume nessage
//
// Argument : bCh ... #Channel(0..15)
// bVol ... Volume(0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendChVol(UINT8 bCh, UINT8 bVol)
{
MARMDCNV_DBGMSG(("SendChVol[%d] = %d\n", bCh, bVol));
gbChVolume[bCh] = bVol;
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_CHANNEL_VOLUME, (UINT32)bCh, (UINT32)bVol, 0));
}
/*==============================================================================
// Function Name : SINT32 SendExpression(UINT8 bCh, UINT8 bVol)
//
// Description : Send Expression message
//
// Argument : bCh ... #Channel(0..15)
// bVol ... Volume(0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendExpression(UINT8 bCh, UINT8 bVol)
{
UINT32 dwVol;
MARMDCNV_DBGMSG(("SendExpression[%d] = %d\n", bCh, bVol));
gbExpression[bCh] = bVol;
dwVol = gdwDBVolTable[bVol & 0x7f] + gdwDBVolTable[gbMasterVolume];
if (dwVol > 192) dwVol = 192;
dwVol = gdwMidVolTable[dwVol];
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_EXPRESSION, (UINT32)bCh, dwVol, 0));
}
/*==============================================================================
// Function Name : SINT32 SendPanpot(UINT8 bCh, UINT8 bPan)
//
// Description : Set Panpot message
//
// Argument : bCh ... #Channel(0..15)
// bPan ... Panpot(0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendPanpot(UINT8 bCh, UINT8 bPan)
{
MARMDCNV_DBGMSG(("SendPanpot[%d] = %d\n", bCh, bPan));
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_PANPOT, (UINT32)bCh, (UINT32)bPan, 0));
}
/*==============================================================================
// Function Name : SINT32 SendHold1(UINT8 bCh, UINT8 bVal)
//
// Description : Send Hold1 message
//
// Argument : bCh ... #Channel(0..15)
// bVal ... Hold1(0..127)
//
// Return : 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32 SendHold1(UINT8 bCh, UINT8 bVal)
{
MARMDCNV_DBGMSG(("SendHold1[%d] = %d\n", bCh, bVal));
return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_HOLD1, (UINT32)bCh, (UINT32)((bVal < 64) ? 0 : 1), 0));
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -