📄 mammf.c
字号:
break;
case 0x40:
/* Hold 1(dumper) */
printf_uart2("\n Hold1(damper) = 0x%x", ctrl_val);
if (ctrl_val <= 0x3F)
ctrl_val = 0;
else
ctrl_val = 1;
MaSndDrv_Hold1( duration, bChannel, ctrl_val );
break;
case 0x06:
/* Data entry (MSB) */
printf_uart2("\n ");
if ((bRpnM != 0) ||(bRpnL != 0) ||
(ctrl_val> 0x18))
{
MaSndDrv_Nop( duration, 0 );
break;
}
if (ctrl_val == 0)
{
PitchBendFlag |= (0x0001 << bChannel);
MaSndDrv_Nop( duration, 0 );
break;
}
PitchBendFlag &= ~( 0x0001 << bChannel );
MaSndDrv_BendRange( duration, bChannel, ctrl_val );
break;
case 0x26:
/* Data entry (LSB) */
/* ??? */
break;
case 0x64:
/* RPN (LSB) */
bRpnL = ctrl_val;
MaSndDrv_Nop( duration, 0 );
break;
case 0x65:
/* RPN (MSB) */
bRpnM = ctrl_val;
MaSndDrv_Nop( duration, 0 );
break;
case 0x78:
/* All Sound Off */
printf_uart2("\n All Sound Off");
if(ctrl_val == 0)
{
MaSndDrv_AllSoundOff( duration, bChannel);
}
else
MaSndDrv_Nop( duration, 0 );
break;
case 0x79:
/* Reset All Controller */
printf_uart2("\n Reset All Controller!");
if (ctrl_val != 0)
{
MaSndDrv_Nop( duration, 0 );
break;
}
velocity = VelocityTable[64];
MaSndDrv_ResetAllControllers( duration, bChannel );
break;
case 0x7B:
/* All Note Off */
printf_uart2("\n All Note Off!");
if(ctrl_val == 0)
{
/* the same as MaSndDrv_AllSoundOff */
MaSndDrv_AllSoundOff( duration, bChannel);
}
else
MaSndDrv_Nop( duration, 0 );
break;
case 0x7E:
/* Mono mode on */
printf_uart2("\n Mono mode ON !");
MaSndDrv_MonoModeOn( duration, bChannel );
break;
case 0x7F:
/* Poly mode on */
printf_uart2("\n Poly mode ON !");
MaSndDrv_PolyModeOn( duration, bChannel );
break;
default:
break;
}
break;
case 0xF0:
if(bChannel == 0x0F)
{
bData1 = *(pevent+i+j+1) & 0x7F;
if(bData1 == 0x2F)
{
printf_uart2("\nEOS event found! Duration = 0x%x", duration);
MaSndDrv_AllSoundOff_EOS( duration );
/*MaSndDrv_AllSoundOff2( duration );*/
dwMsize = j+3;
}
else
{
printf_uart2("\nNOP event found! Duration = 0x%x", duration);
MaSndDrv_Nop( duration, 0 );
dwMsize = j+2;
}
}
if(bChannel == 0x0)
{
printf_uart2("\nExclusize Message found! Duration = 0x%x ", duration);
dwMsize =*(pevent+i+j+1);
dwMsize += (j+2);
if ((*(pevent+i+j+2) != 0x43) || (*(pevent+i+j+3) != 0x79) ||
(*(pevent+i+j+4) != 0x06) || (*(pevent+i+j+5) != 0x7F))
return ;
bData2 = *(pevent+i+j+6);
switch( bData2 )
{
case 0x00:
master_vol = *(pevent+i+j+7);
printf_uart2("\n MA-3 Master volume Message found! value = 0x%x", master_vol);
MaSndDrv_MasterVolume( duration, master_vol );
break;
case 0x08:
/* MA-3 Stream PCM pair */
break;
case 0x0B:
/* MA-3 Stream PCM wave panpot */
break;
case 0x10:
/* MA-3 interrupt setting */
break;
default:
break;
}
}
break;
default:
break;
}
}
}
u32 get_flex(u8 *pbuf, u8 *p)
{
u8 data;
u32 dwflex;
*p = 1;
data = *pbuf;
dwflex = (u32)(data & 0x7F);
while((*pbuf & 0x80) != 0)
{
*p += 1;
data = *(++pbuf);
dwflex=(dwflex<<7)+(u32)(data & 0x7F);
}
return dwflex;
}
void Decode_7bitData(u8 *p7bit, u32 dw7size, u8 *p8bit, u32 *pdw8size)
{
u8 Msb;
u8 i,j;
*pdw8size = 0;
for(i = 0; i < dw7size/8; i++)
{
Msb = *(p7bit++);
for(j = 1; j < 8; j++)
{
*(p8bit++) = *(p7bit++) | ((Msb << j) & 0x80);
}
*pdw8size += 7;
}
if((dw7size % 8) != 0)
{
Msb = *(p7bit++);
for(i= 1 ; i < dw7size%8; i++)
{
*(p8bit++) = *(p7bit++) + ((Msb << 1) & 0x80);
}
*pdw8size += (dw7size % 8)-1;
}
}
void Set_voice(u8 *buff, u32 dwsize)
{
u8 j;
u8 bBankM, bBankL, bProgNo, bNote, bFlag, bKeyNo;
u32 result;
u32 dwDataSize;
if(dwsize < 6) return ;
bBankM = *buff;
bBankL = *(buff+1);
bProgNo = *(buff+2);
bNote = *(buff+3);
bFlag = *(buff+4);
printf_uart2("\n BankM = 0x%x, BankL = 0x%x, ProgNo = 0x%x, Note = 0x%x, Flag = 0x%x",
bBankM, bBankL, bProgNo, bNote, bFlag);
if(bFlag & 0x01)
{
printf_uart2("\n The following is wave table!");
/* wave table process......... */
}
else
{
printf_uart2("\n The following is FM tone string!");
Decode_7bitData(&buff[5], FM_TONE_SIZE, &buff[5], &dwDataSize);
/* FM process */
printf_uart2("\n");
for(j = 1; j <= dwDataSize; j++)
{
printf_uart2("data%d = 0x%x ", j,*(buff+4+j));
if((j%4)==0) printf_uart2("\n");
}
bKeyNo = (UINT8)(buff[5] & 0x7F);
if((dwRamAdr % 2) && (dwRamSize != 0))
{
dwRamAdr ++;
dwRamSize --;
}
if(dwRamSize < (dwDataSize - 1))
return;
MaDevDrv_SendDirectRamData(dwRamAdr,0,&buff[6],(dwDataSize-1));
if(bBankM == 0x7C)
result = MaSndDrv_SetVoice((UINT8)(bBankL+1), bProgNo, bKeyNo, dwRamAdr);
else
result = MaSndDrv_SetVoice((UINT8)(bProgNo+129), bNote, bKeyNo, dwRamAdr);
if(result != 0)
{
printf_uart2("\nSetVoice failure ! Exit!");
return ;
}
dwRamAdr += (dwDataSize - 1);
dwRamSize -= (dwDataSize - 1);
}
}
void Exclusive_check(u8 *pbuf, u32 dwsize)
{
u8 i,j,k;
u32 dwMsize;
for(i = 0; i < dwsize; i += dwMsize)
{
if(*(pbuf+i) != 0xF0)
{
printf_uart2("\nhead = 0x%x", *(pbuf+i));
printf_uart2("\nExclusive event error ! Exit!");
return ;
}
j = 0;
dwMsize = get_flex(pbuf+i+1, &j);
dwMsize += 2;
k = j+i+1;
if ((*(pbuf+k) != 0x43) || (*(pbuf+k+1) != 0x79) ||
(*(pbuf+k+2) != 0x06) || (*(pbuf+k+3) != 0x7F))
return ;
if(*(pbuf+k+4) == 0x07)
{
printf_uart2("\nStream PCM reserve Event Found!");
bStream = *(pbuf+k+5);
printf_uart2("\n bStream = %x", bStream);
}
}
/* the MaSndDrv initializing Now!!! */
MaSndDrv_Create( timebase, cnvmode, bStream, &dwRamAdr, &dwRamSize );
create_flag = 1;
for(i = 0; i < dwsize; i += dwMsize)
{
if(*(pbuf+i) != 0xF0)
{
printf_uart2("\nhead = 0x%x", *(pbuf+i));
printf_uart2("\nExclusive event error ! Exit!");
return ;
}
j = 0;
dwMsize = get_flex(pbuf+i+1, &j);
dwMsize += 2;
k = j+i+1;
if ((*(pbuf+k) != 0x43) || (*(pbuf+k+1) != 0x79) ||
(*(pbuf+k+2) != 0x06) || (*(pbuf+k+3) != 0x7F))
return ;
switch( *(pbuf+k+4) )
{
case 0x7F:
printf_uart2("\nNative reset Event Found!");
/* This is for deadening all voices and initializing all internal states */
break;
/*
case 0x07:
printf_uart2("\nStream PCM reserve Event Found!");
bStream = *(pbuf+k+5);
printf_uart2("\n bStream = %x", bStream);
break;
*/
case 0x01:
printf_uart2("\nRegister of tone Para Event Found!");
Set_voice(pbuf+k+5, dwMsize);
break;
default:
break;
}
}
}
void MspI_check(u8 *phra, u32 phrasize, u32 *pstart, u32 *pstop)
{
u16 tag;
while( phrasize >= 8 )
{
tag = (u16)((*phra << 8) + *(phra+1));
phra += 3;
switch( tag )
{
case 0x7374:
*pstart = ((u32)*phra << 24) | ((u32)*(phra+1) << 16) |
((u32)*(phra+2) << 8) | ((u32)*(phra+3));
phrasize -= 8;
break;
case 0x7370:
*pstop = ((u32)*phra << 24) | ((u32)*(phra+1) << 16) |
((u32)*(phra+2) << 8) | ((u32)*(phra+3));
phrasize -= 8;
break;
default:
phrasize = 0;
}
phra += 5;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -