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