📄 chp_dl_media_midi.c
字号:
//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 + -