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

📄 chp_dl_media_midi.c

📁 C625 midi播放源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			//continue next command
			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].i_time -= p_media_midi_data->MIDI_mmf_remain_time;
			}
			dl_media_MIDI_Write_Mmf_Time(p_media_midi_data->MIDI_mmf_remain_time);
			p_media_midi_data->MIDI_mmf_remain_time = -1;
		}
	}
	
	//decode one command
	switch ( (*p_media_midi_data->MIDI_mmf_pointer) & 0xF0 )
	{
	case 0x80:
		command_track = *p_media_midi_data->MIDI_mmf_write_pointer = (*p_media_midi_data->MIDI_mmf_pointer++)|0x10;//8n >> 9n
		dl_media_MIDI_Mmf_Pointer_Inc();
		command_note = *p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = command_volume;
		dl_media_MIDI_Mmf_Pointer_Inc();
		command_time = dl_media_MIDI_Read_Time(&p_media_midi_data->MIDI_mmf_pointer);
		i=0;
		while( (p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note!=0xFF) && (i<MMF_MAX_NOTE_NUM) )
		{
			if(p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time > command_time)
			{
				command_track_pre = p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_track;
				command_note_pre =p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note;
				command_time_pre = p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time;
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_track = command_track;
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note = command_note;
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time =  command_time;
				command_track = command_track_pre;
				command_note = command_note_pre;
				command_time = command_time_pre;
			}
			i++;
		}
		if(i < MMF_MAX_NOTE_NUM)//play note number must < MMF_MAX_NOTE_NUM
		{
			p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_track = command_track;
			p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note = command_note;
			p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time =  command_time;
		}
		break;
	case 0x90:
		command_track = *p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		command_note = *p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		command_volume = *p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		command_time = dl_media_MIDI_Read_Time(&p_media_midi_data->MIDI_mmf_pointer);
		i=0;
		while( (p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note!=0xFF) && (i<MMF_MAX_NOTE_NUM) )
		{
			if(p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time > command_time)
			{
				command_track_pre = p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_track;
				command_note_pre = p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note;
				command_time_pre = p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time;
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_track = command_track;
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note = command_note;
				p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time =  command_time;
				command_track = command_track_pre;
				command_note = command_note_pre;
				command_time = command_time_pre;
			}
			i++;
		}
		if(i < MMF_MAX_NOTE_NUM)//play note number must < MMF_MAX_NOTE_NUM
		{
			p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_track = command_track;
			p_media_midi_data->MIDI_mmf_note_on_buffer[i].uc_note = command_note;
			p_media_midi_data->MIDI_mmf_note_on_buffer[i].i_time =  command_time;
		}
		break;
	case 0xa0:
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		break;
	case 0xb0:
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		break;
	case 0xc0:
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		break;
	case 0xd0:
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		break;
	case 0xe0:
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
		dl_media_MIDI_Mmf_Pointer_Inc();
		break;
	case 0xf0:
		if(*p_media_midi_data->MIDI_mmf_pointer==0xf0)
		{
			while((*p_media_midi_data->MIDI_mmf_pointer)!=0xF7)
			{
				*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
				dl_media_MIDI_Mmf_Pointer_Inc();
			}
			*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
			dl_media_MIDI_Mmf_Pointer_Inc();
			break;
		}
		else if(*p_media_midi_data->MIDI_mmf_pointer==0xff)
		{
			*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
			dl_media_MIDI_Mmf_Pointer_Inc();
			if(*p_media_midi_data->MIDI_mmf_pointer == 0x2F)
			{//midi end
				*p_media_midi_data->MIDI_mmf_write_pointer = *p_media_midi_data->MIDI_mmf_pointer++;
				dl_media_MIDI_Mmf_Pointer_Inc();
				p_media_midi_data->MIDI_mmf_end_flg = 1;
			}
			else
			{
				*p_media_midi_data->MIDI_mmf_write_pointer = 0;
				dl_media_MIDI_Mmf_Pointer_Inc();
			}
			p_media_midi_data->MIDI_mmf_pointer++;
			*p_media_midi_data->MIDI_mmf_write_pointer = 0;
			dl_media_MIDI_Mmf_Pointer_Inc();
		}
	default:
		break;
	}
}
#endif
/**********************************************************************************************
FUNCTION: 	MIDI_Read_Time(unsigned char **time_pointer)

DESCRIPTION: 	read time unit
  
INPUT PARAMETER:	unsigned char **time_pointer	
	
OUTPUT PARAMETER:  	null
	  
RETURN VALUE:	null
***********************************************************************************************/
unsigned int dl_media_MIDI_Read_Time(unsigned char **time_pointer)
{
	unsigned int ret_time = 0;
	while(**time_pointer&0x80)
	{
		ret_time = (ret_time <<7) +((**time_pointer)&0x7f);
		(*time_pointer)++;
	}
	ret_time = (ret_time <<7) +((**time_pointer)&0x7f);
	(*time_pointer)++;
	return (ret_time);
}
#ifdef MIDI_MMF_ENABLE
/**********************************************************************************************
FUNCTION: 	MIDI_Write_Mmf_Time(unsigned char **time_pointer)
	
DESCRIPTION: 	read time unit
		  
INPUT PARAMETER:	unsigned int time	
			
OUTPUT PARAMETER:  	null
			  
RETURN VALUE:	null
***********************************************************************************************/
void dl_media_MIDI_Write_Mmf_Time(unsigned int time)
{
	unsigned int ui_time = time;
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;//added by tomybao.
	
	if(ui_time>0x8000)
	{
		*p_media_midi_data->MIDI_mmf_write_pointer = (ui_time >>14)&0x7f;
		*p_media_midi_data->MIDI_mmf_write_pointer |= 0x80;
		dl_media_MIDI_Mmf_Pointer_Inc();
	}
	if(ui_time>0x80)
	{
		*p_media_midi_data->MIDI_mmf_write_pointer = (ui_time >>7)&0x7f;
		*p_media_midi_data->MIDI_mmf_write_pointer |= 0x80;
		dl_media_MIDI_Mmf_Pointer_Inc();
	}
	*p_media_midi_data->MIDI_mmf_write_pointer = ui_time &0x7f;
	dl_media_MIDI_Mmf_Pointer_Inc();
}

/**********************************************************************************************
FUNCTION: 	MIDI_Mmf_Pointer_Inc
		
DESCRIPTION: 	MIDI_mmf_write_pointer inceate loop .
		  
INPUT PARAMETER:	null	
			
OUTPUT PARAMETER:  	null
			  
RETURN VALUE:	null 
***********************************************************************************************/
void dl_media_MIDI_Mmf_Pointer_Inc()
{
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data=p_g_media_midi_data;//added by tomybao.
	
	p_media_midi_data->MIDI_mmf_write_pointer++;
	if(p_media_midi_data->MIDI_mmf_write_pointer>=p_media_midi_data->MIDI_mmf_buffer_end)
	{
		p_media_midi_data->MIDI_mmf_write_pointer = p_media_midi_data->MIDI_mmf_buffer_start;
	}
}
#endif
/*===========================================================
FUNCTION dl_media_midi_reset

DESCRIPTION
	This function will reset MIDI module.
  
INPUT PARAMETER
	NULL
	
OUTPUT PARAMETER   
	NULL
	
RETURN VALUE
	DL_MEDIA_RET_SUCCESS
	DL_MEDIA_RET_MIDI_INIT_FAIL
===========================================================*/
DL_MEDIA_RET_T dl_media_midi_reset(void)
{
	UINT16 status;
	UINT16 rst;
	
	/* soft reset */
	IOU_IN(IOU_SW_RESET_CTRL,rst);
	IOU_OUT(IOU_SW_RESET_CTRL, rst|0x40);
	IOU_OUT(IOU_SW_RESET_CTRL, rst & 0xffbf);
	dl_media_delay(10);
	/* Analog Select open stero output */
	//IOU_OUT(IMUSIC_ANALOG_SELECT,0xfe);	
	IOU_OUT(IMUSIC_FIFO_CLR,0x07);
	IOU_OUT(IMUSIC_FIFO_CLR,0x00);

	 IOU_OUT(IMUSIC_EVENT_L, 0x10);
	 IOU_OUT(IMUSIC_EVENT_H, IMUSIC_EVENT_FIFO_COUNT);
	
	/* check if the three fifo empty! */
	IOU_IN(IMUSIC_FIFO_STATUS,status)
	if(status!=MIDI_FIFO_EMPTY)
	{
		sys_printf("********222***error********** \n");
		return DL_MEDIA_RET_MIDI_INIT_FAIL;
	}

	dl_media_memset(&media_midi_data,0,sizeof(DL_MEDIA_MIDI_DATA_T));
	
	p_g_media_midi_data =&media_midi_data;
	
	return DL_MEDIA_RET_SUCCESS;
}

/*===========================================================
FUNCTION dl_media_midi_init_for_kara

DESCRIPTION
	This function will called before Karaoke playing.
  
INPUT PARAMETER
	NULL
	
OUTPUT PARAMETER   
	NULL
	
RETURN VALUE
	DL_MEDIA_RET_SUCCESS
	DL_MEDIA_RET_FAIL
===========================================================*/
DL_MEDIA_RET_T dl_media_midi_init_for_kara(void)
{
	if(dl_media_midi_init() == DL_MEDIA_RET_SUCCESS) return DL_MEDIA_RET_SUCCESS;
	return DL_MEDIA_RET_FAIL;
}

/*===========================================================
FUNCTION dl_media_midi_init

DESCRIPTION
	This function will initialize the MIDI module.
  
INPUT PARAMETER
	NULL
	
OUTPUT PARAMETER   
	NULL
	
RETURN VALUE
	DL_MEDIA_RET_SUCCESS
	DL_MEDIA_RET_MIDI_INIT_FAIL
===========================================================*/
DL_MEDIA_RET_T dl_media_midi_init(void)
{
	DL_MEDIA_RET_T ret;
	DL_MEDIA_MIDI_DATA_T *p_media_midi_data;

	ret =dl_media_midi_reset();

	p_media_midi_data=p_g_media_midi_data;
	if(ret) return ret;

	 IOU_OUT(IMUSIC_SCORE_L, 0x7f);
	 IOU_OUT(IMUSIC_SCORE_H, IMUSIC_SCORE_FIFO_COUNT);
	 	 
	return DL_MEDIA_RET_SUCCESS;
}

/*===========================================================
FUNCTION dl_media_midi_callback

DESCRIPTION
	This function will called when MIDI interrupt occus.
  
INPUT PARAMETER
	NULL
	
OUTPUT PARAMETER   
	NULL
	
RETURN VALUE
	NULL
===========================================================*/
void dl_media_midi_callback(void *para)
{
	dl_media_midi_interrupt_handle();
}


/*===========================================================
FUNCTION dl_media_midi_play

DESCRIPTION
	This function play MIDI buffer.
  
INPUT PARAMETER
	MEDIA_MUSIC_INFO_T *p_midi_info 		MIDI infomation, include MIDI buffer, and MIDI size
	MEDIA_MIDI_ADP_CALLBACK *callback 	MIDI interrupt callback function, 
							if this patameter is NULL, the function will play MIDI by polling mode
	void *para 							the parameter of the callback function
	
OUTPUT PARAMETER   
	NULL
	
RETURN VALUE
	DL_MEDIA_RET_SUCCESS,
	DL_MEDIA_RET_FAIL,
	DL_MEDIA_RET_MIDI_FILE_FORMAT_ERR,
	DL_MEDIA_RET_MIDI_FILE_SIZE_ERROR,
===========================================================*/
DL_MEDIA

⌨️ 快捷键说明

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