📄 mmf2ma1.cpp
字号:
m_phrase_list[track_number][c1].stop_byte |= data0;
}
m_phrase_list[track_number][c1].is_stop_defined = true;
count_in_mspi += 4;
}
}
}
}
// skip until comma or end. Sometimes, this part skips junk data.
while(count_in_mspi < size){
if(get_byte(&data0) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
++count_in_mspi;
if(data0 == ',') break;
}
}
#ifndef NO_MA1_EXCLUSIVE
}else if (memcmp(id,SETUP_CHUNK_ID,4) == 0){
// Read setup information
count_in_setup = 0;
while(count_in_setup < size){
if(get_byte(&data0) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if(data0 == 0xff){
if(get_byte(&data1) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if(data1 != 0xf0){ // Exclusive Message埲奜偺応崌 = NOP
count_in_setup += 2;
}else{ // Exclusive Message偺応崌
if (get_byte(&exclusive_size) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_EXCLUSIVE;
if (read_exclusive(exclusive_size) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_EXCLUSIVE;
count_in_setup += (exclusive_size + 3); // 3 = FF, F0 and size
}
}else{
// illegal format
++count_in_setup;
}
}
#endif
}else{
if (skip_data(size) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_ERROR;
}
count_in_mtr += (size+8);
}
}
// 巆傝偺僠儍儞僋傪僗僉僢僾偡傞丅
while(m_input_pos_abs + 2 < m_toplevel_body_size + 8){ // 僼傽僀儖偺廔椆偵側傞傑偱孞傝曉偡丅俀偼CRC偺俀僶僀僩丄俉偼Chunk Head偺俉僶僀僩
while(1){ // MIDI/FM chunk偑尒偮偐傟偽儖乕僾偐傜敳偗傞丅
if (get_chunk_head(id,&size) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_CHUNK_HEAD;
if (skip_data(size)< MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_ERROR;
}
}
// CRC偺俀僶僀僩傪撉傒崬傓丅
if(get_byte(&data0) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if(get_byte(&data0) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
// 僼傽僀儖僒僀僘偺惍崌惈偺僠僃僢僋
if(m_input_pos_abs != m_toplevel_body_size + 8) return MMF2MA1_E_TOTAL_SIZE;
decide_start_stop();
return MMF2MA1_R_SUCCESSFUL;
}
/********************************************************************
* Name: decide_start_stop
* Function: 嬋慡懱偱偺奐巒丄廔椆埵抲偺寛掕丅
********************************************************************/
MMF2MA1_RESULT MMF2MA1_CLASS_CC decide_start_stop(void){
UINT8 c1;
bool is_first;
UINT16 track;
// phrase偺奐巒丄廔椆埵抲偑偁傞側傜丄偦傟傪奺僩儔僢僋偺奐巒丄廔椆埵抲偵愝掕
if(m_phrase_tag[0] != 0){
// set_phrase()偵傛傝愝掕偝傟偨忣曬偑偁傞側傜偦偪傜傪桪愭偡傞丅
c1 = m_phrase_tag[1] - 'A';
for(track=0;track<MMF_MAX_TRACKS;++track){
if(m_sequence_size[track] == 0) continue; // 僩儔僢僋僨乕僞偑側偄偺偱僗僉僢僾
if(m_phrase_list[track][c1].is_start_defined == true){
assert(m_phrase_list[track][c1].is_stop_defined == true);
m_play_pos_info[track].start_byte = m_phrase_list[track][c1].start_byte;
m_play_pos_info[track].is_start_defined = true;
m_play_pos_info[track].stop_byte = m_phrase_list[track][c1].stop_byte;
m_play_pos_info[track].is_stop_defined = true;
//return MMF2MA1_R_SUCCESSFUL;
}else{
m_play_pos_info[track].is_start_defined = false;
m_play_pos_info[track].is_stop_defined = false;
}
}
}
// 嬋慡懱偱偺奐巒丄廔椆埵抲偺寛掕丅
m_play_pos_info_song.is_start_defined = false;
is_first = true;
for(track=0;track<MMF_MAX_TRACKS;++track){
if(m_sequence_size[track] == 0) continue; // 僩儔僢僋僨乕僞偑側偄偺偱僗僉僢僾
if(m_play_pos_info[track].is_start_defined == true){
if(is_first == true || m_play_pos_info_song.start_byte > m_play_pos_info[track].start_byte ){
m_play_pos_info_song.start_byte = m_play_pos_info[track].start_byte;
m_play_pos_info_song.is_start_defined = true;
m_play_pos_info_song.track = (UINT8)track;
is_first = false;
}
}else{
m_play_pos_info_song.is_start_defined = false;
break;
}
}
m_play_pos_info_song.is_stop_defined = false;
is_first = true;
for(track=0;track<MMF_MAX_TRACKS;++track){
if(m_sequence_size[track] == 0) continue; // 僩儔僢僋僨乕僞偑側偄偺偱僗僉僢僾
if(m_play_pos_info[track].is_stop_defined == true){
if(is_first == true || m_play_pos_info_song.stop_byte < m_play_pos_info[track].stop_byte){
m_play_pos_info_song.stop_byte = m_play_pos_info[track].stop_byte;
m_play_pos_info_song.is_stop_defined = true;
m_play_pos_info_song.track = (UINT8)track;
is_first = false;
}
}else{
m_play_pos_info_song.is_stop_defined = false;
break;
}
}
return MMF2MA1_R_SUCCESSFUL;
}
/********************************************************************
* Name: pass2
* Function: 僠儍儞僱儖悢偺挷嵏
* m_ma1_max_part偵MA1偱巊偆壒悢偑愝掕偝傟傞丅
* m_mmf_track_number, m_mmf_channel_number偵MA1偵曄姺偝傟傞僷乕僩
* 偑MMF偵偁偭偨偲偒偺僩儔僢僋丄僠儍儞僱儖斣崋偑曐懚偝傟傞丅
********************************************************************/
MMF2MA1_RESULT MMF2MA1_CLASS_CC pass2(void){
UINT8 data0; // 擖椡偐傜撉傒崬傫偩僨乕僞傪曐懚偡傞侾僶僀僩偺僶僢僼傽
UINT8 data1; // 擖椡偐傜撉傒崬傫偩僨乕僞傪曐懚偡傞侾僶僀僩偺僶僢僼傽
UINT8 data2; // 擖椡偐傜撉傒崬傫偩僨乕僞傪曐懚偡傞侾僶僀僩偺僶僢僼傽
UINT8 data3; // 擖椡偐傜撉傒崬傫偩僨乕僞傪曐懚偡傞侾僶僀僩偺僶僢僼傽
UINT16 track;
UINT16 ch;
bool is_channel_used[MMF_MAX_CH_PER_TRACK];
int ch_num; // 偡傋偰偺僩儔僢僋傪偲偍偟偰偺僠儍儞僱儖斣崋
UINT8 channel_number; // MMF忋偱偺僠儍儞僱儖斣崋
#ifdef _DEBUG
UINT8 octave_block;
UINT8 note_number;
#endif
int count0; // 0x00傪楢懕偟偰撉傒崬傫偩夞悢
#ifndef NO_MA1_EXCLUSIVE
UINT8 exclusive_size;
#endif
UINT32 duration; // 僔乕働儞僗僨乕僞偺Duration
UINT32 pos_abs;
UINT32 song_start_byte,song_stop_byte;
UINT32 track_start_byte,track_stop_byte;
m_ma1_max_part = 0;
ch_num = 0;
for(track=0;track<MMF_MAX_TRACKS;++track){
for(ch=0;ch<MMF_MAX_CH_PER_TRACK;++ch) is_channel_used[ch] = false;
if(m_sequence_size[track] == 0) continue; // 僩儔僢僋僨乕僞偑側偄偺偱僗僉僢僾
// 僔乕働儞僗僨乕僞偺愭摢偵摢弌偟
if(seek_data(m_sequence_start_pos_abs[track]) == false) return MMF2MA1_E_ERROR;
song_start_byte = m_sequence_start_pos_abs[track] + m_play_pos_info_song.start_byte;
song_stop_byte = m_sequence_start_pos_abs[track] + m_play_pos_info_song.stop_byte;
track_start_byte = m_sequence_start_pos_abs[track] + m_play_pos_info[track].start_byte;
track_stop_byte = m_sequence_start_pos_abs[track] + m_play_pos_info[track].stop_byte;
// 奺僠儍儞僱儖偑巊傢傟偰偄傞偐偄側偄偐傪挷傋傞丅
//奺僠儍儞僱儖偑巊傢傟偰偄傞偐偄側偄偐傪挷傋傞僜乕僗傪嶌惉偡傞両両
// 僨乕僞偺僄儞僪丄傑偨偼0x00偺係楢懕偑専弌偝傟傟偽儖乕僾偐傜敳偗傞丅
pos_abs = 0;
while(m_input_pos_abs < m_sequence_start_pos_abs[track]+m_sequence_size[track]){
//墘憈奐巒埵抲偲廔椆埵抲偺幚帪娫傪奺僩儔僢僋偛偲偵愝掕偡傞丅
if(m_play_pos_info_song.is_start_defined == true
&& m_play_pos_info_song.is_start_time_defined == false
&& track == m_play_pos_info_song.track
&& m_input_pos_abs >= song_start_byte){
m_play_pos_info_song.start_time = pos_abs;
m_play_pos_info_song.is_start_time_defined = true;
}
if(m_play_pos_info_song.is_stop_defined == true
&& m_play_pos_info_song.is_stop_time_defined == false
&& track == m_play_pos_info_song.track
&& m_input_pos_abs >= song_stop_byte){
m_play_pos_info_song.stop_time = pos_abs;
m_play_pos_info_song.is_stop_time_defined = true;
}
if(m_play_pos_info[track].is_start_defined == true
&& m_play_pos_info[track].is_start_time_defined == false
&& m_input_pos_abs == track_start_byte){
m_play_pos_info[track].start_time = pos_abs;
m_play_pos_info[track].is_start_time_defined = true;
}
if(m_play_pos_info[track].is_stop_defined == true
&& m_play_pos_info[track].is_stop_time_defined == false
&& m_input_pos_abs == track_stop_byte){
m_play_pos_info[track].stop_time = pos_abs;
m_play_pos_info[track].is_stop_time_defined = true;
}
// Duration偺撉傒崬傒
count0 = 0;
if(get_duration_gatetime(&duration) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if(duration == 0) ++count0;
pos_abs += duration*m_timebase_d[track];
// Event僨乕僞偺撉傒崬傒
if(get_byte(&data0) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if(data0 == 0x00){ // Control Data
++count0;
if(get_byte(&data1) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if(data1 == 0x00){ // 僔乕働儞僗僨乕僞廔椆偺応崌
if(get_byte(&data2) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if((data1 == 0x00) && (data2 == 0x00) && (count0 == 2)){ // 0x00 0x00 0x00 0x00
break; // while(1) 儖乕僾偐傜敳偗傞
}
// duration != 0x00 && event = 0x00 0x00 0x00偼枹掕媊偱偁傞丅
// duration == 0x00 && event = 0x00 0x00 !0x00偼枹掕媊偱偁傞丅
}else{ // 捠忢偺Control Data偺応崌
channel_number = (data1 & 0xc0)>>6;
// 僐儞僩儘乕儖僨乕僞偺傒偺応崌偵偼曄姺偟側偄偙偲偵偡傞丅
// 嶍彍丗is_channel_used[channel_number] = true;
if((data1 & 0x30) == 0x30){ // Sub ID偁傝偺応崌
if(get_byte(&data2) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
}
}
}else if(data0 == 0xff){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -