我正在尝试创建一个可以在 MIDI 键盘上播放音符的程序。我无法让整个程序运行,但我现在正在尝试创建一个较小的概念验证程序来尝试解决它。
为此,我尝试在键盘(Casio CTK-3000)上播放 .mid 文件,MidiPlay可以用键盘弹奏。问题是,当我尝试在程序中弹奏键盘时,它什么也没弹。我的代码如下:
public class midiOut {
public static void main(String[] args) throws IOException, MidiUnavailableException, InvalidMidiDataException
{
while(true) {
//List Midi Devices
MidiDevice.Info[] midiInfo = MidiSystem.getMidiDeviceInfo();
int i = 0;
for (MidiDevice.Info info : midiInfo) {
System.out.println(i + ": " +info.getName());
i+=1;
}
//Select Device
Scanner in = new Scanner(System.in);
int input = in.nextInt();
if(input == -1)
{
break;
}
//Get Device and Open it
MidiDevice selectedDevice = MidiSystem.getMidiDevice(midiInfo[input]);
System.out.println(selectedDevice.getDeviceInfo().getName());
selectedDevice.open();
//Get Sequencer and Receiver, load the File and start playing
Receiver receiver = selectedDevice.getReceiver();
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.getTransmitter().setReceiver(receiver);
sequencer.open();
sequencer.setSequence(MidiSystem.getSequence(new File("C:\\Users\\Harris Mirza\\Downloads\\PennyLane.mid")));
sequencer.start();
selectedDevice.close();
}
}
}
最佳答案
意识到我的错误,我太早关闭设备了,在关闭之前添加了检查,在这里修改了代码:
import javax.sound.midi.*;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class midiOut {
public static void main(String[] args) throws IOException, MidiUnavailableException, InvalidMidiDataException
{
while(true) {
//List Midi Devices
MidiDevice.Info[] midiInfo = MidiSystem.getMidiDeviceInfo();
int i = 0;
for (MidiDevice.Info info : midiInfo) {
System.out.println(i + ": " +info.getName());
i+=1;
}
//Select Device
Scanner in = new Scanner(System.in);
int input = in.nextInt();
if(input == -1)
{
break;
}
//Get Device and Open it
MidiDevice selectedDevice = MidiSystem.getMidiDevice(midiInfo[input]);
System.out.println(selectedDevice.getDeviceInfo().getName());
selectedDevice.open();
//Get Sequencer and Receiver, load the File and start playing
Receiver receiver = selectedDevice.getReceiver();
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.getTransmitter().setReceiver(receiver);
sequencer.open();
sequencer.setSequence(MidiSystem.getSequence(new File("C:\\Users\\Harris Mirza\\Downloads\\Eight_bar_blues.mid")));
sequencer.start();
sequencer.addMetaEventListener(new MetaEventListener() {
@Override
public void meta(MetaMessage meta) {
if(meta.getType() == 47)
{
sequencer.close();
}
}
});
while (sequencer.isOpen()){}
}
}
}
关于Java 声音 Midi 输出到硬件键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958179/