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