📄 mmf2ma1.cpp
字号:
// 嵟弶偺僶儞僋曄峏偺傒桳岠
if(m_bank_change[vn] == 0xff){ // 枹愝掕偺偲偒偼0xff偵側偭偰偄傞
assert(data2 <= 0x7f);
m_bank_change[vn] = data2;
}
}else if(sub_id == 0x07){ // xxxx0111偼volume
vn = get_part_number(track,channel_number);
#ifdef _DEBUG
printf("IN: volume change: track = %d, channel = %d, volume = %d\n",track,channel_number,data2);
#endif
// 嵟弶偺儃儕儏乕儉曄峏偺傒桳岠
if(m_volume_change[vn] == 0xff){ // 枹愝掕偺偲偒偼0xff偵側偭偰偄傞
assert(data2 <= 0x7f);
m_volume_change[vn] = data2;
}
}
}
}
}else if(data0 == 0xff){
if(get_byte(&data1) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if(data1 != 0xf0){ // Exclusive Message埲奜偺応崌
}else{ // Exclusive Message偺応崌
// 愭摢偵偁傞僒僀僘傪撉傒崬傒丄偦偺僶僀僩悢僗僉僢僾偡傞丅
if (get_byte(&data2) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_EXCLUSIVE;
if (skip_data(data2) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_EXCLUSIVE;
}
}else{ // Note Messages(0x00 < data0 < 0xff)
if(get_duration_gatetime(&gatetime) < MMF2MA1_R_SUCCESSFUL) return MMF2MA1_E_GET_DATA;
if((gatetime != 0)
&& (m_play_pos_info[track].is_start_time_defined == false || m_play_pos_info[track].start_time <= pos_abs)
&& (m_play_pos_info[track].is_stop_time_defined == false || m_play_pos_info[track].stop_time > pos_abs)
){
channel_number = (data0 & 0xc0)>>6;
octave_block = (data0 & 0x30)>>4;
note_number = (data0 & 0x0f);
part_number = (UINT8)get_part_number(track,channel_number);
key = (SINT16)104+m_program_octave_shift[part_number]+octave_block*12 + note_number - 1;
if(m_min_note[part_number] > key) m_min_note[part_number] = key;
if(m_max_note[part_number] < key) m_max_note[part_number] = key;
}
}
}
prev_track_number = track; // 崱夞張棟偟偰偄偨僩儔僢僋斣崋傪婰榐偡傞丅
}
// 壒怓偑巜掕偝傟偰偄側偐偭偨応崌偺僨僼僅儖僩壒怓偺愝掕
// 壒怓斣崋侽丄僶儞僋斣崋侽偵愝掕偡傞丅
for(i=0;i<m_ma1_max_part;++i){
if(m_program_change[i] == 0xff) m_program_change[i] = 0x00;
if(m_bank_change[i] == 0xff) m_bank_change[i] = 0x00;
}
#ifdef _DEBUG
for(i=0;i<m_ma1_max_part;++i){
printf("IN: part #%d:\n",i);
printf("IN: min note = %d\tmax note = %d\n",m_min_note[i],m_max_note[i]);
}
#endif
return MMF2MA1_R_SUCCESSFUL;
}
/********************************************************************
* Name: pass4
* Function: 暘夝擻偺挷嵏
********************************************************************/
MMF2MA1_RESULT MMF2MA1_CLASS_CC pass4(void){
// TODO: 偙偙偵暘夝擻傪挷嵏偡傞僐乕僪傪嶌惉偡傞梊掕
// Duration偲Gatetime傪應掕偡傞丅
return MMF2MA1_R_SUCCESSFUL;
}
/********************************************************************
* Name: tempo_time_base_decision
* Function: MA1偺tempo, timebase傪寛掕偡傞丅
********************************************************************/
MMF2MA1_RESULT MMF2MA1_CLASS_CC tempo_time_base_decision(void){
#ifdef TEMPO_TEST
m_ma1_tempo_reg = Tempo_register;
#else
#ifdef NO_MA1_EXCLUSIVE
m_ma1_tempo_reg = 30;
#else
// Exclusive data偵YAMAHA,MA-1偺僥儞億愝掕偑偁傟偽丄偦偺抣傪巊偆
// 僥儞億偑愝掕偝傟偰偄傞応崌偵偼丄SMF偺暘夝擻偼24偱偁傞偲偄偆婯掕偑偁傞丅
if(m_ma1_exclusive.is_tempo_defined == false){
m_ma1_tempo_reg = 30;
}else{
m_ma1_tempo_reg = m_ma1_exclusive.tempo;
}
#endif
#endif
return MMF2MA1_R_SUCCESSFUL;
}
/********************************************************************
* Name: ma1_header_output
* Function: MA1僼僅乕儅僢僩僨乕僞偺僿僢僟晹暘(妝晥僨乕僞偺慜亖僐儞僩
* 儘乕儖傑偱)傪弌椡偡傞丅
* Assumption: 偙偺娭悢傪屇傃弌偡慜偵僥儞億儗僕僗僞m_tempo_reg偵愝掕偝傟偰偄傞丅
* 僆僋僞乕僽偺僔僼僩検亖m_note_shift[]偑偡偱偵愝掕偝傟偰偄傞丅
********************************************************************/
MMF2MA1_RESULT MMF2MA1_CLASS_CC ma1_header_output(void){
UINT8 data;
UINT8 *pdata_org;
UINT8 pdata[INTERNAL_VOICE_PARA_NUM];
int i,j,k;
UINT8 control[18] = {0x32,0x10,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
UINT8 ms; // multiple setting register
UINT8 ml_m, ml_c;
UINT8 tl543210,tl54,tl3210;
#ifndef NO_MA1_EXCLUSIVE
UINT8 user_voice_num;
#endif
//#ifdef MA1_OUTPUT
// 僼傽僀儖ID側偳偺弌椡
// MA-1僼僅乕儅僢僩梡偺僒僀僘偺僟儈乕
data = 0x00;
#if defined(mycplusplus)
m_p_conv_out->input_data(&data,1);
#else
(*(m_p_conv_out->input_data))(&data,1);
#endif
data = 0x00;
#if defined(mycplusplus)
m_p_conv_out->input_data(&data,1);
#else
(*(m_p_conv_out->input_data))(&data,1);
#endif
// 壒怓僷儔儊乕僞偺弌椡
for(j=0;j<MA1_MAX_PART;++j){
// 巊傢傟偰偄側偄僠儍儞僱儖偺壒怓偼僠儍儞僱儖侽偲摨偠偵偡傞丅
if(j >= m_ma1_max_part){
i = 0;
}else{
i = j;
}
#if defined(NO_MA1_EXCLUSIVE)
#if defined(mycplusplus)
m_p_conv_in->output_voice_parameter(m_program_change[i],m_bank_change[i],(void **)(&pdata_org));
#else
(*(m_p_conv_in->output_voice_parameter))(m_program_change[i],m_bank_change[i],(void **)(&pdata_org));
#endif
#else
if(get_user_voice_num(m_bank_change[i],m_program_change[i],&user_voice_num) == true){
// 儐乕僓乕壒怓偑撉傒崬傑傟偰偄傞応崌偵偼偦偺僨乕僞傪巊偆
pdata_org = m_ma1_exclusive.voice_para[user_voice_num];
}else{
#if defined(mycplusplus)
m_p_conv_in->output_voice_parameter(m_program_change[i],m_bank_change[i],(void **)(&pdata_org));
#else
(*(m_p_conv_in->output_voice_parameter))(m_program_change[i],m_bank_change[i],(void **)(&pdata_org));
#endif
}
#endif
for(k=0;k<INTERNAL_VOICE_PARA_NUM;++k) pdata[k] = pdata_org[k];
// 儅儖僠僾儖偺愝掕 m_note_shift[]偼昁偢侾俀偺攞悢偱偁傞丅
assert(m_note_shift[i] == -12 || m_note_shift[i] == 0 || m_note_shift[i] == 12 || m_note_shift[i] == 24);
ms = pdata[8+((m_note_shift[i]+12)/12)];
ml_m = ((ms >> 4) & 0x07) << 5;
ml_c = (ms & 0x07) << 5;
pdata[0] &= 0x1f;
pdata[0] |= ml_m;
pdata[4] &= 0x1f;
pdata[4] |= ml_c;
// Volume Change偺斀塮
if(m_volume_change[i] != 0xff){
tl543210 = Mmfvol2ma1vol[m_volume_change[i]];
tl3210 = ((tl543210 & 0x0f) << 4);
tl54 = (tl543210>> 4);
pdata[7] &= 0x0f;
pdata[7] |= tl3210;
pdata[6] &= 0xfc;
pdata[6] |= tl54;
}
#if defined(mycplusplus)
m_p_conv_out->input_data(pdata,8);
#else
(*(m_p_conv_out->input_data))(pdata,8);
#endif
}
for(i=0;i<32;++i){
data = 0x00;
#if defined(mycplusplus)
m_p_conv_out->input_data(&data,1);
#else
(*(m_p_conv_out->input_data))(&data,1);
#endif
}
// 僐儞僩儘乕儖僨乕僞偺弌椡
control[3] = m_ma1_tempo_reg; // 僥儞億儗僕僗僞偺彂偒姺偊
#if defined(mycplusplus)
m_p_conv_out->input_data(control,18);
#else
(*(m_p_conv_out->input_data))(control,18);
#endif
return MMF2MA1_R_SUCCESSFUL;
}
/********************************************************************
* Name: ma1_tail_output
* Function: MA1僼僅乕儅僢僩僨乕僞偺枛旜晹暘傪弌椡偡傞丅
* Assumption: 偙偺娭悢傪屇傃弌偡慜偵僥儞億儗僕僗僞m_tempo_reg偵愝掕偝傟偰偄傞丅
* 僆僋僞乕僽偺僔僼僩検亖m_note_shift[]偑偡偱偵愝掕偝傟偰偄傞丅
********************************************************************/
MMF2MA1_RESULT MMF2MA1_CLASS_CC ma1_tail_output(void){
//#ifdef MA1_OUTPUT
// 壗傕弌椡偟側偄丅
/*****
#else
// 廔椆俬俢 0x00,0x00傪弌椡偡傞丅
UINT8 buf[2];
buf[0] = 0x00;
buf[1] = 0x00;
#if defined(mycplusplus)
m_p_conv_out->input_data(buf,2);
#else
(*(m_p_conv_out->i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -