当前位置: 首页 > 知识库问答 >
问题:

Java Midi-如何在Midi播放时从中获取音符

米修平
2023-03-14

我现在找了一段时间,想做什么都找不到答案。

我想播放一个midi文件,并在播放时在屏幕上显示音符。当一个音符停止播放时,它应该从屏幕上消失。

我可以用音序器播放midi,但不知道如何让音符播放,或者何时停止播放音符。

我研究过ControllerEventListeners和MetaEventListeners,但仍然不知道如何做到这一点。

任何帮助都将不胜感激。

共有2个答案

苗森
2023-03-14

这是一个常见问题
将自己的接收器连接到音序器的发射器。

有关示例,请参见MIDI播放器中的DumpReceiver。

逄俊贤
2023-03-14

这就是你应该做的:

你要实现Recector然后

sequencer = MidiSystem.getSequencer();
sequencer.open();
transmitter = sequencer.getTransmitter();
transmitter.setReceiver(this);

之后,每次事件发生时都会触发下一个方法:

@Override
public void send(MidiMessage message, long timeStamp) {
    if(message instanceof ShortMessage) {
        ShortMessage sm = (ShortMessage) message;
        int channel = sm.getChannel();

        if (sm.getCommand() == NOTE_ON) {

            int key = sm.getData1();
            int velocity = sm.getData2();
            Note note = new Note(key);
            System.out.println(note);

        } else if (sm.getCommand() == NOTE_OFF) {

            int key = sm.getData1();
            int velocity = sm.getData2();
            Note note = new Note(key);
            System.out.println(note);
        } else {
            System.out.println("Command:" + sm.getCommand());
        }
    }
}

如果你愿意,你也可以使用这个类:

public class Note {

    private static final String[] NOTE_NAMES = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};

    private String name;
    private int key;
    private int octave;

    public Note(int key) {
        this.key = key;
        this.octave = (key / 12)-1;
        int note = key % 12;
        this.name = NOTE_NAMES[note];
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Note && this.key == ((Note) obj).key;
    }

    @Override
    public String toString() {
        return "Note -> " + this.name + this.octave + " key=" + this.key;
    }
}
 类似资料:
  • 问题内容: Octave似乎假设某个特定的声音播放实用程序将在系统上可用,但似乎没有提供指定备用声音的功能。在以下错误中,Octave正在寻找,这不是在所有系统上都可用的实用程序。 八度:38>声音(beamformed_20) sh:ofsndplay:找不到命令 是否可以使用Octave配置设置或代码片段来指定适合系统的实用程序? 问题答案: 在我的一台Linux机器上,我创建了以下ofsnd

  • 问题内容: 我收到mp3网址作为api调用的响应。我想播放该音频,那么我该怎么做?(iOS迅速) 这是我的回应 这是我的代码:: 我要去哪里错了? 问题答案: 我尝试了以下方法 添加以下方法, 和您的播放方法一样, 下载mp3文件,然后尝试播放,但AVAudioPlayer无法以某种方式为您下载mp3文件。我可以下载音频文件,然后播放器播放它。 请记住,将其添加到info.plist中,因为您是从

  • 我目前正在使用在我的Windows窗体应用程序中,但因此我不能同时播放多个声音。我知道,已经回答了这个主题的问题,但如果我试图使用Windows媒体播放器: 我得到一个错误: “系统。窗户。在名称空间Windows中找不到Media(类型或命名空间名称Media不可用)。媒体”) 我认为缺少一个组件,但我不知道如何添加它。难道没有一种简单的方法可以同时播放多种声音吗?

  • 我正在开发一个音频播放器,它可以在后台播放音频文件。我的问题是,当录像机或视频播放器启动时,我需要暂停音频播放器。 有什么方法可以处理这个任务吗?例如,我有来处理这些调用。当我接到呼叫或wnat呼叫时,我们可以使用呼叫状态暂停播放器。我想为录像机或视频播放器以及相同的场景。当视频/录制开始时,我需要暂停音频播放器。

  • 问题内容: 我正在尝试将文本语音转换应用程序与其他开发人员共享,但是我现在遇到的问题是Docker容器无法在主机上找到声卡。 当我尝试在Docker容器中播放WAV文件时 我想主要的问题是docker容器无法到达主机上的声卡。 到目前为止,我有 我在docker容器中安装了alsa-utils和大多数alsa依赖项。 通过指定运行容器时 添加 我不确定docker是否可以做到这一点(我不确定如何将

  • 我在许多论坛和YouTube教程中搜索了一些简单的代码来播放声音文件(.mp3),但我找到的所有内容都不适合我。 我总是收到异常,它找不到文件或其他错误,但它总是以异常结束。 有什么我必须先配置的吗? -编辑- 我再次尝试以下代码来显示我得到的解释: 这是我的代码 添加JFXPanel后,我得到了异常:线程“main”中的异常MEDIA Exception:MEDIA _ UNAVAILABLE