📄 masnddva.c
字号:
* MASMW_SUCCESS if Success.
* MASMW_ERROR if Error.
****************************************************************************/
SINT32 MaDva_End(void)
{
return (MASMW_SUCCESS);
}
/****************************************************************************
* MaDva_GetAlt3Slot
*
* Description:
* Get Alternate Info form NoteOn List.
* Argument:
* dKey NoteOn Key# (0..127)
* Return:
* 0 or Positive if Success. (Key << 4) + Ch)
* Key = 0..127
* Ch = 0..15
* MASMW_ERROR if Error.
****************************************************************************/
SINT32 MaDva_GetAlt3Slot(UINT32 dKey)
{
SINT32 sdId;
sdId = gpDvaInfo->sdAlt3Map[gbIsAltDrum[dKey & 0x7f]];
return (sdId);
}
/****************************************************************************
* MaDva_GetFmSlot
*
* Description:
* Get new FM slot.
* Argument:
* dCh NoteOn Ch# (0..15)
* dKey NoteOn Key# (0..127)
* dMode NoteOn Mode (0:Mono, 1:Poly, 2:Drum)
* Return:
* 0 or Positive if Success.
*
* 31 14 13.......8 7....6 5......0
* +---------------+----------+------+--------+
* | 0 | OffSlot | Mode | OnSlot |
* +---------------+----------+------+--------+
* OffSlot : WT SLOT#, should be MUTE (0..31)
* Mode : 0: New, 1: Continue, 2:Mute&New
* OnSlot : FM SLOT# (0..31)
*
* MASMW_ERROR if Error.
****************************************************************************/
SINT32 MaDva_GetFmSlot(UINT32 dCh, UINT32 dKey, UINT32 dMode)
{
UINT32 dOnId;
SINT32 sdId;
PCHMAP pCh;
PSLOTINFO pSlot;
sdId = 0;
pCh = &(gpDvaInfo->ChMap[dCh]);
switch (dMode)
{
case 2: /* DVA_DRUM_CH */
if (gbIsAltDrum[dKey] > 0)
{
if (gpDvaInfo->DrumAlt == DVA_MA5_ALT)
{
gpDvaInfo->sdAlt5Map[(gbIsAltDrum[dKey] << 4) + dCh] = (SINT32)((dKey << 4) + dCh);
dKey = gdAltDrumKey[dKey];
}
else
{
gpDvaInfo->sdAlt3Map[gbIsAltDrum[dKey]] = (SINT32)((dKey << 4) + dCh);
}
}
/* fall through */
case 1: /* DVA_POLY_CH */
dOnId = (dKey << 4) + dCh;
if (pCh->Mode == DVA_MONO_CH)
{
if (pCh->sdMonoOn > 0)
{
pCh->sdMonoOn = 0;
if (pCh->MonoSynth == DVA_FM_SYNTH)
{ /* ERROR: Playing MONO.. */
pCh->Mode = (DVACHMODE)dMode;
pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
pSlot->Mode = DVA_POLY_SLOT;
pSlot->dKeyCh = dOnId;
sdId = (SINT32)pSlot->dSlotId;
FmTurnOn(pSlot);
gpDvaInfo->bPolyOnMap[dOnId] = (UINT8)(pSlot->dIndex + DVA_PMAP_FM_ON);
return (sdId);
}
else
{ /* ERROR: Playing WT.. */
pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
sdId = (SINT32)((pSlot->dSlotId << 8) + 0x80);
WtTurnOff(pSlot);
}
}
}
pCh->Mode = (DVACHMODE)dMode;
switch (gpDvaInfo->bPolyOnMap[dOnId] & 0xC0)
{
case DVA_PMAP_FM_ON: /* FM-On */
pSlot = &(gpDvaInfo->FmSlotInfo[gpDvaInfo->bPolyOnMap[dOnId] & DVA_PMAP_NUM]);
sdId = (SINT32)pSlot->dSlotId;
FmTurnOn(pSlot);
return (sdId);
case DVA_PMAP_WT_ON: /* Wt-On */
pSlot= &(gpDvaInfo->WtSlotInfo[gpDvaInfo->bPolyOnMap[dOnId] & DVA_PMAP_NUM]);
sdId = (pSlot->dSlotId << 8) + 0x80;
WtTurnOff(pSlot);
/* fall through */
default: /* Off */
pSlot = gpDvaInfo->pFmSlotTop->pNext;
if (pSlot == gpDvaInfo->pFmSlotOnTop) pSlot = pSlot->pNext;
sdId += pSlot->dSlotId;
if (pSlot->NoteOn == DVA_NOTE_ON)
{
if (pSlot->Mode == DVA_POLY_SLOT)
{
gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ON;
}
else
{
gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
}
}
FmTurnOn(pSlot);
gpDvaInfo->bPolyOnMap[dOnId] = (UINT8)(pSlot->dIndex + DVA_PMAP_FM_ON);
pSlot->dKeyCh = dOnId;
pSlot->Mode = DVA_POLY_SLOT;
return (sdId);
}
break;
default: /* DVA_MONO_CH */
if (pCh->Mode == DVA_MONO_CH)
{
if (pCh->sdMonoOn > 0)
{
if (pCh->MonoSynth == DVA_FM_SYNTH)
{
pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
sdId = pSlot->dSlotId + 0x40;
pCh->sdMonoOn++;
FmTurnOn(pSlot);
return (sdId);
}
else
{ /* ERROR: WT mono */
pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
sdId = (SINT32)((pSlot->dSlotId << 8) + 0x80);
WtTurnOff(pSlot);
}
}
}
dOnId = (dKey << 4) + dCh;
gpDvaInfo->bPolyOnMap[dOnId] = 0;
pSlot = gpDvaInfo->pFmSlotTop->pNext;
if (pSlot == gpDvaInfo->pFmSlotOnTop) pSlot = pSlot->pNext;
sdId += pSlot->dSlotId;
if (pSlot->NoteOn == DVA_NOTE_ON)
{
if (pSlot->Mode == DVA_POLY_SLOT)
{
gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ON;
}
else
{
gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
}
}
pCh->Mode = DVA_MONO_CH;
pCh->MonoSynth = DVA_FM_SYNTH;
pCh->sdMonoOn = 1;
FmTurnOn(pSlot);
pSlot->dKeyCh = dOnId;
pSlot->Mode = DVA_MONO_SLOT;
pCh->dMonoSlot = pSlot->dIndex;
return (sdId);
}
return (MASMW_ERROR);
}
/****************************************************************************
* MaDva_GetWtSlot
*
* Description:
* Get new WT slot.
* Argument:
* dCh NoteOn Ch# (0..15)
* dKey NoteOn Key# (0..127)
* dMode NoteOn Mode (0:Mono, 1:Poly, 2:Drum)
* Return:
* 0 or Positive if Success.
*
* 31 14 13.......8 7....6 5......0
* +---------------+----------+------+--------+
* | 0 | OffSlot | Mode | OnSlot |
* +---------------+----------+------+--------+
* OffSlot : FM SLOT#, should be MUTE (0..31)
* Mode : 0: New, 1: Continue, 2:Mute&New
* OnSlot : WT SLOT# (0..31)
*
* MASMW_ERROR if Error.
****************************************************************************/
SINT32 MaDva_GetWtSlot(UINT32 dCh, UINT32 dKey, UINT32 dMode)
{
UINT32 dOnId;
SINT32 sdId;
PCHMAP pCh;
PSLOTINFO pSlot;
sdId = 0;
pCh = &(gpDvaInfo->ChMap[dCh]);
switch (dMode)
{
case 2: /* DVA_DRUM_CH */
if (gbIsAltDrum[dKey] > 0)
{
if (gpDvaInfo->DrumAlt == DVA_MA5_ALT)
{
gpDvaInfo->sdAlt5Map[(gbIsAltDrum[dKey] << 4) + dCh] = (SINT32)((dKey << 4) + dCh);
dKey = gdAltDrumKey[dKey];
}
else
{
gpDvaInfo->sdAlt3Map[gbIsAltDrum[dKey]] = (SINT32)((dKey << 4) + dCh);
}
}
/* fall through */
case 1: /* DVA_POLY_CH */
dOnId = (dKey << 4) + dCh;
if (pCh->Mode == DVA_MONO_CH)
{
if (pCh->sdMonoOn > 0)
{
pCh->sdMonoOn = 0;
if (pCh->MonoSynth == DVA_WT_SYNTH)
{ /* ERROR: Playing MONO.. */
pCh->Mode = (DVACHMODE)dMode;
pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
pSlot->Mode = DVA_POLY_SLOT;
pSlot->dKeyCh = dOnId;
sdId = (SINT32)pSlot->dSlotId;
WtTurnOn(pSlot);
gpDvaInfo->bPolyOnMap[dOnId] = (UINT8)(pSlot->dIndex + DVA_PMAP_WT_ON);
return (sdId);
}
else
{ /* ERROR: Playing FM.. */
pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
sdId = (SINT32)((pSlot->dSlotId << 8) + 0x80);
FmTurnOff(pSlot);
}
}
}
pCh->Mode = (DVACHMODE)dMode;
switch (gpDvaInfo->bPolyOnMap[dOnId] & 0xC0)
{
case DVA_PMAP_WT_ON: /* WT-On */
pSlot = &(gpDvaInfo->WtSlotInfo[gpDvaInfo->bPolyOnMap[dOnId] & DVA_PMAP_NUM]);
sdId = (SINT32)pSlot->dSlotId;
WtTurnOn(pSlot);
return (sdId);
case DVA_PMAP_FM_ON: /* FM-On */
pSlot= &(gpDvaInfo->FmSlotInfo[gpDvaInfo->bPolyOnMap[dOnId] & DVA_PMAP_NUM]);
sdId = (pSlot->dSlotId << 8) + 0x80;
FmTurnOff(pSlot);
/* fall through */
default: /* Off */
pSlot = gpDvaInfo->pWtSlotTop->pNext;
if (pSlot == gpDvaInfo->pWtSlotOnTop) pSlot = pSlot->pNext;
sdId += pSlot->dSlotId;
if (pSlot->NoteOn == DVA_NOTE_ON)
{
if (pSlot->Mode == DVA_POLY_SLOT)
{
gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ON;
}
else
{
gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
}
}
gpDvaInfo->bPolyOnMap[dOnId] = (UINT8)(pSlot->dIndex + DVA_PMAP_WT_ON);
WtTurnOn(pSlot);
pSlot->dKeyCh = dOnId;
pSlot->Mode = DVA_POLY_SLOT;
return (sdId);
}
default: /* DVA_MONO_CH */
if (pCh->Mode == DVA_MONO_CH)
{
if (pCh->sdMonoOn > 0)
{
if (pCh->MonoSynth == DVA_WT_SYNTH)
{
pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
sdId = pSlot->dSlotId + 0x40;
pCh->sdMonoOn++;
FmTurnOn(pSlot);
return (sdId);
}
else
{ /* ERROR: FM mono */
pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
sdId = (SINT32)((pSlot->dSlotId << 8) + 0x80);
FmTurnOff(pSlot);
}
}
}
dOnId = (dKey << 4) + dCh;
gpDvaInfo->bPolyOnMap[dOnId] = 0;
pSlot = gpDvaInfo->pWtSlotTop->pNext;
if (pSlot == gpDvaInfo->pWtSlotOnTop) pSlot = pSlot->pNext;
sdId += pSlot->dSlotId;
if (pSlot->NoteOn == DVA_NOTE_ON)
{
if (pSlot->Mode == DVA_POLY_SLOT)
{
gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ON;
}
else
{
gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
}
}
pCh->Mode = DVA_MONO_CH;
pCh->MonoSynth = DVA_WT_SYNTH;
pCh->sdMonoOn = 1;
pSlot->dKeyCh = dOnId;
WtTurnOn(pSlot);
pSlot->Mode = DVA_MONO_SLOT;
pCh->dMonoSlot = pSlot->dIndex;
return (sdId);
}
return (MASMW_ERROR);
}
/****************************************************************************
* MaDva_GetStreamSlot
*
* Description:
* Get new STREAM slot.
* Argument:
* dCh NoteOn Ch# (0..15)
* dKey NoteOn Key# (0..31)
* dMode NoteOn Mode (0:MONO, 1:STEREO)
* Return:
* 0 or 1 STREAM SLOT# (0..1)
* MASMW_ERROR if Error.
****************************************************************************/
SINT32 MaDva_GetStreamSlot(UINT32 dCh, UINT32 dKey, UINT32 dMode)
{
UINT32 dOnId;
SINT32 sdId;
PSTREAMINFO pSlot;
sdId = 0;
dOnId = (dKey << 4) + dCh;
switch (gpDvaInfo->dStreamNum)
{
case 2:
if (dMode == 0)
{ /* MONO */
sdId = gpDvaInfo->dStreamNextID;
pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
pSlot->dIndex = dOnId;
pSlot->NoteOn = DVA_STREAM_ON;
pSlot->Stereo = DVA_MONO_STREAM;
gpDvaInfo->dStreamNextID = (1L - sdId);
return (sdId);
}
else
{ /* STEREO */
sdId = 0;
pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
pSlot->dIndex = dOnId;
pSlot->NoteOn = DVA_STREAM_ON;
pSlot->Stereo = DVA_STEREO_STREAM;
gpDvaInfo->StreamSlotInfo[1].NoteOn = DVA_STREAM_OFF;
gpDvaInfo->dStreamNextID = 0;
return (sdId);
}
break;
case 1:
if (dMode == 0)
{ /* MONO */
sdId = 0;
pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
pSlot->dIndex = dOnId;
pSlot->NoteOn = DVA_STREAM_ON;
pSlot->Stereo = DVA_MONO_STREAM;
return (sdId);
}
else
{ /*STEREO */
sdId = 0;
pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
pSlot->dIndex = dOnId;
pSlot->NoteOn = DVA_STREAM_ON;
pSlot->Stereo = DVA_STEREO_STREAM;
return (sdId);
}
break;
}
return (MASMW_ERROR);
}
/****************************************************************************
* MaDva_ReleaseSlot
*
* Description:
* Release slot.
* Argument:
* dCh NoteOff Ch# (0..15)
* dKey NoteOff Key# (0..127)
* Return:
* 0 or Positive SLOT MAP
*
* 31....................6 5 4.......0
* +-----------------------+-------+---------+
* | 0 | Synth | OffSlot |
* +-----------------------+-------+---------+
* Synth : 0: FM, 1: WT
* OnSlot : SLOT# (0..31)
*
* MASMW_ERROR if Error.
****************************************************************************/
SINT32 MaDva_ReleaseSlot(UINT32 dCh, UINT32 dKey)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -