使用 javax.sound.midi 接收 MIDI 输入

2024-06-20

我想要一个程序,当它获得 MIDI 输入时可以做一些事情。

例如,当我单击控制器上的按钮 1 时,它应该打印“您单击了 btn 1”,当我单击按钮 2 时,它应该打印“您单击了 btn 2”。

我尝试使用 javax.sound.midi 库,但论坛或 youtube 上的所有示例都不起作用。

这对我来说最有效。它打印了我电脑上的所有 Midi 设备,但没有收到任何内容。有人可以帮忙吗?

package de.snke.dev;

import javax.sound.midi.*;;



public class Main  extends Object implements Receiver{

static MidiClass myMidi;

public static void main(String[] args) throws Exception {

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

            for (int i=0; i < info.length; i++) {
             System.out.println(i + ") " + info[i]);
             System.out.println("Name: " + info[i].getName());
             System.out.println("Description: " +
             info[i].getDescription());

             MidiDevice device =
            MidiSystem.getMidiDevice(info[i]);
             System.out.println("Device: " + device);
            }

}

public void send(MidiMessage msg,
        long time) {
        System.out.println("Received message " + msg);
        }

        public void close() {
        System.out.println("Closing");
        }
}

编辑:现在我有

Sequencer           seq;
Transmitter         seqTrans;
Synthesizer         synth;
Receiver         synthRcvr;
try {
      seq     = MidiSystem.getSequencer();
      seqTrans = seq.getTransmitter();
      synth   = MidiSystem.getSynthesizer();
      synthRcvr = synth.getReceiver(); 
      seqTrans.setReceiver(synthRcvr);      
} catch (MidiUnavailableException e) {
      // handle or throw exception
}

我现在已经连接到我的 APC Mini 了吗?抱歉我是初学者... 如果是,我现在如何读取 MIDI 输入?如果“否”我必须改变什么?


解决办法是:

package de.snke.dev;

import javax.sound.midi.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;

public class Main
{

public void Main()
{
    MidiDevice device;
    MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
    for (int i = 0; i < infos.length; i++) {
        try {
        device = MidiSystem.getMidiDevice(infos[i]);
        //does the device have any transmitters?
        //if it does, add it to the device list
        System.out.println(infos[i]);

        //get all transmitters
        List<Transmitter> transmitters = device.getTransmitters();
        //and for each transmitter

        for(int j = 0; j<transmitters.size();j++) {
            //create a new receiver
            transmitters.get(j).setReceiver(
                    //using my own MidiInputReceiver
                    new MidiInputReceiver(device.getDeviceInfo().toString())
            );
        }

        Transmitter trans = device.getTransmitter();
        trans.setReceiver(new MidiInputReceiver(device.getDeviceInfo().toString()));

        //open each device
        device.open();
        //if code gets this far without throwing an exception
        //print a success message
        System.out.println(device.getDeviceInfo()+" Was Opened");


    } catch (MidiUnavailableException e) {}
}


}
//tried to write my own class. I thought the send method handles an MidiEvents sent to it
public class MidiInputReceiver implements Receiver {
public String name;
public MidiInputReceiver(String name) {
    this.name = name;
}
public void send(MidiMessage msg, long timeStamp) {


    byte[] aMsg = msg.getMessage();
    // take the MidiMessage msg and store it in a byte array

    // msg.getLength() returns the length of the message in bytes
    for(int i=0;i<msg.getLength();i++){
        System.out.println(aMsg[i]);
        // aMsg[0] is something, velocity maybe? Not 100% sure.
        // aMsg[1] is the note value as an int. This is the important one.
        // aMsg[2] is pressed or not (0/100), it sends 100 when they key goes down,  
        // and 0 when the key is back up again. With a better keyboard it could maybe
        // send continuous values between then for how quickly it's pressed? 
        // I'm only using VMPK for testing on the go, so it's either 
        // clicked or not.
    }
    System.out.println();
}
public void close() {}
}
}

它结合了 2 个线程解决方案,可打开所有 MIDI 设备并打印其速度、音符值和状态(单击或未单击)

并且不要忘记!

你必须打电话

Main main = new Main();
main.Main();

在一个单独的类中启动 Main 类中的 Main 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 javax.sound.midi 接收 MIDI 输入 的相关文章

  • Citrix Receiver在linux系统(Ubuntu)下的安装使用

    本文为解决在linux系统下Citrix Receiver安装完成后无法登录服务器的情况 xff0c windows下没有这个问题 其中报错为无法识别安全证书 提示 xff1a no such file or directory verif
  • Linux(Deepin、Ubuntu)安装Citrix receiver教程

    Deepin20 6安装Citrix receiver教程 安装的deepin20 6想要安装Citrix receiver xff0c 发现要么装不上 xff0c 要么装上了不能用 xff0c 找了好多资料 xff0c 最终找到可以使用的
  • 如何在iPhone上播放MIDI?

    据我所知 没有本地或第三方库可用于在 iPhone 上播放 MIDI 但似乎有不少应用程序可以做到这一点 他们用什么 有什么线索吗 供那些走这条路的人参考 AVMIDIPlayer 是在 iOS 8 中引入的 似乎在设备上运行良好 但 si
  • 错误:子进程退出并出现错误。 - Python

    错误 子进程退出 错误 python setup py Egg info 未成功运行 我知道还有一些类似的问题 但尝试这些解决方案后 错误仍然存 在 我想安装一个名为MIDI DDSP它显示一个错误 Requirement already
  • Music21:从 MIDI 文件获取每个乐器的所有音符

    我正在按照指示解析 MIDI 文件here 我的代码如下所示 from music21 import converter instrument or import file converter parse sample mid compon
  • Android 6.0+:使用新的 MIDI API 没有声音

    我正在使用新的 MIDI API为了播放一些 MIDI 音符 但是 我听不到任何声音 也没有抛出任何异常 其代码如下 initialising the MidiReceiver private MidiReceiver midiReceiv
  • 使用新创建的声音字体播放 MIDI 时,在通道 9 上找不到预设

    我用 Polyphone 创建了一个声音字体来创建一个新的乐器 bagana 它只有 1 件乐器 Bagana 以及 1 件礼物 Bagana 我尝试用 FluidSynth 播放 midi 文件 只是一首钢琴曲 它成功了 当我通过新的音前
  • 使用钢琴键盘作为电脑键盘[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 I
  • Java 中的 MidiUnavailableException?

    我在 Java 中播放 MIDI 文件时遇到一些问题 我得到的是一个MidiUnavailableException MIDI OUT transmitter not available 当我尝试玩它时 我的代码是标准的 try midis
  • Synthesia 可以很好地播放 MIDI 文件而没有任何音符关闭事件吗?

    我有一个 mid file this https pastebin com amkth128具体一个 除了标题块之外 这里是 MIDI 的相关部分 第一个轨道块仅包含元事件 并被描述为 4D 54 72 6B 00 00 00 52 Tra
  • 确定 MIDI 文件的时间划分

    我正在用Python编写一个脚本来解析MIDI文件 是的 我知道Python存在MIDI解析库 但对于我的用例来说 如果我从头开始制作它是最简单的 我遇到的问题之一是时间划分 标头的最后两个字节指定时间划分 但我无法确定文件的时间划分是否以
  • 从 DialogFragment 调用 registerReceiver

    EDIT 我添加了这一行 getActivity registerReceiver new BroadcastReceiver new IntentFilter SENT 但现在出现运行时错误 错误内容如下 09 03 04 12 41 8
  • 如何使用 ExecutorService Java 减少到达 Runnable 类的 run 方法的时间延迟

    我试图实现一个实时执行应用程序 其中按钮单击事件将任务分配给 Thread 该任务将调用MIDI方法播放一些音乐 单击按钮时必须立即开始播放音乐 并有一小段延迟 midi代码在Runnable类的run方法中实现 但是要在按钮单击事件本身发
  • 如何解释 MIDI 文件分析的参数值,尤其是“midi.NoteOnEvent”的“数据”字段?

    我正在尝试使用工具包分析 MIDI 文件python midi for python 链接到存储库 https github com vishnubob python midi 基本上 我的问题是关于数据的解释我刚提取出来 这是数据 mid
  • 为什么 MIDI 提供 127 个音符

    MIDI 中的 127 个音符值是否具有音乐意义 一定数量的八度音阶或其他 或者是由于二进制文件格式 IE为了计算的目的而设置为127 在 MIDI 协议中 有状态字节 想想命令 例如音符打开或音符关闭 和数据字节 想想参数 例如音高值和速
  • 如何获取 MIDI 设备的当前状态?

    如何查询 MIDI 设备当前的程序状态 音量等 我试图在 Midi 规格中找到它 但没有成功 我基本上需要从通过 USB midi 连接的数码钢琴获取当前乐器 钢琴等 Java似乎可以做到 http docs oracle com java
  • 检测 Web MIDI API 中是否连接了 MIDI 接口

    我正在 Chrome OS X 中试验 Web Midi API 到目前为止 我得到了很好的结果 但我想知道 有没有办法在应用程序运行时检测 MIDI 接口是否连接 断开 目前的工作方式是重新启动浏览器 让应用程序知道界面是否存在 似乎有一
  • 在 Android 上生成 FileDescriptor 而不先打开文件

    在Android中 是否可以直接从字节数组生成FileDescriptor 而不必先打开文件 在 Android 2 2 中 我动态生成 MIDI 文件 然后使用 MediaPlayer 进行播放 我在下面包含了成功执行此操作的 Main
  • 使用软件合成器将 MIDI 文件转换为原始音频

    我正在尝试直接从我的 Android 应用程序动态生成一个小型 MP4 音频 视频文件 我最初的攻击计划 用户输入一些基本的歌曲数据 和弦进行等 应用程序会构建一个 MIDI 文件 该系统为每个和弦构建和弦图 并使用 MIDI 读取器生成与
  • .Net 中的 Midi 实现

    有人对在 C Winforms 中编写基于 MIDI 的应用程序有任何指导或建议吗 我最近购买了一个新的效果踏板 它具有完整的 MIDI 实现 或者我相信 但制造商认为不发布图书馆员 补丁编辑应用程序是合适的 除了将键盘插入另一个 MIDI

随机推荐