2017-05-31 53 views
0

我正試圖從midi文件的第一首曲目中提取旋律的速度,並將其應用於包含音符事件的曲目的其餘部分。如何將從軌道1提取的速度應用於MIDI文件的其他軌道?

從根本上講,我一直試圖在noteOn()消息之後替換Thread.sleep()方法,該消息每次播放固定時間間隔的音符。因此我正在失去整個賽道的節奏。

我從以前提出的問題How does Midi TEMPO message apply to other tracks?的第一首曲目中成功提取節奏信息,但無法將其應用於其餘曲目。

是否有一個特定的功能呢?我嘗試搜索,但找不到一個。

這裏是我的代碼供參考。

 int trackNumber = 0; 

    for (Track track : sequence.getTracks()) { 

     trackNumber++;   
     System.out.println(); 
     for (int i=0; i < track.size(); i++) { 

      MidiEvent event = track.get(i); 
      MidiMessage message = event.getMessage(); 

      if (message instanceof MetaMessage) { 

      MetaMessage mm = (MetaMessage) message; 
      if(mm.getType()==SET_TEMPO){ 

       byte[] data = mm.getData(); 
       int tempo = (data[0] & 0xff) << 16 | (data[1] & 0xff) << 8 | (data[2] & 0xff); 
       int bpm = 60000000/tempo; 
      } 
      } 

      if (message instanceof ShortMessage) { 
       ShortMessage sm = (ShortMessage) message; 
       if (sm.getCommand() == NOTE_ON) { 

        int key = sm.getData1(); 
        int velocity = sm.getData2();      
        channels[0].noteOn(key,velocity); 
        Thread.sleep(280);//Pays all the note for fixed duration  
       } 
       else if (sm.getCommand() == NOTE_OFF) { 

        int key = sm.getData1(); 
        int velocity = sm.getData2(); 
        channels[0].noteOff(key); 

       } 
      } 
     } 

     System.out.println(); 
    } 
} 
+0

只需從第一個軌道克隆SetTempo事件並[add](https://docs.oracle.com/javase/7/docs/api/javax/sound/midi/Track.html#add(javax.sound。 midi.MidiEvent))將實例複製到具有相同時間戳的其他軌道。 – Maxim

回答

0

多個曲目中的事件同時發生,因此您無法單獨處理曲目。

你必須

  • 把所有事件到一個列表或者和自己所時間戳進行排序(但要確保使用相同的時間戳事件保持它們的順序,所以使用穩定的排序算法);或
  • 具有每個軌道的當前位置,並且當確定哪個事件是下一個事件時,在所有軌道中搜索具有最小時間戳的尚未使用的事件。

請注意,速度可以在播放過程中更改,因此單個bpm值不足。請參閱How to correctly convert MIDI ticks to milliseconds?How can I parse a tempo of midi using Java?

+0

從我所瞭解的情況來看,在按照它們的時間戳值對事件進行排序後,我應該將從它評估的增量時間值作爲參數傳遞給'Thread.sleep(millisec)'函數。讓我知道這是你一直試圖解釋的。謝謝。 – BitWriter

+0

滴答不是毫秒,而且滴答時間在單個軌道中的事件之間。排序後,您必須再次計算相鄰事件之間的計時器間隔。 –