📄 chp_dl_media_midi.c
字号:
/**====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*
dl_media_midi.c
Copyright (c) 2003 by CHIPNUTS Incorporated. All Rights Reserved.
*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/
/**===========================================================================
Revisions of dl_media_midi.c
Version Name Date Description
1.0 Eric 10/26/2004 Initial Version
*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/
#include "chp_dl_media_midi.h"
#include "chp_dl_media_pwr.h"
#include "chp_dl_media_timer_mode.h"
#ifdef CHP_SYSTEM_TEST
extern void dl_media_status_rsp(DL_MEDIA_FILE_TYPE_T type,DL_MEDIA_STATUS_T status);
#endif
UINT16 tick;//zcp_midi
DL_MEDIA_MIDI_DATA_T media_midi_data;
DL_MEDIA_MIDI_DATA_T *p_g_media_midi_data=NULL;
const unsigned char DL_MEDIA_MIDI_format0_head_data[22] =
{
77,84,104,100,0,0,0,6,0,0,0,1,1,224,77,84,114,107,0,0,36,238
};
#ifdef MIDI_MMF_ENABLE
unsigned char MIDI_mmf_format0_head_data[] = {
0x4D,0x54,0x68,0x64,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x01,0xE0,0x4D,0x54,
0x72,0x6B,0x00,0x00,0x31,0x7B,0x00,0xFF,0x03,0x08,0x75,0x6E,0x74,0x69,0x74,0x6C,
0x65,0x6C,0x00,0xFF,0x58,0x04,0x04,0x02,0x18,0x08,0x00,0xFF,0x59,0x02,0x00,0x00,
0x00,0xFF,0x51,0x03
};
#endif
/* internal function begine */
void dl_media_midi_write_data(unsigned long addr_index, unsigned char Data)
{
IOU_OUT(addr_index,(unsigned short)Data);
}
unsigned char dl_media_midi_read_data(unsigned long addr_index)
{
unsigned short retData;
IOU_IN(addr_index,retData);
return ((unsigned char)retData);
}
UINT32 dl_media_midi_get_block_length (unsigned char * length_pointer)
{
int i;
unsigned long ret_length=0;
for(i=0; i<4; i++)
{
ret_length+=length_pointer[i]<<(i*8);
}
return (ret_length);
}
UINT32 dl_media_midi_get_block_length_high_low(unsigned char * length_pointer)
{
int i;
UINT32 ret_length=0;
for(i=0; i<4; i++)
{
ret_length+=length_pointer[i]<<((3-i)*8);
}
return (ret_length);
}
void dl_media_midi_pointer_inc(void)
{
DL_MEDIA_MIDI_DATA_T *p_media_midi_data;
p_media_midi_data =p_g_media_midi_data;
p_media_midi_data->write_pointer++;
if(p_media_midi_data->write_pointer>=p_media_midi_data->buffer_end)
{
p_media_midi_data->write_pointer = p_media_midi_data->buffer_start;
}
}
void dl_media_midi_format1_init(unsigned char * format1_pointer, DL_MEDIA_MIDI_DATA_T *p_media_midi_data)
{
unsigned long time_event;
unsigned char midi_data;
unsigned long track_size_prev;
int i=0;
p_media_midi_data->write_pointer = p_media_midi_data->buffer_start;
p_media_midi_data->read_pointer = p_media_midi_data->buffer_start;
p_media_midi_data->buffer_end = p_media_midi_data->buffer_start+IMUSIC_SCORE_INT_COUNT*2+IMUSIC_MIDI_COMMAND_MAX_SIZE;
p_media_midi_data->time_sum_prev=0;
for(i=0; i<22; i++)
{
*p_media_midi_data->write_pointer = DL_MEDIA_MIDI_format0_head_data[i];
dl_media_midi_pointer_inc();
}
*(p_media_midi_data->write_pointer-10) = format1_pointer[12];
*(p_media_midi_data->write_pointer-9) = format1_pointer[13];
//................................................................................//zcp_midi
tick=format1_pointer[12];
tick<<=8;
tick+=format1_pointer[13];
if(tick>=0x03C0)
{
*(p_media_midi_data->write_pointer-10) = 0x01;
*(p_media_midi_data->write_pointer-9) = 0xE0;
}
//.................................................................................
i=0;
track_size_prev=0x12;
p_media_midi_data->track_num = format1_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+format1_pointer;
p_media_midi_data->track_size[i] = dl_media_midi_get_block_length_high_low(format1_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++)
{
p_media_midi_data->time_sum_count[i]=0;
p_media_midi_data->track_end_bit|=1<<i;
}
i=0;
while( i<p_media_midi_data->track_num)
{
p_media_midi_data->time_sum_count[i]=0;
time_event = 0;
do
{
midi_data = *p_media_midi_data->track_pointer[i];
p_media_midi_data->track_pointer[i]++;
time_event<<=7;
time_event +=midi_data & 0x7F;
}while( midi_data >= 0x80 );
p_media_midi_data->time_sum_count[i] += time_event;
i++;
}
}
//zcp_midi
UINT8 chp_get_time(UINT8 **pp_data, UINT32 *p_time)
{
UINT8 data, i;
UINT8 *p_data = *pp_data;
UINT32 time = 0;
for ( i = 0; ; i++)
{
data = *p_data++;
time += data & 0x7f;
if (data >= 0x80)
{
if (i == 3)
{
return 0xfa;
}
time <<= 7;
}
else
{
break;
}
}
*p_time = time;
*pp_data = p_data;
return 0x00;
}
void dl_media_midi_format1_write_cmd(DL_MEDIA_MIDI_DATA_T *p_media_midi_data)
{
unsigned long time_event;
unsigned char midi_time[5];
unsigned char midi_data;
unsigned char track_cur;
unsigned char command_event=0xFF;
unsigned char temp;
int i=0;
UINT32 temp1;//zcp_midi
track_cur=0;
//find min time
for(i=0; i< p_media_midi_data->track_num; i++)
{
if(p_media_midi_data->time_sum_count[track_cur] > p_media_midi_data->time_sum_count[i])
{
track_cur=i;
}
}
//decode time
for(i=0; i<4; i++)
{
midi_time[i]=0;
}
time_event = p_media_midi_data->time_sum_count[track_cur] - p_media_midi_data->time_sum_prev;
p_media_midi_data->time_sum_prev = p_media_midi_data->time_sum_count[track_cur];
for(i=0; i<4 && (time_event!=0); i++)
{
if(time_event >=0x80 )
{
midi_time[i+1] |=0x80;
}
midi_time[i] |= time_event & 0x7F;
time_event >>= 7;
}
if(i!=0)
{
i--;
}
do
{
*p_media_midi_data->write_pointer = midi_time[i];
dl_media_midi_pointer_inc();
}while(i--);
// sys_printf("333write_pointer=0x%x,read_pointer=0x%x\n",p_media_midi_data->write_pointer,p_media_midi_data->read_pointer);
midi_data = *p_media_midi_data->track_pointer[track_cur];
command_event = midi_data;
if( (midi_data != 0xFF) && (midi_data != 0xF0) && (midi_data >= 0x80) )
{
command_event = command_event & 0xF0;
}
// sys_printf("command_event=0x%x\n",command_event);
switch(command_event)
{
case 0xFF:
p_media_midi_data->track_command[track_cur] = midi_data;
if(*(p_media_midi_data->track_pointer[track_cur]+1) == 0x2F) // mtrk end
{
*p_media_midi_data->write_pointer = 0xB0;
dl_media_midi_pointer_inc();
p_media_midi_data->track_pointer[track_cur]++;
*p_media_midi_data->write_pointer = 0x20;
dl_media_midi_pointer_inc();
p_media_midi_data->track_pointer[track_cur]++;
*p_media_midi_data->write_pointer = 0x00;
dl_media_midi_pointer_inc();
p_media_midi_data->track_pointer[track_cur]++;
p_media_midi_data->time_sum_count[track_cur] = 0xFFFFFFFF;
p_media_midi_data->track_end_bit &= ~(1 << track_cur);
break;
}
*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]++;
temp=*p_media_midi_data->track_pointer[track_cur];
if(temp > 0x10)
{
*p_media_midi_data->write_pointer = 0;
dl_media_midi_pointer_inc();
p_media_midi_data->track_pointer[track_cur]+=temp+1;
break;
}
for(i=0; i<= temp; i++)
{
*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;
//................................................................................//zcp_midi
case 0xF0:
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]++;
if(*p_media_midi_data->track_pointer[track_cur] >= 0x80)
{
chp_get_time(&p_media_midi_data->track_pointer[track_cur], &temp1);
if(temp1<=0x7F)
{
p_media_midi_data->track_pointer[track_cur] -=1;
}
else if(temp1<=0x3FFF)
{
p_media_midi_data->track_pointer[track_cur] -=2;
}
else
{
p_media_midi_data->track_pointer[track_cur] -=3;
}
for(i=0; i<= (temp1+1); i++)
{
*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;
}
else
{
temp=*p_media_midi_data->track_pointer[track_cur];
for(i=0; i<= temp; i++)
{
*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 0x80:
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 0x90:
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 0xE0:
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 0xC0:
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -