📄 masnddva.c
字号:
UINT32 dOffId;
SINT32 sdId;
PCHMAP pCh;
PSLOTINFO pSlot;
UINT8* pbIx;
UINT32 dOrgId;
sdId = 0;
pCh = &(gpDvaInfo->ChMap[dCh]);
switch (pCh->Mode)
{
case DVA_DRUM_CH:
if (gpDvaInfo->DrumAlt == DVA_MA5_ALT)
{
dOrgId = (gbIsAltDrum[dKey] << 4) + dCh;
if (dOrgId > 16)
{
if (gpDvaInfo->sdAlt5Map[dOrgId] != (SINT32)((dKey << 4) + dCh))
{
return (MASMW_ERROR); /* Nothing to be OFF */
}
}
dKey = gdAltDrumKey[dKey];
dOffId = (dKey << 4) + dCh;
pbIx = &(gpDvaInfo->bPolyOnMap[dOffId]);
if ((*pbIx & DVA_PMAP_ONOFF) == DVA_PMAP_OFF)
{
return (MASMW_ERROR);
}
gpDvaInfo->sdAlt5Map[dOrgId] = -1;
}
else
{
dOffId = (dKey << 4) + dCh;
pbIx = &(gpDvaInfo->bPolyOnMap[dOffId]);
if ((*pbIx & DVA_PMAP_ONOFF) == DVA_PMAP_OFF)
{
return (MASMW_ERROR);
}
if (gbIsAltDrum[dKey] > 0) gpDvaInfo->sdAlt3Map[gbIsAltDrum[dKey]] = -1;
}
*pbIx &= ~DVA_PMAP_ON;
if ((*pbIx & DVA_PMAP_SYNTH) == DVA_PMAP_FM)
{
pSlot = &(gpDvaInfo->FmSlotInfo[*pbIx & DVA_PMAP_NUM]);
sdId = (SINT32)pSlot->dSlotId;
FmTurnOff(pSlot);
return (sdId);
}
else
{
pSlot = &(gpDvaInfo->WtSlotInfo[*pbIx & DVA_PMAP_NUM]);
sdId = (SINT32)pSlot->dSlotId + 32;
WtTurnOff(pSlot);
return (sdId);
}
break;
case DVA_POLY_CH:
dOffId = (dKey << 4) + dCh;
pbIx = &(gpDvaInfo->bPolyOnMap[dOffId]);
if ((*pbIx & DVA_PMAP_ONOFF) == DVA_PMAP_OFF)
{
return (MASMW_ERROR);
}
*pbIx &= ~DVA_PMAP_ON;
if ((*pbIx & DVA_PMAP_SYNTH) == DVA_PMAP_FM)
{
pSlot = &(gpDvaInfo->FmSlotInfo[*pbIx & DVA_PMAP_NUM]);
sdId = (SINT32)pSlot->dSlotId;
FmTurnOff(pSlot);
return (sdId);
}
else
{
pSlot = &(gpDvaInfo->WtSlotInfo[*pbIx & DVA_PMAP_NUM]);
sdId = (SINT32)pSlot->dSlotId + 32;
WtTurnOff(pSlot);
return (sdId);
}
break;
default: /* DVA_MONO_CH */
if (pCh->sdMonoOn <= 0)
{
return (MASMW_ERROR); /* Nothing to be OFF */
}
pCh->sdMonoOn--;
if (pCh->sdMonoOn > 0) return (MASMW_ERROR); /* Contine */
if (pCh->MonoSynth == DVA_FM_SYNTH)
{
pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
sdId = (SINT32)pSlot->dSlotId;
FmTurnOff(pSlot);
return (sdId);
}
else
{
pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
sdId = (SINT32)pSlot->dSlotId + 32;
WtTurnOff(pSlot);
return (sdId);
}
}
return (MASMW_ERROR);
}
/****************************************************************************
* MaDva_ReleaseFmOnSlot
*
* Description:
* Release FM slot which is ON.
* Argument:
* dCh NoteOff Ch# (0..15)
* Return:
* FM-SLOT Off Map
*
* 31 ................. 1 0
* +-------+---------------------+------+------+
* | FM#31 | | FM#1 | FM#0 |
* +-------+---------------------+------+------+
* FM#n : 0: none, 1: OFF
*
* MASMW_ERROR if Error.
****************************************************************************/
UINT32 MaDva_ReleaseFmOnSlot(UINT32 dCh)
{
UINT32 dOffMap;
PSLOTINFO pSlot;
PSLOTINFO pNext;
UINT32 dIndex;
dOffMap = 0;
pSlot = gpDvaInfo->pFmSlotOnTop->pNext;
while (pSlot != gpDvaInfo->pFmSlotBottom)
{
pNext = pSlot->pNext;
if ((pSlot->dKeyCh & 0x0F) == dCh)
{
switch (pSlot->Mode)
{
case DVA_POLY_SLOT:
gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ONOFF;
if (gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].Mode == DVA_DRUM_CH)
{
dIndex = gbIsAltDrum[(pSlot->dKeyCh >> 4) & 0x7F];
gpDvaInfo->sdAlt3Map[dIndex] = -1;
gpDvaInfo->sdAlt5Map[(dIndex << 4) + (pSlot->dKeyCh & 0x0F)] = -1;
}
FmTurnOff(pSlot);
break;
default: /* DVA_MONO_SLOT */
gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
FmTurnOff(pSlot);
}
dOffMap |= (1L << pSlot->dSlotId);
}
pSlot = pNext;
}
return (dOffMap);
}
/****************************************************************************
* MaDva_ReleaseWtOnSlot
*
* Description:
* Release WT slot which is ON.
* Argument:
* dCh NoteOff Ch# (0..15)
* Return:
* WT-SLOT Off Map
*
* 31 ................. 1 0
* +-------+---------------------+------+------+
* | WT#31 | | WT#1 | WT#0 |
* +-------+---------------------+------+------+
* WT#n : 0: none, 1: OFF
****************************************************************************/
UINT32 MaDva_ReleaseWtOnSlot(UINT32 dCh)
{
UINT32 dOffMap;
PSLOTINFO pSlot;
PSLOTINFO pNext;
UINT32 dIndex;
dOffMap = 0;
pSlot = gpDvaInfo->pWtSlotOnTop->pNext;
while (pSlot != gpDvaInfo->pWtSlotBottom)
{
pNext = pSlot->pNext;
if ((pSlot->dKeyCh & 0x0F) == dCh)
{
switch (pSlot->Mode)
{
case DVA_POLY_SLOT:
gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ONOFF;
if (gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].Mode == DVA_DRUM_CH)
{
dIndex = gbIsAltDrum[(pSlot->dKeyCh >> 4) & 0x7F];
gpDvaInfo->sdAlt3Map[dIndex] = -1;
gpDvaInfo->sdAlt5Map[(dIndex << 4) + (pSlot->dKeyCh & 0x0F)] = -1;
}
WtTurnOff(pSlot);
break;
default: /* DVA_MONO_SLOT */
gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
WtTurnOff(pSlot);
}
dOffMap |= (1L << pSlot->dSlotId);
}
pSlot = pNext;
}
return (dOffMap);
}
/****************************************************************************
* MaDva_ReleaseFmAllSlot
*
* Description:
* Release FM slot.
* Argument:
* dCh Mute Ch# (0..15)
* Return:
* FM-SLOT Off Map
*
* 31 ................. 1 0
* +-------+---------------------+------+------+
* | FM#31 | | FM#1 | FM#0 |
* +-------+---------------------+------+------+
* FM#n : 0: none, 1: OFF
****************************************************************************/
UINT32 MaDva_ReleaseFmAllSlot(UINT32 dCh)
{
UINT32 dOffMap;
PSLOTINFO pSlot;
PSLOTINFO pNext;
UINT32 dIndex;
dOffMap = 0;
pSlot = gpDvaInfo->pFmSlotTop->pNext;
if (pSlot == gpDvaInfo->pFmSlotOnTop) pSlot = pSlot->pNext;
while (pSlot != gpDvaInfo->pFmSlotBottom)
{
pNext = pSlot->pNext;
if (pNext == gpDvaInfo->pFmSlotOnTop) pNext = pNext->pNext;
if ((pSlot->dKeyCh & 0x0F) == dCh)
{
if (pSlot->NoteOn != DVA_NOTE_MUTE)
{
switch (pSlot->Mode)
{
case DVA_POLY_SLOT:
gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ONOFF;
if (gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].Mode == DVA_DRUM_CH)
{
dIndex = gbIsAltDrum[(pSlot->dKeyCh >> 4) & 0x7F];
gpDvaInfo->sdAlt3Map[dIndex] = -1;
gpDvaInfo->sdAlt5Map[(dIndex << 4) + (pSlot->dKeyCh & 0x0F)] = -1;
}
FmMute(pSlot);
break;
default: /* DVA_MONO_SLOT */
gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
FmMute(pSlot);
break;
}
dOffMap |= (1L << pSlot->dSlotId);
}
}
pSlot = pNext;
}
return (dOffMap);
}
/****************************************************************************
* MaDva_ReleaseWtAllSlot
*
* Description:
* Release WT slot.
* Argument:
* dCh Mute Ch# (0..15)
* Return:
* WT-SLOT Off Map
*
* 31 ................. 1 0
* +-------+---------------------+------+------+
* | WT#31 | | WT#1 | WT#0 |
* +-------+---------------------+------+------+
* WT#n : 0: none, 1: OFF
****************************************************************************/
UINT32 MaDva_ReleaseWtAllSlot(UINT32 dCh)
{
UINT32 dOffMap;
PSLOTINFO pSlot;
PSLOTINFO pNext;
UINT32 dIndex;
dOffMap = 0;
pSlot = gpDvaInfo->pWtSlotTop->pNext;
if (pSlot == gpDvaInfo->pWtSlotOnTop) pSlot = pSlot->pNext;
gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
while (pSlot != gpDvaInfo->pWtSlotBottom)
{
pNext = pSlot->pNext;
if (pNext == gpDvaInfo->pWtSlotOnTop) pNext = pNext->pNext;
if ((pSlot->dKeyCh & 0x0F) == dCh)
{
if (pSlot->NoteOn != DVA_NOTE_MUTE)
{
if (pSlot->Mode == DVA_POLY_SLOT)
{
gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= DVA_PMAP_MASK;
if (gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].Mode == DVA_DRUM_CH)
{
dIndex = gbIsAltDrum[(pSlot->dKeyCh >> 4) & 0x7F];
gpDvaInfo->sdAlt3Map[dIndex] = -1;
gpDvaInfo->sdAlt5Map[(dIndex << 4) + (pSlot->dKeyCh & 0x0F)] = -1;
}
}
WtMute(pSlot);
dOffMap |= (1L << pSlot->dSlotId);
}
}
pSlot = pNext;
}
return (dOffMap);
}
/****************************************************************************
* MaDva_ReleaseStreamSlot
*
* Description:
* Release STREAM slot.
* Argument:
* dCh StreamOff Ch# (0..15)
* dKey StreamOff Key# (0..31)
* Return:
* 0..1 Stream Slot#
* MASMW_ERROR if Error.
****************************************************************************/
SINT32 MaDva_ReleaseStreamSlot(UINT32 dCh, UINT32 dKey)
{
SINT32 sdId;
UINT32 dOffId;
PSTREAMINFO pSlot;
if (gpDvaInfo->dStreamNum == 0) return (MASMW_ERROR);
dOffId = (dKey << 4) + dCh;
sdId = 0;
pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
if (pSlot->NoteOn == DVA_STREAM_ON)
{
if (pSlot->dIndex == dOffId)
{
pSlot->NoteOn = DVA_STREAM_OFF;
gpDvaInfo->dStreamNextID = (UINT32)sdId;
return (sdId);
}
}
if (gpDvaInfo->dStreamNum == 1) return (MASMW_ERROR);
sdId = 1;
pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
if (pSlot->NoteOn == DVA_STREAM_ON)
{
if (pSlot->dIndex == dOffId)
{
pSlot->NoteOn = DVA_STREAM_OFF;
gpDvaInfo->dStreamNextID = (UINT32)sdId;
return (sdId);
}
}
return (MASMW_ERROR);
}
/****************************************************************************
* MaDva_ReleaseStreamAllSlot
*
* Description:
* Release STREAM slot.
* Argument:
* dCh StreamOff Ch# (0..15)
* Return:
* STREAM-SLOT Off Map
*
* 31 ................. 1 0
* +-----------------------------+------+------+
* | 0 | ST#1 | ST#0 |
* +-----------------------------+------+------+
* STREAM#n : 0: none, 1: OFF
****************************************************************************/
UINT32 MaDva_ReleaseStreamAllSlot(UINT32 dCh)
{
UINT32 dOffMap;
PSTREAMINFO pSlot;
dOffMap = 0;
if (gpDvaInfo->dStreamNum == 0) return (dOffMap);
pSlot = &(gpDvaInfo->StreamSlotInfo[0]);
if (pSlot->NoteOn == DVA_STREAM_ON)
{
if ((pSlot->dIndex & 0x0F) == dCh)
{
pSlot->NoteOn = DVA_STREAM_OFF;
gpDvaInfo->dStreamNextID = 0;
dOffMap = 1;
}
}
if (gpDvaInfo->dStreamNum == 1) return (dOffMap);
pSlot = &(gpDvaInfo->StreamSlotInfo[1]);
if (pSlot->NoteOn == DVA_STREAM_ON)
{
if ((pSlot->dIndex & 0x0F) == dCh)
{
pSlot->NoteOn = DVA_STREAM_OFF;
gpDvaInfo->dStreamNextID = 1;
dOffMap += 2;
}
}
return (dOffMap);
}
/****************************************************************************
* MaDva_GetStreamKey
*
* Description:
* Release STREAM slot.
* Argument:
* dSlot Slot# (0..1)
* Return:
* 0..31 Key
****************************************************************************/
UINT32 MaDva_GetStreamKey(UINT32 dSlot)
{
UINT32 dKey;
dKey = (gpDvaInfo->StreamSlotInfo[dSlot].dIndex >> 4) & 0x1F;
return (dKey);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -