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

📄 chp_dl_media_midi.c

📁 C625 midi播放源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
					IOU_OUT( IMUSIC_SCORE_FIFO, p_media_midi_data->iMusic_file_pointer[p_media_midi_data->iMusic_file_count] );
					p_media_midi_data->iMusic_file_count++;
					if(p_media_midi_data->iMusic_mmhd_head)
					{
						if(p_media_midi_data->iMusic_file_count == p_media_midi_data->iMusic_mmhd_size )
						{
							p_media_midi_data->iMusic_file_count = p_media_midi_data->iMusic_mmdd_start;
							p_media_midi_data->iMusic_mmhd_head = 0;
						}
					}
			
				}
				//play loop
				if(p_media_midi_data->iMusic_file_count >= p_media_midi_data->iMusic_file_size )
				{
					if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_INFINITE)
					{
						p_media_midi_data->iMusic_file_count = 0;
						p_media_midi_data->iMusic_mmhd_head=1;
					}
					else if (--p_media_midi_data->time_mode)
					{
//						ret = dl_media_midi_init();//added by tomybao.
						p_media_midi_data->iMusic_file_count = 0;
						p_media_midi_data->iMusic_mmhd_head=1;
					}
						else 
							{
								p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_END;							
								IOU_OUT(IMUSIC_SCORE_L,0x00);//dacyli 050623
							}
				}
				break;
			#ifdef MIDI_MMF_ENABLE	
			case IMUSIC_FILE_TYPE_MMF:
				if(p_media_midi_data->MIDI_mmf_write_pointer!=p_media_midi_data->MIDI_mmf_read_pointer )
				{
					dl_media_MIDI_Mmf_Read_Data_To_Buffer();
					dl_media_MIDI_Mmf_Write_Data_To_Fifo();
				}
				//play loop
				if(p_media_midi_data->MIDI_mmf_end_flg != 0 )
				{
					if(p_media_midi_data->iMusic_play_status == IMUSIC_PLAY_STATUS_INFINITE)
						dl_media_MIDI_Mmf_Init(p_media_midi_data->iMusic_file_pointer);
					else if (--p_media_midi_data->time_mode)
						{
//							ret = dl_media_midi_init();//added by tomybao.
							dl_media_MIDI_Mmf_Init(p_media_midi_data->iMusic_file_pointer);
						}	
						else 
							{
								p_media_midi_data->iMusic_play_status = IMUSIC_PLAY_STATUS_END;								
								IOU_OUT(IMUSIC_SCORE_L,0x00); //dacyli 050623
							}
				}
				break;
			#endif				
			default:
				break;
		}

		return 0;
			
	}
}

void dl_media_midi_user_play(UINT32 size,UINT8* addr )
{
	UINT32 i;

	for(i=0;i<size;i++)
		dl_media_midi_write_data( IMUSIC_EVENT_FIFO, addr[i]);
	while( (dl_media_midi_read_data(IMUSIC_FIFO_STATUS)& 0X04));
	IOU_OUT(IMUSIC_MUSIC_START,MIDI_PLAY);//start play midi ,set music start bit 1
	for (i = 0; i < 100000; i++);
	IOU_OUT(IMUSIC_MUSIC_START,0x00);		//stop play midi file 
}
//added by tomybao.

#ifdef MIDI_MMF_ENABLE
/**********************************************************************************************
FUNCTION:  MIDI_Mmf_Init

DESCRIPTION: 	MIDI Mmf into MIDI format 0 initialization .
  
INPUT PARAMETER:	unsigned char * mmf_pointer
	
OUTPUT PARAMETER:  	unsigned long
	  
MODIFY PARAMETER:   			MIDI_mmf_write_pointer;
					MIDI_mmf_read_pointer;
					MIDI_mmf_end_flg;		// 1 is end
					MIDI_mmf_buffer_end;
					MIDI_mmf_buffer_start;	// pointer to  buffer_start;
					MIDI_mmf_note_on_buffer[64];   //buffer for record the playing note of mmf
		
call fun:			midi_cmp_string
RETURN VALUE:		MIDI_RET_FILE_FORMAT_ERR:file can't be replayed
					MIDI_RET_SUCCESS:success
**********************************************************************************************/
unsigned long dl_media_MIDI_Mmf_Init(unsigned char * mmf_pointer)
{
	long i=0;
	long l_block_length = 0;
	unsigned long l_file_pos = 0;
	unsigned char uc_block_MTR5[4] = {'M','T','R',5};
	unsigned char uc_block_MTR6[4] = {'M','T','R',6};
	unsigned char block_type=0xff;

	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;//added by tomybao.
	
	p_media_midi_data->MIDI_mmf_pointer = mmf_pointer;
	p_media_midi_data->MIDI_mmf_buffer_start =  p_media_midi_data->buffer_start;
	p_media_midi_data->MIDI_mmf_buffer_end =  p_media_midi_data->buffer_start+IMUSIC_SCORE_INT_COUNT*2+IMUSIC_MIDI_COMMAND_MAX_SIZE;
	p_media_midi_data->MIDI_mmf_write_pointer = p_media_midi_data->buffer_start;
	p_media_midi_data->MIDI_mmf_read_pointer =  p_media_midi_data->buffer_start;
	
	p_media_midi_data->MIDI_mmf_end_flg = 0;
	p_media_midi_data->MIDI_mmf_remain_time=-1;	
	for(i=0; i < MMF_MAX_NOTE_NUM+1; i++ )
	{
		p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note = 0XFF;
	}
	//set midi format 0 head
	for(i = 0; i< 0x34; i++)
	{
		*p_media_midi_data->MIDI_mmf_write_pointer = MIDI_mmf_format0_head_data[i];
		p_media_midi_data->MIDI_mmf_write_pointer++;
	}
	
	while(l_file_pos < p_media_midi_data->iMusic_file_size)
	{
		if(dl_media_midi_cmp_string((unsigned char *)(p_media_midi_data->MIDI_mmf_pointer+l_file_pos), "MMMD")==0)
		{
			block_type = 0;
		}
		else if(dl_media_midi_cmp_string((unsigned char *)(p_media_midi_data->MIDI_mmf_pointer+l_file_pos), "CNTI")==0)
		{
			block_type = 1;
		}
		else if(dl_media_midi_cmp_string((unsigned char *)(p_media_midi_data->MIDI_mmf_pointer+l_file_pos), "OPDA")==0)
		{
			block_type = 2;
		}
		else if(dl_media_midi_cmp_string(p_media_midi_data->MIDI_mmf_pointer+l_file_pos, (const char *)uc_block_MTR5)==0)//MTR5
		{
			block_type = 3;
		}
		else if(dl_media_midi_cmp_string(p_media_midi_data->MIDI_mmf_pointer+l_file_pos, (const char *)uc_block_MTR6)==0)//added by tomybao,MTR6.
		{
			block_type = 4;
		}
		else if(dl_media_midi_cmp_string((unsigned char *)(p_media_midi_data->MIDI_mmf_pointer+l_file_pos), "Mtsq")==0)
		{
			block_type = 5;
		}
		switch(block_type)
		{
		case 0://MMMD
			l_file_pos=8;
			break;
		case 1://CNTI
			l_block_length = dl_media_midi_get_block_length_high_low(p_media_midi_data->MIDI_mmf_pointer +l_file_pos + 4);
			l_file_pos += l_block_length +8; 
			break;
		case 2://OPDA
			l_block_length = dl_media_midi_get_block_length_high_low(p_media_midi_data->MIDI_mmf_pointer +l_file_pos + 4);
			l_file_pos += l_block_length +8; 
			break;
		case 3://MTR5
		case 4://MTR6
			switch (*(p_media_midi_data->MIDI_mmf_pointer+l_file_pos+8 +2))
			{
			case 0:
				// 1 unit is 1ms
				*p_media_midi_data->MIDI_mmf_write_pointer = (MMF_TEMPO>>16)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = (MMF_TEMPO>>8)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = (MMF_TEMPO)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				break;
			case 2:
				// 1 unit is 4ms
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*4)>>16)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*4)>>8)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*4))&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				break;
			case 3:
				// 1 unit is 5ms
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*5)>>16)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*5)>>8)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*5))&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				break;
			case 16:
				// 1 unit is 10ms
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*10)>>16)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*10)>>8)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*10))&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				break;
			case 17:
				// 1 unit is 20ms
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*20)>>16)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*20)>>8)&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				*p_media_midi_data->MIDI_mmf_write_pointer = ((MMF_TEMPO*20))&0xFF;
				p_media_midi_data->MIDI_mmf_write_pointer++;
				break;
			default:
				return (DL_MEDIA_RET_UNKNOWN);
			}
			l_file_pos += 28;
			break;
			case 5://Mtsq
				//midi data
				p_media_midi_data->MIDI_mmf_pointer += l_file_pos+8;
				return (DL_MEDIA_RET_SUCCESS);
				break;
			default:
				l_block_length = dl_media_midi_get_block_length_high_low(p_media_midi_data->MIDI_mmf_pointer +l_file_pos + 4);
				l_file_pos += l_block_length +8; 
				break;
				
		}
		block_type = 0xff;
		
	 }
	 return (DL_MEDIA_RET_UNKNOWN);
	 
}
/**********************************************************************************************
FUNCTION: 	MIDI_Mmf_Read_Data_To_Buffer

DESCRIPTION: 	Write mmf fotmat data to buffer .
				mmf_write_pointer is modified .
  
INPUT PARAMETER:	null	
	
OUTPUT PARAMETER:  	null
	  
RETURN VALUE:	null 
***********************************************************************************************/
void dl_media_MIDI_Mmf_Read_Data_To_Buffer(void)
{
	unsigned long write_read_interval;
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;//added by tomybao.
	
	if(p_media_midi_data->MIDI_mmf_end_flg)
	{
		return;
	}
	while(p_media_midi_data->MIDI_mmf_end_flg != 1)
	{
		if(p_media_midi_data->MIDI_mmf_write_pointer > p_media_midi_data->MIDI_mmf_read_pointer)
		{
			write_read_interval = IMUSIC_SCORE_INT_COUNT*2+IMUSIC_MIDI_COMMAND_MAX_SIZE	
				+p_media_midi_data->MIDI_mmf_read_pointer - p_media_midi_data->MIDI_mmf_write_pointer;;
		}
		else
		{
			write_read_interval = p_media_midi_data->MIDI_mmf_read_pointer - p_media_midi_data->MIDI_mmf_write_pointer;
		}
		if(write_read_interval < IMUSIC_MIDI_COMMAND_MAX_SIZE )
		{
			return;
		}
		dl_media_MIDI_Read_Mmf_Command();
		
	}
	
}

/**********************************************************************************************
FUNCTION: 	MIDI_Mmf_Write_Data_To_Fifo
		
DESCRIPTION: 	Read mmf data from buffer and write it to score fifo of MIDI .
				MIDI_mmf_pointer is modified .
		  
INPUT PARAMETER:	null	
			
OUTPUT PARAMETER:  	null
			  
RETURN VALUE:	null  
***********************************************************************************************/
void dl_media_MIDI_Mmf_Write_Data_To_Fifo(void)
{
	UINT16 temp;
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;//added by tomybao.
	
	while( p_media_midi_data->MIDI_mmf_write_pointer!=p_media_midi_data->MIDI_mmf_read_pointer)
	{
                IOU_IN(IMUSIC_FIFO_STATUS,temp);  
		if( temp & 0x10 )
			break;
		IOU_OUT(IMUSIC_SCORE_FIFO, *p_media_midi_data->MIDI_mmf_read_pointer);
		//i++;
		p_media_midi_data->MIDI_mmf_read_pointer++;
		if(p_media_midi_data->MIDI_mmf_read_pointer>=p_media_midi_data->MIDI_mmf_buffer_end)
		{
			p_media_midi_data->MIDI_mmf_read_pointer = p_media_midi_data->MIDI_mmf_buffer_start;
		}
	}
	
}
//mmf解码

/**********************************************************************************************
FUNCTION: 	midi_Read_mmf_command
		
DESCRIPTION: 	Decode one command into buffer from mmf .
	  
INPUT PARAMETER:	null	
			
OUTPUT PARAMETER:  	null
			  
RETURN VALUE:	null
***********************************************************************************************/
void dl_media_MIDI_Read_Mmf_Command()
{
	int i=0;
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;//added by tomybao.
	
	unsigned char command_track,command_note;
	unsigned char command_track_pre,command_note_pre;
	
	int command_time_pre;
	int command_time;
	static unsigned char command_volume = 0;
	//decode time
	if(p_media_midi_data->MIDI_mmf_remain_time < 0)
	{
		command_time = dl_media_MIDI_Read_Time(&p_media_midi_data->MIDI_mmf_pointer);
		p_media_midi_data->MIDI_mmf_remain_time = command_time;
	}
	{
		if(p_media_midi_data->MIDI_mmf_note_on_buffer[0].uc_note!=0xff && p_media_midi_data->MIDI_mmf_note_on_buffer[0].i_time <= p_media_midi_data->MIDI_mmf_remain_time)
		{
			//must send a 9n command
			command_time = p_media_midi_data->MIDI_mmf_note_on_buffer[0].i_time;
			for(i=1; p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note!=0xff && i < MMF_MAX_NOTE_NUM; i++)
			{
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time -= command_time;
			}
			dl_media_MIDI_Write_Mmf_Time(command_time);
			p_media_midi_data->MIDI_mmf_remain_time -= command_time;
			
			*p_media_midi_data->MIDI_mmf_write_pointer = p_media_midi_data->MIDI_mmf_note_on_buffer[0].uc_track;
			dl_media_MIDI_Mmf_Pointer_Inc();
			*p_media_midi_data->MIDI_mmf_write_pointer = p_media_midi_data->MIDI_mmf_note_on_buffer[0].uc_note;
			dl_media_MIDI_Mmf_Pointer_Inc();
			*p_media_midi_data->MIDI_mmf_write_pointer = 0;
			dl_media_MIDI_Mmf_Pointer_Inc();
			for(i=0; p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note!=0xff && i < MMF_MAX_NOTE_NUM; i++)
			{
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note = p_media_midi_data->MIDI_mmf_note_on_buffer[i+1].uc_note;
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_track = p_media_midi_data->MIDI_mmf_note_on_buffer[i+1].uc_track;
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time = p_media_midi_data->MIDI_mmf_note_on_buffer[i+1].i_time;
			}
			return;
		}
		else
		{

⌨️ 快捷键说明

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