Java 声音 Midi 输出到硬件键盘

标签 java audio midi javasound javax.sound.midi

我正在尝试创建一个可以在 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/

相关文章:

java - 使用 RxJava 的生产者-消费者

java - Android WiFi 接入点可用事件

java: 折线的 Graphics2D 版本?

iphone - 覆盖 iPhone 应用程序中的铃声音量

flash - 在AS3项目中使用大量声音

java - Android Javax Midi Sequencer无法播放中间文件

java - Spring MVC 表单处理和 Spring 标签

audio - WAV 文件的其他子 block 是什么?

windows-runtime - 在 Windows 应用商店应用程序中播放 MIDI 文件

c# - 如何获取 MIDI 设备的当前状态?