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

📄 chp_dl_media_midi.c

📁 C625 midi播放源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	 case 0xD0:
		 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;
	 case 0xB0:
		 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 0xA0:
		 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;
	 default: 
		 {
			 switch (p_media_midi_data->track_command[track_cur]&0xF0)
			 {
			 case 0x80:
				 *p_media_midi_data->write_pointer = p_media_midi_data->track_command[track_cur];
				 dl_media_midi_pointer_inc();
				 *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->write_pointer = p_media_midi_data->track_command[track_cur];
				 dl_media_midi_pointer_inc();
				 *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->write_pointer = p_media_midi_data->track_command[track_cur];
				 dl_media_midi_pointer_inc();
				 *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->write_pointer = p_media_midi_data->track_command[track_cur];
				 dl_media_midi_pointer_inc();
				 *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 0xD0:
				 *p_media_midi_data->write_pointer = p_media_midi_data->track_command[track_cur];
				 dl_media_midi_pointer_inc();
				 *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 0xB0:
				 *p_media_midi_data->write_pointer = p_media_midi_data->track_command[track_cur];
				 dl_media_midi_pointer_inc();
				 *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 0xA0:
				 *p_media_midi_data->write_pointer = p_media_midi_data->track_command[track_cur];
				 dl_media_midi_pointer_inc();
				 *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;
			 default:
				 break;
			 }
		 }
		}
//	 	sys_printf("444write_pointer=0x%x,read_pointer=0x%x\n",p_media_midi_data->write_pointer,p_media_midi_data->read_pointer);
		if(p_media_midi_data->time_sum_count[track_cur]!=0xFFFFFFFF)	
		{
			time_event = 0;
			do 
			{
				midi_data = *p_media_midi_data->track_pointer[track_cur];
				p_media_midi_data->track_pointer[track_cur]++;
				time_event<<=7;
				time_event +=midi_data & 0x7F;
			}while( midi_data >= 0x80 );
		//................................................................................//zcp_midi 
		if(tick>=0x03C0)
			{
			time_event=time_event*480/tick;
			}
		//................................................................................
			p_media_midi_data->time_sum_count[track_cur] += time_event;
		}
}
/**********************************************************************************************
*	write midi format1 data to buffer
***********************************************************************************************/
void dl_media_midi_format1_write_data(DL_MEDIA_MIDI_DATA_T *p_media_midi_data)
{
	unsigned long write_read_interval;
	
	if(!p_media_midi_data->track_end_bit)
	{
		return;
	}
	while(p_media_midi_data->track_end_bit)
	{
		if(p_media_midi_data->write_pointer > p_media_midi_data->read_pointer)
		{
			write_read_interval = IMUSIC_SCORE_INT_COUNT*2+IMUSIC_MIDI_COMMAND_MAX_SIZE+p_media_midi_data->read_pointer - p_media_midi_data->write_pointer;;
		}
		else
		{
			write_read_interval = p_media_midi_data->read_pointer - p_media_midi_data->write_pointer;
		}
//		sys_printf("write_read_interval=0x%x\n",write_read_interval);
		if(write_read_interval < IMUSIC_MIDI_COMMAND_MAX_SIZE )
		{
			return;
		}
		dl_media_midi_format1_write_cmd(p_media_midi_data);
	}
	if(!p_media_midi_data->track_end_bit)
	{
		*p_media_midi_data->write_pointer= 0x00;
		dl_media_midi_pointer_inc();
		
		*p_media_midi_data->write_pointer = 0xFF;
		dl_media_midi_pointer_inc();
		*p_media_midi_data->write_pointer = 0x2F;
		dl_media_midi_pointer_inc();
		*p_media_midi_data->write_pointer = 0x00;
		dl_media_midi_pointer_inc();
		
	}
}



/**********************************************************************************************
*	read midi format0 data form buffer and write it to score fifo of iMusic
***********************************************************************************************/
void dl_media_midi_format1_read_data(DL_MEDIA_MIDI_DATA_T *p_media_midi_data)
{
	int i=0;
	UINT16 val;
	
	while( (p_media_midi_data->write_pointer!=p_media_midi_data->read_pointer) && i<0xff )
	{
		IOU_IN(IMUSIC_FIFO_STATUS,val);  
		if( val & 0x10 )
			break;
		IOU_OUT(IMUSIC_SCORE_FIFO, *p_media_midi_data->read_pointer);
		i++;
		p_media_midi_data->read_pointer++;
		if(p_media_midi_data->read_pointer>=p_media_midi_data->buffer_end)
		{
			p_media_midi_data->read_pointer = p_media_midi_data->buffer_start;
		}
	}	
}

/********************************************************************************************
*	It will compare two string whose length is 4 bytes
*	the same :return 0, different :return unzero
***********************************************************************************************/
UINT8 dl_media_midi_cmp_string(unsigned char * source_pointer, const char * object_pointer)
{
	int i;
	
	for(i=0; i<4; i++)
	{
		if(source_pointer[i]!=object_pointer[i])
		{
			return 1;
		}
	}
	return 0;
}

DL_MEDIA_MIDI_FILE_TYPE_T dl_media_midi_get_file_type(unsigned char *file_pointer)
{
	UINT8 music_file_type;
	
	/* decode different file type  */
	if( !dl_media_midi_cmp_string(file_pointer, "MThd") )
	{
		if( file_pointer[9] == 0 )
			music_file_type = IMUSIC_FILE_TYPE_MIDI_0;		//MIDI format 1 file type
		else
			music_file_type = IMUSIC_FILE_TYPE_MIDI_1;		//MIDI format 0 file type		
	}
	else if( !dl_media_midi_cmp_string(file_pointer, "MMhd") )
		music_file_type = IMUSIC_FILE_TYPE_MMD;			//MMD file type
#ifdef MIDI_MMF_ENABLE
	else if( !dl_media_midi_cmp_string(file_pointer, "MMMD") )
	{
		music_file_type = IMUSIC_FILE_TYPE_MMF;		/*MMF file type-->tomybao.*/
	}
#endif	
	else if( !dl_media_midi_cmp_string(file_pointer, "Adpc") )
	{
		music_file_type = IMUSIC_FILE_TYPE_ADP;		/*ADP file type-->tomybao.*/
	}
	else 
            music_file_type = IMUSIC_FILE_TYPE_UNKNOWN;
		
	return ( music_file_type );	
}
/*******************************************************************************************
*	This function performs playback preparation work and music content checking & loading. 
*	Parameters:
*	file_pointer: the pointer of music content.
*	file_size: the size of the music content.
*	A message will be returned to indicate whether the progress finishes successfully

********************************************************************************************/
DL_MEDIA_RET_T dl_media_midi_open(unsigned char* file_pointer, unsigned long file_size,
										DL_MEDIA_MIDI_FILE_TYPE_T music_file_type )
{
	int i;
	unsigned long track_size_prev;	
       DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;
       unsigned char adp_freq;
	

	if ( music_file_type != IMUSIC_FILE_TYPE_ADP )
		p_media_midi_data->iMusic_file_type = music_file_type;
	sys_printf("music_file_type=%d\n",music_file_type);
	switch(music_file_type)
	{
		case IMUSIC_FILE_TYPE_MIDI_1:							//MIDI format 1
			track_size_prev=0x12;
			p_media_midi_data->track_num = file_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+file_pointer;
				p_media_midi_data->track_size[i] = dl_media_midi_get_block_length_high_low(file_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++)
			{
				if(	p_media_midi_data->track_pointer[i][p_media_midi_data->track_size[i]-1] != 0x00 
					|| p_media_midi_data->track_pointer[i][p_media_midi_data->track_size[i]-2] != 0x2F 
					|| p_media_midi_data->track_pointer[i][p_media_midi_data->track_size[i]-3] != 0xFF )
				{
					return DL_MEDIA_RET_MIDI_FILE_SIZE_ERROR;
				}
			}
			p_media_midi_data->iMusic_file_pointer = file_pointer;
			p_media_midi_data->iMusic_file_size = file_size;
			break;
		case IMUSIC_FILE_TYPE_MIDI_0:							//MIDI format 0
			if(file_pointer[file_size-1]!=00 
				|| file_pointer[file_size-2]!=0x2F 
				|| file_pointer[file_size-3]!=0xFF)
			{//file size error
				return DL_MEDIA_RET_MIDI_FILE_SIZE_ERROR;				
			}
			p_media_midi_data->iMusic_file_pointer = file_pointer;
			p_media_midi_data->iMusic_file_size = file_size;
			break;
		case IMUSIC_FILE_TYPE_MMD:								//MMD file type
			p_media_midi_data->iMusic_mmhd_head = 1;
			p_media_midi_data->iMusic_mmhd_size = dl_media_midi_get_block_length(file_pointer+4) + 8;		//mmhd block size within block name and length
			p_media_midi_data->iMusic_mmdd_start = dl_media_midi_get_block_length(file_pointer+p_media_midi_data->iMusic_mmhd_size+4) + p_media_midi_data->iMusic_mmhd_size + 16;	//mmdd block data start position
			p_media_midi_data->iMusic_file_pointer = file_pointer;
			p_media_midi_data->iMusic_file_size = file_size;
			break;
		case IMUSIC_FILE_TYPE_ADP:								//ADPCM file type
			p_media_midi_data->adp_file_pointer = file_pointer+0xc;
			p_media_midi_data->adp_file_size = dl_media_midi_get_block_length(file_pointer+0x8);
			sys_printf("adp_file_size =0x%x \n", p_media_midi_data->adp_file_size);
			adp_freq=(unsigned char) dl_media_midi_get_block_length(file_pointer+0x4);
			IOU_OUT( IMUSIC_ADPCM_FORMAT, adp_freq );
			IOU_OUT( IMUSIC_POWER_DOWN, 0x00);		//GIVE CLOCK ADPCM change by wang
			break;
		#ifdef MIDI_MMF_ENABLE		
		case IMUSIC_FILE_TYPE_MMF:
			p_media_midi_data->iMusic_file_pointer = file_pointer;
			p_media_midi_data->iMusic_file_size = file_size;
			break;
		#endif
	}
	return DL_MEDIA_RET_SUCCESS;
	
}

/*******************************************************************************************
*	After iMusic_Open is finished, MIDI playback will not start until iMusic_Start API is called. 
*	It will invoke the playback of MIDI and pass the MIDI data to MIDI hardware buffer until it is full or file end. 
*	Parameters:
*		mode=0 : infinite loop   mode=n (n=1~255): repeat count
*	After that, the playback of MIDI will be interrupt driven.
*	When the buffer is nearly empty, 
*	it will generate an interrupt to the system to pass further MIDI data until the end of song.
*	A message will be returned to indicate whether the progress finishes successfully
*********************************************************************************************/
DL_MEDIA_RET_T dl_media_midi_start(UINT8 music_file_type, MIDI_ADPCM_PLAY_MODE_T play_mode, UINT8  time_mode)
{
	int i=0,ret;
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;
	UINT16 val;
	
	p_media_midi_data->time_mode = time_mode;
	if(!p_media_midi_data->time_mode)
		p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_INFINITE;
	else
		p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_PLAY;

	p_media_midi_data->iMusic_file_count = 0;	
	

	switch(music_file_type)
	{
		case IMUSIC_FILE_TYPE_MIDI_1:
//			sys_printf("111write_pointer=0x%x,read_pointer=0x%x\n",p_media_midi_data->write_pointer,p_media_midi_data->read_pointer);
			dl_media_midi_format1_init(p_media_midi_data->iMusic_file_pointer,p_media_midi_data);
//			sys_printf("222write_pointer=0x%x,read_pointer=0x%x\n",p_media_midi_data->write_pointer,p_media_midi_data->read_pointer);
			while(p_media_midi_data->track_end_bit!=0 && i < (IMUSIC_SCORE_FIFO_COUNT-IMUSIC_SCORE_INT_COUNT)) 
			{
				dl_media_midi_format1_write_data(p_media_midi_data);
				dl_media_midi_format1_read_data(p_media_midi_data);
				i+=IMUSIC_SCORE_INT_COUNT;
			}
			if(p_media_midi_data->track_end_bit == 0 )
			{
				if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_INFINITE)
					dl_media_midi_format1_init(p_media_midi_data->iMusic_file_pointer,p_media_midi_data);
				else if (--p_media_midi_data->time_mode)
					{
						ret = dl_media_midi_init();//added by tomybao.
						dl_media_midi_format1_init(p_media_midi_data->iMusic_file_pointer,p_media_midi_data);
					}else 
						{
							p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_END;

⌨️ 快捷键说明

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