⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmf2ma1.cpp

📁 是使用在雅马哈手机音源
💻 CPP
📖 第 1 页 / 共 5 页
字号:
              // 嵟弶偺僶儞僋曄峏偺傒桳岠
              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 + -