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

📄 mammf.c

📁 YAMAHA的铃音芯片的测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	  		       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 + -