⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mammfcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:

    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 + -