📄 mammfcnv.c
字号:
Led_State.code = 0xFF;
Led_State.tag[0] = 'L';
Led_State.tag[1] = '2';
Led_State.buf = &i;
Led_State.size = 1;
ret = MaMmfCnv_Control(1, MASMW_GET_CONTENTSDATA, &Led_State, 0);
if (ret == 1) {
i = (UINT8)(i & 0x0F);
if (i <= 0x0B)
wLed = (UINT16)(1 << i);
if (i == 0x0C)
wLed = 0x000F;
if (i == 0x0D)
wLed = 0x00F0;
if (i == 0x0E)
wLed = 0x0F00;
if (i == 0x0F)
bAudio_LED = 0x01;
}
for (j = 1; j < 5; j++) {
if (Smaf_Info[1].ScoreTrack[j].pMTR == 0)
continue;
i = Smaf_Info[1].ScoreTrack[j].pMTR[4];
if (i & 0x40)
wMotor |= (UINT16)(0x0001 << ((j - 1)* 4));
if (i & 0x04)
wMotor |= (UINT16)(0x0002 << ((j - 1)* 4));
i = Smaf_Info[1].ScoreTrack[j].pMTR[5];
if (i & 0x40)
wMotor |= (UINT16)(0x0004 << ((j - 1)* 4));
if (i & 0x04)
wMotor |= (UINT16)(0x0008 << ((j - 1)* 4));
}
for (i = 0; i < 16; i++) {
if (wLed & (1 << i))
ChInfo[i].bLed = 1;
else
ChInfo[i].bLed = 0;
if (wMotor & (1 << i))
ChInfo[i].bMotor = 1;
else
ChInfo[i].bMotor = 0;
}
}
/*******************************************************************************
Name : Stream2
Description : Regist PCM Data
Parameter : Nothing
Return : Nothing
*******************************************************************************/
static void Stream2( void )
{
UINT8 i, bKeyNo;
bKeyNo = 0;
for (i = 0; i < 62; i++) {
if (Wave_Info2[i].pWave == 0)
continue;
MaSndDrv_SetStream(MmfSeqID, bKeyNo, 0, Wave_Info2[i].dwSR,
Wave_Info2[i].pWave, Wave_Info2[i].dwWaveSize);
Wave_Info2[i].bKeyNo = bKeyNo;
bKeyNo ++;
if (bKeyNo >= 32)
break;
}
for (i = (UINT8)(i + 1); i < 62; i++)
Wave_Info2[i].pWave = 0;
}
/*******************************************************************************
Name : Get_Param_MA1
Description : Set Voice Parameter (MA-1)
Parameter : UINT8 bCount ... Voice #
: UINT8 *pBuf ... Pointer to Voice Parameter
Return : 0 ... Success
: !0 ... Error
*******************************************************************************/
static SINT8 Get_Param_MA1(
UINT8 bCount,
UINT8 *pBuf
)
{
UINT8 i, j;
UINT8 bBuf[16];
UINT8 bBO, bML, bVIB, bEGT, bSUS, bRR, bDR, bAR, bSL, bTL, bWAV, bFL;
UINT8 bSR;
if (pBuf[0] & 0xF8)
return F_FALSE;
bBO = (UINT8)(pBuf[3] & 0x03);
bBuf[0] = (UINT8)(bBO | 0x80); /* Panpot, BO */
bBuf[1] = 0x80; /* LFO, PE, ALG */
i = j = 0;
while ( i < 5) {
bML = (UINT8)((pBuf[4+i] >> 5) & 0x07);
bVIB = (UINT8)((pBuf[4+i] >> 4) & 0x01);
bEGT = (UINT8)((pBuf[4+i] >> 3) & 0x01);
bSUS = (UINT8)((pBuf[4+i] >> 2) & 0x01);
bRR = (UINT8)( ((pBuf[4+i] & 0x03) << 2) | ((pBuf[5+i] >> 6) & 0x03) );
bDR = (UINT8)((pBuf[5+i] >> 2) & 0x0F);
bAR = (UINT8)( ((pBuf[5+i] & 0x03) << 2) | ((pBuf[6+i] >> 6) & 0x03) );
bSL = (UINT8)((pBuf[6+i] >> 2) & 0x0F);
bTL = (UINT8)( ((pBuf[6+i] & 0x03) << 4) | ((pBuf[7+i] >> 4) & 0x0F) );
bWAV = (UINT8)((pBuf[7+i] >> 3) & 0x01);
bFL = (UINT8)(pBuf[7+i] & 0x07);
if (bEGT == 0) {
bSR = TableD[bRR];
if (bSUS == 0)
bRR = 8;
else
bRR = TableD[bRR];
}
else {
bSR = 0;
if (bSUS == 0)
bRR = TableD[bRR];
else
bRR = 5;
}
if (i != 0)
bFL = 0;
bDR = TableD[bDR];
bAR = TableA[bAR];
bBuf[2+j] = (UINT8)( (bSR << 4) & 0xF0);
bBuf[3+j] = (UINT8)( ((bRR << 4) & 0xF0) + (bDR & 0x0F) );
bBuf[4+j] = (UINT8)( ((bAR << 4) & 0xF0) + (bSL & 0x0F) );
bBuf[5+j] = (UINT8)( (bTL << 2) & 0xFC);
bBuf[6+j] = (UINT8)( (bVIB & 0x01) + 0x04);
bBuf[7+j] = (UINT8)( (bML << 4) & 0xF0);
bBuf[8+j] = (UINT8)( ((bWAV << 3) & 0xF8) + (bFL & 0x07) );
i += 4;
j += 7;
}
Voice_Info[bCount].bBank = pBuf[1];
Voice_Info[bCount].bProg = (UINT8)(pBuf[2] & 0x7F);
if ((dwRamAdr % 2) && (dwRamSize != 0)) {
dwRamAdr ++;
dwRamSize --;
}
if (dwRamSize < 16)
return F_FALSE;
MaDevDrv_SendDirectRamData(dwRamAdr, 0, bBuf, 16);
MaSndDrv_SetVoice(MmfSeqID, 1, bCount, 1, 0, dwRamAdr);
dwRamAdr += 16;
dwRamSize -= 16;
return F_TRUE;
}
/*******************************************************************************
Name : Get_Param_MA2
Description : Set Voice Parameter (MA-2)
Parameter : UINT8 bCount ... Voice #
: UINT8 *pBuf ... Pointer to Voice Parameter
Return : 0 ... Success
: !0 ... Error
*******************************************************************************/
static SINT8 Get_Param_MA2(
UINT8 bCount,
UINT8 *pBuf
)
{
UINT8 i, j, bOperator, bSize;
UINT8 bBuf[30];
UINT8 bLFO, bFB, bALG, bBO, bML, bVIB, bEGT, bSUS, bKSR, bRR, bDR, bAR;
UINT8 bSL, bTL, bKSL, bDVB, bDAM, bAM, bWS;
UINT8 bSR;
if (pBuf[0] & 0xF0)
return F_FALSE;
bLFO = (UINT8)((pBuf[3] >> 6) & 0x03);
bFB = (UINT8)((pBuf[3] >> 3) & 0x07);
bALG = (UINT8)(pBuf[3] & 0x07);
bBO = (UINT8)(pBuf[4] & 0x03);
bBuf[0] = (UINT8)(bBO | 0x80);
bBuf[1] = (UINT8)( ((bLFO << 6) & 0xC0) + (bALG & 0x07) );
if (bALG >= 2) {
bOperator = 4;
bSize = 30;
}
else {
bOperator = 2;
bSize = 16;
}
i = j = 0;
while (bOperator != 0) {
bML = (UINT8)((pBuf[5+i] >> 4) & 0x0F);
bVIB = (UINT8)((pBuf[5+i] >> 3) & 0x01);
bEGT = (UINT8)((pBuf[5+i] >> 2) & 0x01);
bSUS = (UINT8)((pBuf[5+i] >> 1) & 0x01);
bKSR = (UINT8)( pBuf[5+i] & 0x01);
bRR = (UINT8)((pBuf[6+i] >> 4) & 0x0F);
bDR = (UINT8)( pBuf[6+i] & 0x0F);
bAR = (UINT8)((pBuf[7+i] >> 4) & 0x0F);
bSL = (UINT8)( pBuf[7+i] & 0x0F);
bTL = (UINT8)((pBuf[8+i] >> 2) & 0x3F);
bKSL = (UINT8)( pBuf[8+i] & 0x03);
bDVB = (UINT8)((pBuf[9+i] >> 6) & 0x03);
bDAM = (UINT8)((pBuf[9+i] >> 4) & 0x03);
bAM = (UINT8)((pBuf[9+i] >> 3) & 0x01);
bWS = (UINT8)( pBuf[9+i] & 0x07);
if (bEGT == 0)
bSR = bRR;
else
bSR = 0;
if (bSUS != 0)
bRR = 4;
bBuf[2+j] = (UINT8)( ((bSR << 4) & 0xF0) + (bKSR & 0x01) );
bBuf[3+j] = (UINT8)( ((bRR << 4) & 0xF0) + (bDR & 0x0F) );
bBuf[4+j] = (UINT8)( ((bAR << 4) & 0xF0) + (bSL & 0x0F) );
bBuf[5+j] = (UINT8)( ((bTL << 2) & 0xFC) + (bKSL & 0x03) );
bBuf[6+j] = (UINT8)( ((bDAM << 5) & 0x60) + ((bAM << 4) & 0x10) +
((bDVB << 1) & 0x06) + (bVIB & 0x01) );
bBuf[7+j] = (UINT8)((bML << 4) & 0xF0);
bBuf[8+j] = (UINT8)( ((bWS << 3) & 0xF8) + (bFB & 0x07) );
i += 5;
j += 7;
bOperator --;
bFB = 0;
}
Voice_Info[bCount].bBank = pBuf[1];
Voice_Info[bCount].bProg = (UINT8)(pBuf[2] & 0x7F);
if ((dwRamAdr % 2) && (dwRamSize != 0)) {
dwRamAdr ++;
dwRamSize --;
}
if (dwRamSize < bSize)
return F_FALSE;
MaDevDrv_SendDirectRamData(dwRamAdr, 0, bBuf, bSize);
MaSndDrv_SetVoice(MmfSeqID, 1, bCount, 1, 0, dwRamAdr);
dwRamAdr += bSize;
dwRamSize -= bSize;
return F_TRUE;
}
/*******************************************************************************
Name : Set_Voice2
Description : Set Voice Parameter
Parameter : Nothing
Return : Nothing
*******************************************************************************/
static void Set_Voice2( void )
{
UINT8 i, bVoiceCount;
UINT8 *pBuf;
SINT8 ret;
UINT32 dwSize, index;
for (i = 0; i < 16; i++) {
Voice_Info[i].bBank = 0xFF;
Voice_Info[i].bProg = 0xFF;
}
bVoiceCount = 0;
for (i = 0; i < 5; i++) {
if ((Smaf_Info[1].ScoreTrack[i].pMTR == 0) ||
(Smaf_Info[1].ScoreTrack[i].pSetup == 0))
continue;
index = 0;
pBuf = Smaf_Info[1].ScoreTrack[i].pSetup;
dwSize = Smaf_Info[1].ScoreTrack[i].dwSetupSize;
while (dwSize >= (index + 21)) {
if ((pBuf[index] != 0xFF) || (pBuf[index+1] != 0xF0) ||
(pBuf[index+2] <= 0x11) || (pBuf[index+3] != 0x43) ||
(pBuf[index+4] <= 0x01) || (pBuf[index+4] >= 0x04)) {
index += (pBuf[index+2] + 3);
continue;
}
if (pBuf[index+4] == 0x02)
ret = Get_Param_MA1(bVoiceCount, &pBuf[index+5]);
else
ret = Get_Param_MA2(bVoiceCount, &pBuf[index+5]);
if (ret == F_TRUE)
bVoiceCount ++;
if (bVoiceCount >= 16)
return;
index += (pBuf[index+2] + 3);
} /* while (dwSize >= (index + 21)) : Mtsu Search */
} /* for (i = 0; i < 5; i++) : All MTR Search */
}
/*******************************************************************************
Name : Standby2
Description : Standby Process (Set voice param)
Parameter : Nothing
Return : Nothing
*******************************************************************************/
static void Standby2( void )
{
UINT8 i, j;
UINT16 wKeyCon;
wKeyCon = 0;
if (Smaf_Info[1].bSmafType == SMAF_TYPE_MA1) {
#if MA13_KCS_IGNORE
wKeyCon = 15;
#else
i = Smaf_Info[1].ScoreTrack[0].pMTR[4];
if (i & 0x80)
wKeyCon += 1;
if (i & 0x08)
wKeyCon += 2;
i = Smaf_Info[1].ScoreTrack[0].pMTR[5];
if (i & 0x80)
wKeyCon += 4;
if (i & 0x08)
wKeyCon += 8;
#endif
}
else {
if (Smaf_Info[1].AudioTrack.pATR != 0)
Stream2(); /* Entry Stream Data */
for (j = 1; j < 5; j++) {
if (Smaf_Info[1].ScoreTrack[j].pMTR == 0)
continue;
i = Smaf_Info[1].ScoreTrack[j].pMTR[4];
if (i & 0x80)
wKeyCon |= (UINT16)(0x0001 << ((j - 1)* 4));
if (i & 0x08)
wKeyCon |= (UINT16)(0x0002 << ((j - 1)* 4));
i = Smaf_Info[1].ScoreTrack[j].pMTR[5];
if (i & 0x80)
wKeyCon |= (UINT16)(0x0004 << ((j - 1)* 4));
if (i & 0x08)
wKeyCon |= (UINT16)(0x0008 << ((j - 1)* 4));
}
}
Set_Voice2(); /* Entry Set Up Data */
for (i = 0; i < 16; i++) {
if (wKeyCon & (1 << i))
MaSndDrv_SetKeyControl(MmfSeqID, i, 2);
else
MaSndDrv_SetKeyControl(MmfSeqID, i, 1);
}
}
/*******************************************************************************
Name : Note_ON2
Description : Note ON Process (MA-1/2)
Parameter : UINT8 ch ... Channel Number
: UINT8 key
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -