2012-06-11 51 views
2

我正在構建一個Java應用程序,該程序以編程方式生成一個MIDI序列,然後通過LoopBe Internal Midi Port發送,這樣我就可以使用Ableton Live樂器來獲得更好的聲音播放質量。如何獲得對非默認MIDI音序器的引用?

如果我錯了,請糾正我。我需要的是生成一個Sequence,將包含Tracks將包含MidiEvents,將包含MIDI messages與時間信息。我覺得我失望了。

真正的問題是如何通過LoopBe MIDI端口發送它。爲此,我應該需要一個Sequencer,但我不知道如何得到一個,而不是默認的,我不想這樣。

我想一個解決方法是將序列寫入.mid文件,然後以編程方式在LoopBe端口上播放它。

所以我的問題是:我如何獲得一個非默認的音序器?

+1

可能相關:http://stackoverflow.com/questions/6038917/how-to-play-a-midi-file-in-a-new-thread-in-java – finnw

回答

1

您需要方法MidiSystem.getSequencer(boolean)。當您使用false參數調用它時,它會爲您提供未連接的音序器。

從您的目標MIDI設備獲取Receiver實例,並將其設置爲與seq.getTransmitter().setReceiver(rec)呼叫的音序器。

例片段:

MIDIDevice device = ... // obtain the MIDIDevice instance 
Sequencer seq = MidiSystem.getSequencer(false); 
Receiver rec = device.getReceiver(); 
seq.getTransmitter().setReceiver(rec) 

有關序的使用示例,請參見教程http://docs.oracle.com/javase/tutorial/sound/MIDI-seq-methods.html

1

對於我自己的項目,我用LoopBe1到MIDI信號發送到REAPER。 當然,應該已經安裝了LoopBe1。

在這個例子中,我遍歷系統的MIDI設備爲LoopBe的外部MIDI端口,然後發送筆記C 10次。

import javax.sound.midi.*; 

public class Main { 
    public static void main(String[] args) throws MidiUnavailableException, InvalidMidiDataException, InterruptedException { 
     MidiDevice external; 

     MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo(); 

     //Iterate through the devices to get the External LoopBe MIDI port 

     for (MidiDevice.Info deviceInfo : devices) { 

      if(deviceInfo.getName().equals("LoopBe Internal MIDI")){ 
       if(deviceInfo.getDescription().equals("External MIDI Port")){ 
        external = MidiSystem.getMidiDevice(deviceInfo); 
        System.out.println("Device Name : " + deviceInfo.getName()); 
        System.out.println("Device Description : " + deviceInfo.getDescription() + "\n"); 

        external.open(); 
        Receiver receiver = external.getReceiver(); 
        ShortMessage message = new ShortMessage(); 


        for (int i = 0; i < 10; i++) { 
         // Start playing the note Middle C (60), 
         // moderately loud (velocity = 93). 
         message.setMessage(ShortMessage.NOTE_ON, 0, 60, 93); 
         long timeStamp = -1; 
         receiver.send(message, timeStamp); 
         Thread.sleep(1000); 
        } 

        external.close(); 
       } 
      } 
     } 
    } 
} 

有關發送MIDI信號,參考此鏈接的詳細信息:

https://docs.oracle.com/javase/tutorial/sound/MIDI-messages.html

我希望這有助於!

相關問題