📄 maphrcnv.c
字号:
case 0x82L:
gPhrInfo.sChInfo[dCh].sdOctShift = -2L;
break;
case 0x83L:
gPhrInfo.sChInfo[dCh].sdOctShift = -3L;
break;
case 0x84L:
gPhrInfo.sChInfo[dCh].sdOctShift = -4L;
break;
default: /* reserved */
break;
}
return (0L);
}
/****************************************************************************
* BankSelect
*
* Function:
* Update BankSelect(for LV2).
* Argument:
* dCh #Channel(0..15)
* dBankNo Bank Number(0,1,128,129)
* Return:
* 0 success
*
****************************************************************************/
static SINT32 BankSelect(UINT32 dCh, UINT32 dBankNo)
{
if( (dBankNo == 0x00L) ||
(dBankNo == 0x01L) ||
(dBankNo == 0x80L) ||
(dBankNo == 0x81L)) {
gPhrInfo.sChInfo[dCh].dNewBank = dBankNo;
}
return (0L);
}
/****************************************************************************
* CnvProgramChange
*
* Function:
* Put Program Change to sound driver(for LV1).
* Argument:
* dCh #Channel(0..15)
* dProgNo Program Number(0..127)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvProgramChange(UINT32 dCh, UINT32 dProgNo)
{
UINT32 dPhrCh;
UINT32 dBankNo;
PMALIBVOCINFO pVi;
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
if(dProgNo > 3L) return (0L);
pCi->dProgNo = dProgNo;
dPhrCh = (UINT32)(dCh >> 2);
pVi = &(gPhrInfo.sApiInfo[dPhrCh].sDataInfo.sVocInfo[dProgNo]);
switch(pVi->dBankNo) {
case 0x00L : /* default melody voice */
dBankNo = 0x00L;
dProgNo = pVi->dProgNo;
break;
case 0x01L : /* extend melody voice */
dBankNo = (UINT32)(1L + dPhrCh);
break;
default : /* no voice */
dBankNo = 0x00L;
dProgNo = 0x00L;
break;
}
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L, MASNDDRV_CMD_PROGRAM_CHANGE,
dCh, dBankNo, dProgNo);
return (1L);
}
/****************************************************************************
* CnvProgramChange2
*
* Function:
* Put Program Change to sound driver(for LV2).
* Argument:
* dCh #Channel(0..15)
* dProgNo Program Number(0..127)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvProgramChange2(UINT32 dCh, UINT32 dProgNo)
{
UINT32 dPhrCh;
UINT32 dBankNo;
PMALIBVOCINFO pVi;
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
if(dProgNo > 127L) return (0L);
pCi->dProgNo = dProgNo;
dPhrCh = (UINT32)(dCh >> 2);
switch(pCi->dBankNo) {
case 0x00L : /* default melody voice */
dBankNo = 0x00L;
break;
case 0x01L : /* extend melody voice */
pVi = &(gPhrInfo.sApiInfo[dPhrCh].sDataInfo.sVocInfo[0]);
pVi = GetVoiceInfo(0x01L, dProgNo, pVi);
if(pVi == NULL) { /* not found extend voice */
dBankNo = 0x00L;
dProgNo = 0x00L;
}
else { /* found extend voice */
dBankNo = (UINT32)(0x01L + dPhrCh);
}
break;
case 0x80L : /* default drum voice */
dBankNo = 0x80L;
dProgNo = 0x00L;
break;
case 0x81L : /* extend drum voice */
dBankNo = (UINT32)(0x81L + dPhrCh);
dProgNo = 0x00L;
break;
default :
return (0L);
}
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L, MASNDDRV_CMD_PROGRAM_CHANGE,
dCh, dBankNo, dProgNo);
return (1L);
}
/****************************************************************************
* CnvChannelVolume
*
* Function:
* Put Channel Volume to sound driver.
* Argument:
* dCh #Channel(0..15)
* dVol Volume(0..127)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvChannelVolume(UINT32 dCh, UINT32 dVol)
{
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
if(dVol > 127L) return (0L);
if(pCi->dVolume != dVol) {
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
MASNDDRV_CMD_CHANNEL_VOLUME, dCh, dVol, 0L);
pCi->dVolume = dVol; /* update */
return (1L);
}
return (0L);
}
/****************************************************************************
* CnvModulation
*
* Function:
* Put Modulation Depth to sound driver.
* Argument:
* dCh #Channel(0..15)
* dMod Modulation(0..4)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvModulation(UINT32 dCh, UINT32 dMod)
{
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
if(dMod > 4L) return (0L);
if(pCi->dMod != dMod) {
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
MASNDDRV_CMD_MODULATION_DEPTH, dCh, dMod, 0L);
pCi->dMod = dMod; /* update */
return (1L);
}
return (0L);
}
/****************************************************************************
* CnvExpression
*
* Function:
* Put Expression to sound driver.
* Argument:
* dCh #Channel(0..15)
* dExp Expression(0..127)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvExpression(UINT32 dCh, UINT32 dExp)
{
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
if(dExp > 127L) return (0L);
if(pCi->dExp != dExp) {
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
MASNDDRV_CMD_EXPRESSION, dCh, dExp, 0L);
pCi->dExp = dExp; /* update */
return (1L);
}
return (0L);
}
/****************************************************************************
* CnvPanpot
*
* Function:
* Put Panpot to sound driver.
* Argument:
* dCh #Channel(0..15)
* dPan Panpot(0..127)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvPanpot(UINT32 dCh, UINT32 dPan)
{
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
if(dPan > 127L) return (0L);
if(pCi->dPan != dPan) {
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
MASNDDRV_CMD_PANPOT, dCh, dPan, 0L);
pCi->dPan = dPan; /* update */
return (1L);
}
return (0L);
}
/****************************************************************************
* CnvPitchBendRange
*
* Function:
* Update PitchBend Range.
* Argument:
* dCh #Channel(0..15)
* dRange PitchBend Range(0..24)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 PitchBendRange(UINT32 dCh, UINT32 dRange)
{
if(dRange > 24L) return (0L);
gPhrInfo.sChInfo[dCh].dNewRange = dRange;
return (0L);
}
/****************************************************************************
* CnvPitchBend
*
* Function:
* Put PitchBend to sound driver.
* Argument:
* dCh #Channel(0..15)
* dPitch PitchBend(0..127)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvPitchBend(UINT32 dCh, UINT32 dPitch)
{
SINT32 sdRet = 1L;
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
if(dPitch > 127L) return (0L);
if(pCi->dRange != pCi->dNewRange) {
pCi->dRange = pCi->dNewRange; /* update */
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
MASNDDRV_CMD_BEND_RANGE, dCh, pCi->dRange, 0L);
sdRet++;
}
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
MASNDDRV_CMD_PITCH_BEND, dCh, (UINT32)(dPitch << 7), 0L);
pCi->dPitch = dPitch; /* update */
return (sdRet);
}
/****************************************************************************
* CnvNoteOff
*
* Function:
* Put NoteOff to sound driver.
* Argument:
* dCh #Channel(0..15)
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvNoteOff(UINT32 dCh)
{
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
/*
MAPHRCNV_DBGMSG(("CnvNoteOff[%d] \n", bCh));
*/
if(pCi->dNoteOffTime != 0xFFFFFFFF) {
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
MASNDDRV_CMD_NOTE_OFF_MA2, dCh, pCi->dKey, 0L);
pCi->dNoteOffTime = 0xFFFFFFFF;
return (1L);
}
return (0L);
}
/****************************************************************************
* CnvNoteOn
*
* Function:
* Put NoteOn to sound driver(for LV1).
* Argument:
* dCh #Channel(0..15)
* dOct OctaveShift(0..3)
* dKey Key Number(1..12)
* dNoteOffTime NoteOff time[tick]
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvNoteOn(UINT32 dCh, UINT32 dOct, UINT32 dKey,
UINT32 dNoteOffTime)
{
SINT32 sdKey;
SINT32 sdOct;
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
sdOct = (SINT32)(dOct + pCi->sdOctShift + 3L);
sdKey = (SINT32)((sdOct * 12L) + dKey);
/* Process for when nNote is out of the range (Note[0..127]) */
if(sdKey < 0L) sdKey = 0L;
else if(sdKey > 127L) sdKey = 127L;
/* Velocity 127 fixed */
/*
MAPHRCNV_DBGMSG(("CnvNoteOn[%d %d %02X %08lX] -> [%02X]\n", dCh,
dOct, dKey, dNoteOffTime, dNote));
*/
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
MASNDDRV_CMD_NOTE_ON_MA2, dCh, (UINT32)sdKey, 0x7FL);
pCi->dKey = (UINT32)sdKey;
pCi->dNoteOffTime = dNoteOffTime;
return (1L);
}
/****************************************************************************
* CnvNoteOn
*
* Function:
* Put NoteOn to sound driver(for LV2).
* Argument:
* dCh #Channel(0..15)
* dOct OctaveShift(0..3)
* dKey Key Number(1..12)
* dNoteOffTime NoteOff time[tick]
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvNoteOn2(UINT32 dCh, UINT32 dOct, UINT32 dKey,
UINT32 dNoteOffTime)
{
SINT32 sdKey;
SINT32 sdOct;
PMALIBVOCINFO pVi;
PMAPHRCHINFO pCi = &(gPhrInfo.sChInfo[dCh]);
if((dKey < 1L) || (12L < dKey)) {
pCi->dNoteOffTime = 0xFFFFFFFF;
return (0L);
}
switch(pCi->dBankNo) {
case 0x00L :
case 0x01L : /* default or extend melody voice */
sdOct = (SINT32)(dOct + pCi->sdOctShift + 3L);
sdKey = (SINT32)((sdOct * 12L) + dKey);
if(sdKey < 0L) sdKey = 0L;
else if(127L < sdKey) sdKey = 127L;
break;
case 0x80L : /* default drum voice */
sdKey = (SINT32)(dOct * 12L + dKey + 34L); /* 1..48 -> 35..82 */
break;
case 0x81L : /* extend drum voice */
sdKey = (SINT32)(dOct * 12L + dKey); /* 1..48 */
pVi = &(gPhrInfo.sApiInfo[(dCh >> 2)].sDataInfo.sVocInfo[0]);
pVi = GetVoiceInfo(0x81L, (UINT32)sdKey, pVi);
if(pVi == NULL) { /* not found extend voice */
pCi->dNoteOffTime = 0xFFFFFFFF;
return (0L);
}
break;
default :
pCi->dNoteOffTime = 0xFFFFFFFF;
return (0L);
}
MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L, MASNDDRV_CMD_NOTE_ON_MA2,
dCh, (UINT32)sdKey, pCi->dVelocity);
pCi->dKey = (UINT32)sdKey;
pCi->dNoteOffTime = dNoteOffTime;
return (1L);
}
/****************************************************************************
* CnvExclusiveMessage
*
* Function:
* Interpret the exclusive mesage and
* Put command to sound driver(for LV1).
* Argument:
* dPhrCh Sequence Number(0..3)
* pbExMsg Pointer to exclusive message.
* dSize Size of exlusive message.
* Return:
* Number of put command.
*
****************************************************************************/
static SINT32 CnvExclusiveMessage(UINT32 dPhrCh, UINT8* pbExMsg, UINT32 dSize)
{
UINT32 dCh;
UINT32 dBlkFnum;
SINT32 sdRet;
PMAPHRCHINFO pCi;
MAPHRCNV_DBGMSG(("CnvExclusiveMessage[%d %08lX %08lX] \n",
dPhrCh, pbExMsg, dSize));
if(dSize != 6L) return (0L);
sdRet = 0L;
if( (pbExMsg[0] == 0x43) &&
(pbExMsg[1] == 0x03) &&
(pbExMsg[2] == 0x90) &&
(pbExMsg[5] == 0xF7)) { /* Extend NoteOn/Off */
dCh = (UINT32)((pbExMsg[3] & 0x03) + (dPhrCh << 2));
pCi = &(gPhrInfo.sChInfo[dCh]);
if((pbExMsg[3] & 0xF0) == 0xC0) {
pCi->dExNoteFlag |= 0x02L;
pCi->dRegH = (UINT32)pbExMsg[4];
}
else if((pbExMsg[3] & 0xF0) == 0xB0) {
pCi->dExNoteFlag |= 0x01L;
pCi->dRegL = (UINT32)pbExMsg[4];
}
else {
return (0L);
}
if((pCi->dExNoteFlag & 0x03L) == 0x03L) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -