###前提・実現したいこと
ハードウェアシンセサイザー(FA06)でCC90を入力したら、midiファイルをそのシンセイザーで発声するというプログラムを作ろうとしています。
###発生している問題・エラーメッセージ
midiファイルを再生した時に音源がシンセサイザーではなくwindows標準のmsgsで発声されてしまいます
###該当のソースコード
Java
1package FA06MidiControl; 2 3import java.io.File; 4 5import javax.sound.midi.MidiDevice; 6import javax.sound.midi.MidiMessage; 7import javax.sound.midi.MidiSystem; 8import javax.sound.midi.MidiUnavailableException; 9import javax.sound.midi.Receiver; 10import javax.sound.midi.Sequence; 11import javax.sound.midi.Sequencer; 12import javax.sound.midi.ShortMessage; 13import javax.sound.midi.Transmitter; 14 15public class MidiControl implements Receiver { 16 static int DEVICE_IN = 0; 17 static int DEVICE_OUT = 0;// ここを修正 18 19 public boolean isOnCC90 = false; 20 public final int PEDAL_MARGIN = 64; 21 22 private MidiDevice.Info[] info; 23 private MidiDevice in_device = null; 24 private MidiDevice out_device = null; 25 26 public Sequencer sequencer; 27 // public static File file = new 28 // File("D:/workspace/midi/midi/moonpride/init.mid"); // midiファイルのディレクトリ指定 29 public static File file = new File("D:/workspace/midi/midi/ceremo.mid"); // midiファイルのディレクトリ指定 30 31 public static void main(String[] args) { 32 new MidiControl(); 33 34 } 35 36 public MidiControl() { 37 info = MidiSystem.getMidiDeviceInfo(); 38 MidiDevice dev = null; 39 40 for (int i = 0; i < info.length; i++) { 41 if (info[i].getName().equals("FA-06 08")) { 42 DEVICE_IN = i; 43 break; 44 } 45 } 46 47 for (int i = 0; i < info.length; i++) { 48 if (info[i].getName().equals("FA-06 08")) { 49 DEVICE_OUT = i; 50 break; 51 } 52 } 53 54 try { 55 dev = MidiSystem.getMidiDevice(info[DEVICE_IN]); 56 } catch (Throwable t) { 57 System.err.println(t); 58 } 59 connectMidiIn(dev); 60 61 try { 62 dev = MidiSystem.getMidiDevice(info[DEVICE_OUT]); 63 } catch (Throwable t) { 64 System.err.println(t); 65 } 66 connectMidiOut(dev); 67 68 connectSequencer(); 69 } 70 71 private void connectMidiIn(MidiDevice device) { 72 try { 73 device.open(); 74 Transmitter tx = device.getTransmitter(); 75 tx.setReceiver(this); 76 in_device = device;// トランスミッターにコンストラクタで生成している自身の参照を渡し、レシーバーとして設定 77 } catch (MidiUnavailableException e) { 78 System.err.println(e); 79 } 80 81 } 82 83 private void connectMidiOut(MidiDevice device) { 84 try { 85 device.open(); 86 out_device = device; 87 } catch (MidiUnavailableException e) { 88 System.err.println(e); 89 } 90 } 91 92 public void connectSequencer() { 93 try { 94 sequencer = MidiSystem.getSequencer(); 95 sequencer.setLoopCount(1); 96 sequencer.open(); 97 } catch (Throwable t) { 98 System.err.println(t); 99 } 100 101 try { 102 Sequence sequence = MidiSystem.getSequence(file); 103 sequencer.setSequence(sequence);// 音源セット 104 } catch (Throwable t) { 105 System.err.println(t); 106 } 107 108 try { 109 sequencer.getTransmitter().setReceiver(out_device.getReceiver()); 110 } catch (MidiUnavailableException e) { 111 System.err.println(e); 112 } 113 } 114 115 public void close() { 116 } 117 118 public void send(MidiMessage message, long timeStamp) { 119 if (message instanceof ShortMessage) { 120 ShortMessage sm = (ShortMessage) message; 121 switch (sm.getCommand()) { 122 case ShortMessage.CONTROL_CHANGE: 123 System.out.println(sm.getData1() + " " + sm.getData2()); 124 if (sm.getData1() == 90) { 125 if (sm.getData2() == 0) { 126 if (isOnCC90) 127 isOnCC90 = false; 128 } else if (sm.getData2() > 127 - PEDAL_MARGIN) { 129 if (!(isOnCC90)) { 130 isOnCC90 = true; 131 System.out.println("踏まれたよ"); 132 sequencer.start(); 133 } 134 135 } 136 System.out.println("isOnCC90: " + isOnCC90); 137 } 138 break; 139 default: 140 } 141 } 142 /* 143 * try { out_device.getReceiver().send(message, timeStamp); } catch 144 * (MidiUnavailableException e) { //System.err.println(e); } 145 */ 146 } 147 148}
###試したこと
connectMidiInでシーケンサーをレシーバーに設定している
###補足情報(言語/FW/ツール等のバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/15 04:43
2016/09/17 05:51