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

📄 mammf.c.bak

📁 YAMAHA的铃音芯片的测试程序
💻 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 + -