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

📄 chp_dl_media_midi.c

📁 C625 midi播放源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/**====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*

dl_media_midi.c

Copyright (c) 2003 by CHIPNUTS Incorporated. All Rights Reserved.
*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/

/**===========================================================================

 Revisions of dl_media_midi.c
 Version  		Name       	Date		Description
 1.0  		Eric	  	10/26/2004  	Initial Version  

*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/

#include "chp_dl_media_midi.h"
#include "chp_dl_media_pwr.h"
#include "chp_dl_media_timer_mode.h"

#ifdef CHP_SYSTEM_TEST
extern void dl_media_status_rsp(DL_MEDIA_FILE_TYPE_T type,DL_MEDIA_STATUS_T status);
#endif

UINT16  tick;//zcp_midi
DL_MEDIA_MIDI_DATA_T media_midi_data;
DL_MEDIA_MIDI_DATA_T *p_g_media_midi_data=NULL;
const unsigned char DL_MEDIA_MIDI_format0_head_data[22] = 
{
	77,84,104,100,0,0,0,6,0,0,0,1,1,224,77,84,114,107,0,0,36,238
};
#ifdef MIDI_MMF_ENABLE
unsigned char MIDI_mmf_format0_head_data[] = {
	0x4D,0x54,0x68,0x64,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x01,0xE0,0x4D,0x54,
		0x72,0x6B,0x00,0x00,0x31,0x7B,0x00,0xFF,0x03,0x08,0x75,0x6E,0x74,0x69,0x74,0x6C,
		0x65,0x6C,0x00,0xFF,0x58,0x04,0x04,0x02,0x18,0x08,0x00,0xFF,0x59,0x02,0x00,0x00,
		0x00,0xFF,0x51,0x03
};
#endif 

/* internal function begine */
void dl_media_midi_write_data(unsigned long addr_index, unsigned char Data)
{
	IOU_OUT(addr_index,(unsigned short)Data);
}

 unsigned char dl_media_midi_read_data(unsigned long addr_index)
{
	unsigned short retData;
	IOU_IN(addr_index,retData);
	return ((unsigned char)retData);
}

UINT32 dl_media_midi_get_block_length (unsigned char * length_pointer)
{
	int i;
	unsigned long ret_length=0;
	for(i=0; i<4; i++)
	{
		ret_length+=length_pointer[i]<<(i*8);
	}
	return (ret_length);
}

UINT32  dl_media_midi_get_block_length_high_low(unsigned char * length_pointer)
 {
	 int i;
	 UINT32 ret_length=0;
	 for(i=0; i<4; i++)
	 {
		 ret_length+=length_pointer[i]<<((3-i)*8);
	 }
	 return (ret_length);
 }

  void dl_media_midi_pointer_inc(void)
 {
 	 DL_MEDIA_MIDI_DATA_T *p_media_midi_data;

	 p_media_midi_data =p_g_media_midi_data;

	 p_media_midi_data->write_pointer++;
	 if(p_media_midi_data->write_pointer>=p_media_midi_data->buffer_end)
	 {
		 p_media_midi_data->write_pointer = p_media_midi_data->buffer_start;
	 }
 }


void dl_media_midi_format1_init(unsigned char * format1_pointer, DL_MEDIA_MIDI_DATA_T *p_media_midi_data)
 {
	 unsigned long time_event;
	 unsigned char midi_data;
	 unsigned long track_size_prev;
	 int i=0;

	 p_media_midi_data->write_pointer = p_media_midi_data->buffer_start;	
	 p_media_midi_data->read_pointer = p_media_midi_data->buffer_start;	
	 p_media_midi_data->buffer_end = p_media_midi_data->buffer_start+IMUSIC_SCORE_INT_COUNT*2+IMUSIC_MIDI_COMMAND_MAX_SIZE;
	 
	 p_media_midi_data->time_sum_prev=0;
	 for(i=0; i<22; i++)
	 {
		 *p_media_midi_data->write_pointer = DL_MEDIA_MIDI_format0_head_data[i];
		 dl_media_midi_pointer_inc();
	 }
	 
	 *(p_media_midi_data->write_pointer-10) = format1_pointer[12];
	 *(p_media_midi_data->write_pointer-9) = format1_pointer[13];
	 //................................................................................//zcp_midi
 	tick=format1_pointer[12];
	tick<<=8;
	tick+=format1_pointer[13];
	if(tick>=0x03C0)
		{
		 *(p_media_midi_data->write_pointer-10) = 0x01;
		 *(p_media_midi_data->write_pointer-9) = 0xE0;
		}
	//.................................................................................
	 i=0;
	 track_size_prev=0x12;
	 p_media_midi_data->track_num = format1_pointer[11];
	 if(p_media_midi_data->track_num >32)
	 {
		 p_media_midi_data->track_num = 32;
	 }
	 for(i=0; i<p_media_midi_data->track_num; i++)
	 {
		 p_media_midi_data->track_pointer[i] = track_size_prev+4+format1_pointer;
		 p_media_midi_data->track_size[i] = dl_media_midi_get_block_length_high_low(format1_pointer+track_size_prev);
		 track_size_prev += p_media_midi_data->track_size[i]+8;
	 }
	 for(i=0; i<p_media_midi_data->track_num; i++)
	 {
		 p_media_midi_data->time_sum_count[i]=0;
		 p_media_midi_data->track_end_bit|=1<<i;
	 }
	 i=0;
	 while( i<p_media_midi_data->track_num)
	 {
		 p_media_midi_data->time_sum_count[i]=0;
		 time_event = 0;
		 do 
		 {
			 midi_data = *p_media_midi_data->track_pointer[i];
			 p_media_midi_data->track_pointer[i]++;
			 time_event<<=7;
			 time_event +=midi_data & 0x7F;
		 }while( midi_data >= 0x80 );
		 p_media_midi_data->time_sum_count[i] += time_event;
		 i++;
	 }
	 
 }
 
//zcp_midi
UINT8 chp_get_time(UINT8 **pp_data, UINT32 *p_time)
{
	UINT8 data, i;
	UINT8 *p_data = *pp_data;
	UINT32 time = 0;
	
	for ( i = 0; ; i++)
	{
		data = *p_data++;
		time += data & 0x7f;
		if (data >= 0x80)
		{
			if (i == 3)
			{
				return 0xfa;
			}
			time <<= 7;
		}
		else
		{
			break;
		}
	}

	*p_time = time;
	*pp_data = p_data;
	return 0x00;
}

  void dl_media_midi_format1_write_cmd(DL_MEDIA_MIDI_DATA_T *p_media_midi_data)
 {
	 unsigned long time_event;
	 unsigned char midi_time[5];
	 unsigned char midi_data;
	 unsigned char track_cur;
	 unsigned char command_event=0xFF;
	 unsigned char temp;
	 int i=0;
	 UINT32 temp1;//zcp_midi
	 
	 track_cur=0;
	 //find min time
	 for(i=0; i< p_media_midi_data->track_num; i++)
	 {
		 if(p_media_midi_data->time_sum_count[track_cur] > p_media_midi_data->time_sum_count[i])
		 {
			 track_cur=i;
		 }
	 }
	 //decode time
	 for(i=0; i<4; i++)
	 {
		 midi_time[i]=0;
	 }
	 time_event = p_media_midi_data->time_sum_count[track_cur] - p_media_midi_data->time_sum_prev;
	 p_media_midi_data->time_sum_prev = p_media_midi_data->time_sum_count[track_cur];
	 for(i=0; i<4 && (time_event!=0); i++)
	 {
		 if(time_event >=0x80 )
		 {
			 midi_time[i+1] |=0x80;
		 }
		 midi_time[i] |= time_event & 0x7F;
		 time_event >>= 7;
	 }
	 if(i!=0)
	 {
		 i--;
	 }
	 do
	 {
		 *p_media_midi_data->write_pointer = midi_time[i];
		 dl_media_midi_pointer_inc();
	 }while(i--);
//	sys_printf("333write_pointer=0x%x,read_pointer=0x%x\n",p_media_midi_data->write_pointer,p_media_midi_data->read_pointer);
	 midi_data = *p_media_midi_data->track_pointer[track_cur];
	 command_event = midi_data;
	 if( (midi_data != 0xFF) && (midi_data != 0xF0) && (midi_data >= 0x80) ) 
	 {        
		 command_event = command_event & 0xF0;
	 }
//	 sys_printf("command_event=0x%x\n",command_event);
	 switch(command_event)
	 {
	 case 0xFF:
		 p_media_midi_data->track_command[track_cur] = midi_data;
		 if(*(p_media_midi_data->track_pointer[track_cur]+1) == 0x2F)		// mtrk end
		 {
			 *p_media_midi_data->write_pointer = 0xB0;
			 dl_media_midi_pointer_inc();
			 p_media_midi_data->track_pointer[track_cur]++;
			 *p_media_midi_data->write_pointer  = 0x20;
			 dl_media_midi_pointer_inc();
			 p_media_midi_data->track_pointer[track_cur]++;
			 *p_media_midi_data->write_pointer = 0x00;
			 dl_media_midi_pointer_inc();
			 p_media_midi_data->track_pointer[track_cur]++;
			 
			 p_media_midi_data->time_sum_count[track_cur] = 0xFFFFFFFF;
			 p_media_midi_data->track_end_bit &= ~(1 << track_cur);
			 
			 break;
		 }
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 temp=*p_media_midi_data->track_pointer[track_cur];
		 if(temp > 0x10)
		 {
			 *p_media_midi_data->write_pointer = 0;
			 dl_media_midi_pointer_inc();
			 p_media_midi_data->track_pointer[track_cur]+=temp+1;
			 break; 
		 }
		 for(i=0; i<= temp; i++)
		 {
			 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
			 dl_media_midi_pointer_inc();
			 p_media_midi_data->track_pointer[track_cur]++;
		 }
		 break;
		 
	  //................................................................................//zcp_midi 
	case 0xF0:
	 	 p_media_midi_data->track_command[track_cur] = midi_data;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 
              
		 if(*p_media_midi_data->track_pointer[track_cur] >= 0x80)
		 	{
		 	
		 	chp_get_time(&p_media_midi_data->track_pointer[track_cur], &temp1); 
			if(temp1<=0x7F)
				{
				p_media_midi_data->track_pointer[track_cur] -=1;
				}
			else if(temp1<=0x3FFF)
				{
				p_media_midi_data->track_pointer[track_cur] -=2;
				}
			else 
				{
				p_media_midi_data->track_pointer[track_cur] -=3;
				}
			 for(i=0; i<= (temp1+1); i++)
		 {
			 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
			 dl_media_midi_pointer_inc();
			 p_media_midi_data->track_pointer[track_cur]++;
		 }
                          break;
		 }
		 else
		 {
		 temp=*p_media_midi_data->track_pointer[track_cur];

		  for(i=0; i<= temp; i++)
		 {
			 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
			 dl_media_midi_pointer_inc();
			 p_media_midi_data->track_pointer[track_cur]++;
		 }
		 	}
		 break;
//................................................................................
		 
	 case 0x80:
		 p_media_midi_data->track_command[track_cur] = midi_data;
		 
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 break;
	 case 0x90:
		 p_media_midi_data->track_command[track_cur] = midi_data;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 break;
	 case 0xE0:
		 p_media_midi_data->track_command[track_cur] = midi_data;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 break;
	 case 0xC0:
		 p_media_midi_data->track_command[track_cur] = midi_data;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 *p_media_midi_data->write_pointer = *p_media_midi_data->track_pointer[track_cur];
		 dl_media_midi_pointer_inc();
		 p_media_midi_data->track_pointer[track_cur]++;
		 break;
		 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -