📄 mammf.c.bak
字号:
#include "pccdef.h"
#include "B_FileIO.h"
#include "Mammf.h"
#include "Madev_initial.h"
int MMF_initial(void)
{
u32 result;
result = MaDevDrv_Initialize();
if( result != 0 )
{
printf_uart2("\n Initialization failed! Exit!");
return 0;
}
printf_uart2("\n Initialization SUCCESS!");
return 1;
}
int file_test(void)
{
u8 i;
char filename[20];
u8 buf[20000],channel_state[16];
u8 timebase;
u32 file_chunk,file_size,rfile_size,chunkID,chunk_size;
u32 pstart, pstop;
u16 wCalc_CRC, wFile_CRC;
FILE *fp;
printf_uart2("\n Please input the SMAF file name:");
gets_uart2(filename,20,0);
if((fp = Fopen(filename,"rb")) == NULL)
{
printf_uart2("Can't open the MMF file!\n");
return 0;
}
Fread(buf,1,20000,fp); /* load file data to buffer */
file_chunk = get4b(buf);
file_size = get4b(buf+num);
rfile_size = file_size+8;
printf_uart2("\nThe real file size = 0x%x",rfile_size);
if(rfile_size > 20000)
{
printf_uart2("\nThe file is too big! EXIT!");
return 0;
}
if(file_chunk != 0x4D4D4D44) /* only "MMMD" can be supported */
{
printf_uart2("\nUnknow type! Exit!");
return 0;
}
/* CRC check */
wFile_CRC = (u16)((buf[file_size - 2+8] << 8) + buf[file_size - 1+8]);
wCalc_CRC = makeCRC(rfile_size,&buf[0]);
printf_uart2("\n file_CRC = %x, Calc_CRC = %x", wFile_CRC,wCalc_CRC);
/*if (wCalc_CRC != wFile_CRC)
{
printf_uart2("\nCRC Check Error!");
return 0;
}*/
/* Contents Info Chunk */
chunkID = get4b(buf+num);
if(chunkID != 0x434E5449)
{
printf_uart2("\nNo Contents Info Chunk(CNTI)! EXIT!");
return 0;
}
chunk_size = get4b(buf+num);
if( buf[num+1] == 0x32 )
{
cnvmode = 16; /* maximum channel number is 16 */
}
else
if( buf[num+1] == 0x33 )
{
cnvmode = 32; /* maximum channel number is 32 */
}
else
return 0;
printf_uart2("\ncnvmode = %d", cnvmode);
/* Optional Data Chunk */
num += chunk_size;
chunkID = get4b(buf+num);
chunk_size = get4b(buf+num);
if(chunkID != 0x4F504441)
{
printf_uart2("\nNO Optional Data Chunk(opda)!");
num -= 8;
}
else num += chunk_size;
/* Score Track Chunk */
chunkID = get4b(buf+num);
if(chunkID != 0x4D545205)
{
printf_uart2("\nNo Score Track Chunk(MTR0x5)! EXIT!");
return 0;
}
chunk_size = get4b(buf+num);
/* Score track chunk information */
if((buf[num] != 0x02) || (buf[num+1] != 0x0)) /* Only No Compress and Stream can pass */
{
printf_uart2("\nThe format type can't be supported! Exit!");
return 0;
}
if(buf[num+2] != buf[num+3])
{
printf_uart2("\nTimebaseD != TimebaseG! Exit!");
return 0;
}
timebase = get_timebase(buf[num+2]);
if(timebase == 0)
{
printf_uart2("\nThe timebase can't be supported! Exit!");
return 0;
}
else printf_uart2("\ntimebase = %d", timebase);
/* Get channel status */
for(i = 0;i < 16;i++)
{
channel_state[i] = buf[num+4+i];
printf_uart2("\nChannel %d state = 0x%x", i, channel_state[i]);
}
num += 20;
/* Score track chunk---Sub Chunk */
for(i = 0; i < 4; i++)
{
if(num >= (rfile_size-2)) break;
chunkID = get4b(buf+num);
switch(chunkID)
{
case 0x4D747375:
chunk_size = get4b(buf+num);
printf_uart2("\nMstu chunk size=0x%x", chunk_size);
Exclusive_check(&buf[num], chunk_size);
num += chunk_size;
break;
case 0x4D737049:
chunk_size = get4b(buf+num);
printf_uart2("\nMspI chunk size=0x%x",chunk_size);
MspI_check(&buf[num], chunk_size, &pstart, &pstop);
printf_uart2("\nfinal START = 0x%x", pstart);
printf_uart2("\nfinal STOP = 0x%x", pstop);
num += chunk_size;
break;
case 0x4D747371:
chunk_size = get4b(buf+num);
printf_uart2("\nMtsq chunk size=0x%x",chunk_size);
Event_check(&buf[num],chunk_size);
num += chunk_size;
break;
case 0x4D747370:
chunk_size = get4b(buf+num);
num += chunk_size;
printf_uart2("\nMtsp chunk size=0x%x",chunk_size);
break;
default:
printf_uart2("\nNo specificated data chunk!");
break;
}
}
return 1;
}
u32 get4b(u8 *buff)
{
u32 result;
result = ((u32)*buff << 24) | ((u32)*(buff+1) << 16) |
((u32)*(buff+2) << 8) | ((u32)*(buff+3));
num += 4;
return result;
}
u16 makeCRC(u32 n, u8 *c)
{
u16 res;
u16 crc;
u8 data0;
res = 0xFFFFU;
crc = 0;
while( --n >= 2 )
{
data0 = *c++;
res = (u16)((res << 8) ^ crctable[(u8)(res >> 8) ^ data0]);
crc = (u16)((crc << 8) | data0);
}
return (u16)(~res & 0xFFFFU);
}
u8 get_timebase(u8 index)
{
switch( index )
{
case 0x00: return 0;
case 0x01: return 0;
case 0x02: return 4;
case 0x03: return 5;
case 0x10: return 10;
case 0x11: return 20;
case 0x12: return 40;
case 0x13: return 50;
default: return 0; /* ERROR */
}
}
void Event_check(u8 *pevent, u32 chunksize)
{
u8 i, j = 0, k = 0;
u8 note, velocity, prog, ctrl_no, ctrl_val, master_vol, bBankM, bBankL;
u8 bData0, bData1, bData2, bChannel;
u32 duration=1, gatetime;
u32 dwMsize=0;
for(i = 0; i < chunksize; i+=dwMsize)
{
duration = get_flex(pevent+i, &j);
bData0 = *(pevent+i+j);
bChannel = (u8)(bData0 & 0x0F);
switch( bData0 & 0xF0)
{
case 0x80:
note = *(pevent+i+j+1) & 0x7F;
velocity = 64;
gatetime = get_flex(pevent+i+j+2, &k);
printf_uart2("\nNote Message (No velocity) found!");
printf_uart2("\n Duration = 0x%x, Channel = 0x%x", duration, bChannel);
printf_uart2("\n Note = 0x%x, Velocity = 0x%x, Gatetime = 0x%x", note, velocity, gatetime);
/* MaSndDrv_NoteOn( duration, bChannel, note, velocity, gatetime ); */
dwMsize = j+k+2;
break;
case 0x90:
note = *(pevent+i+j+1) & 0x7F;
bData1 = *(pevent+i+j+2) & 0x7F;
velocity = VelocityTable[bData1];
gatetime = get_flex(pevent+i+j+3, &k);
printf_uart2("\nNote Message (With velocity) found!");
printf_uart2("\n Duration = 0x%x, Channel = 0x%x", duration, bChannel);
printf_uart2("\n Note = 0x%x, Velocity = 0x%x, Gatetime = 0x%x", note, velocity, gatetime);
/* MaSndDrv_NoteOn( duration, bChannel, note, velocity, gatetime ); */
dwMsize = j+k+3;
break;
case 0xC0:
prog = *(pevent+i+j+1) & 0x7F;
printf_uart2("\nProgram channel Message found! Duration = 0x%x Channel = 0x%x", duration, bChannel);
printf_uart2("\n Prog No = 0x%x", prog);
/* MaSndDrv_ProgramChange( duration, bChannel, bBankM, bBankL, prog ); */
dwMsize = j+2;
break;
case 0xE0:
/* Pitch Bend */
dwMsize = j+3;
break;
case 0xB0:
ctrl_no = *(pevent+i+j+1) & 0x7F;
ctrl_val = *(pevent+i+j+2) & 0x7F;
printf_uart2("\nControl Message found! Duration = 0x%x Channel = 0x%x", duration, bChannel);
dwMsize = j+3;
switch( ctrl_no )
{
case 0x00:
bBankM = ctrl_val;
printf_uart2("\n BankM = 0x%x", bBankM);
/* MaSndDrv_Nop( duration, 0 ); */
break;
case 0x20:
bBankL = ctrl_val;
printf_uart2("\n BankL = 0x%x", bBankL);
/* MaSndDrv_Nop( duration, 0 ); */
break;
case 0x07:
printf_uart2("\n Channel Vol = 0x%x", ctrl_val);
/* MaSndDrv_ChannelVolume( duration, bChannel, ctrl_val ); */
break;
case 0x01:
/* Modulation depth */
break;
case 0x0A:
/* pan */
break;
case 0x0B:
/* Expression */
break;
case 0x40:
/* Hold 1(dumper) */
break;
case 0x06:
/* Data entry (MSB) */
break;
case 0x26:
/* Data entry (LSB) */
break;
case 0x64:
/* RPN (LSB) */
break;
case 0x65:
/* RPN (MSB) */
break;
case 0x78:
/* All Sound Off */
break;
case 0x79:
/* Reset All Control */
break;
case 0x7B:
/* All Note Off */
break;
case 0x7E:
/* Mono mode on */
break;
case 0x7F:
/* Poly mode on */
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( duration, ch); */
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 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)
MaSndDrv_SetVoice((UINT8)(bBankL+1), bProgNo, bKeyNo, dwRamAdr);
else
MaSndDrv_SetVoice((UINT8)(bProgNo+129), bNote, bKeyNo, dwRamAdr);
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 ;
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 + -