2012-02-23 59 views
1

我正在嘗試編寫一個Java程序,用於從圖像讀取數據並將其轉換爲MIDI數據。我已經創建了多個音軌,並帶有適當的MIDI音符和音符消息。但是,我也想將連續控制器數據寫入每個軌道(一個未使用的滑塊或旋鈕,而不是諸如modwheel或pitchbend之類的預定通道)。我假設我需要用CONTROL_CHANGE ShortMessage做一些事情,但我可能是錯的。 (http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/ShortMessage.html#CONTROL_CHANGE)。我真的沒有java編程知識來解決這個問題。這是我迄今爲止創建音符開/關MIDI數據。我假設連續的控制器數據將是一個類似的設計。任何幫助,將不勝感激。將連續控制器數據寫入MIDI文件

private static MidiEvent createNoteOnEvent(int nKey, long lTick) 
    { 
     return createNoteEvent(ShortMessage.NOTE_ON, 
           nKey, 
           VELOCITY, 
           lTick); 
    } 

    private static MidiEvent createNoteOffEvent(int nKey, long lTick) 
    { 
     return createNoteEvent(ShortMessage.NOTE_OFF, 
           nKey, 
           0, 
           lTick); 
    } 

    private static MidiEvent createNoteEvent(int nCommand, 
              int nKey, 
              int nVelocity, 
              long lTick) 
    { 
     ShortMessage message = new ShortMessage(); 
     try { 
      message.setMessage(nCommand, 
           0, 
           nKey, 
           nVelocity); 
     } 
     catch (InvalidMidiDataException e) 
     { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
     MidiEvent event = new MidiEvent(message, 
              lTick); 
     return event; 
    } 

    private static void out(String strMessage) 
    { 
     System.out.println(strMessage); 
    } 

回答

1

找出來,以防其他人遇到同樣的問題。十六進制0xB0只是標準的連續控制器數據通道。 17可以輸入,不需要十六進制。其他渠道可以通過谷歌搜索MIDI格式或類似的東西:

private static MidiEvent createCCData(int cc, int val, long lTick) { 
    ShortMessage mm = new ShortMessage(); 
    mm = new ShortMessage(); 
    try { 
     mm.setMessage(0xB0,cc,val); 
    } 
    catch (InvalidMidiDataException e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } 
    MidiEvent me = new MidiEvent(mm,lTick);  
    return me; 
} 
0

pre-defined MIDI CC's如音量,彎音,等等,都只是建議分配,但技術上可以使用任何CC爲您希望一個備用的旋鈕或滑塊。

+0

找出來,以防其他人遇到同樣的問題: – 2012-03-10 19:15:49