Java从MIDI键盘获取输入

2024-02-15

我用 java 设计了自己的合成器,现在想将它与 midi 键盘连接。我的下面的课程搜索所有具有发射器的 MIDI 设备。它成功找到了我的 MIDI 键盘。我将自己的接收器添加到每个设备的每个发射器中,以便它能够接收所有可能的信号。通过阅读所有帮助文档和 java 文档,我知道发送器将 MidiEvents 发送到接收器,然后接收器使用 send 方法处理它们。因此,我编写了自己的内部类来实现 Receiver,并仅使用 println 语句来检查 send 方法中是否检测到任何内容。然而什么也没有被拾取。做这样一个简单的事情似乎没有什么帮助,我已经查看了每个帮助文件、javadoc 和论坛。我确信这一定是我不知何故错过的非常明显的事情。

我的合成器不应与界面合成器混淆,它不是 MIDI 乐器。它使用合成算法并具有播放方法。基本上我只需要让 midi 键盘发送一个关于事件的注释,该事件将调用播放方法。

import javax.sound.midi.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class MidiHandler
{
    //ArrayList of MidiDevices
    private ArrayList<MidiDevice> devices = new ArrayList<MidiDevice>();

    public MidiHandler()
    {
        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 (device.getTransmitters().size() > 0) {
                    //if it does, add it to the device list
                    System.out.println(infos[i] + ": " + device.getTransmitters().size());
                    devices.add(device);
                }
            } catch (MidiUnavailableException e) {}
        }
        //if any transmitting devices were found
        if(devices.size()>0) {
            //for each device
            for(int i = 0; i<devices.size(); i++) {
                try {
                    //get all transmitters
                    List<Transmitter> transmitters = devices.get(i).getTransmitters();
                    //and for each transmitter
                    for(int j = 0; j<transmitters.size();j++) {
                        //create a new receiver
                        transmitters.get(i).setReceiver(
                            //using my own MidiInputReceiver
                            new MidiInputReceiver(devices.get(i).getDeviceInfo().toString())
                        );
                    }
                    //open each device
                    devices.get(i).open();
                    //if code gets this far without throwing an exception
                    //print a success message
                    System.out.println(devices.get(i).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) {
            System.out.println("midi received");
        }
        public void close() {}
    }
}

笔记: 我已经看过这个:Java MIDI - 从钢琴获取数据? https://stackoverflow.com/questions/1485307/java-midi-getting-data-from-piano.

和这个:http://www.jsresources.org/examples/MidiInDump.html http://www.jsresources.org/examples/MidiInDump.html

对于我想要的东西来说,接口 Sequencer 看起来也很复杂。


我发现 MidiDevice getTransmitters() 似乎返回当前的列表已经开放发射器,而不是发射器可用的待打开。我相信打开新发射器的方法是通过 getTransmitter() 方法。我修改了您的代码来执行此操作:

import javax.sound.midi.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
    public class MidiHandler
{

    public MidiHandler()
    {
        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) {
        System.out.println("midi received");
    }
    public void close() {}
    }
}

在我的硬件上(我插入了一个简单的 USB MIDI 控制器),在创建 MidiHandler 实例后,代码正确打印出“midi returned”。

希望这可以帮助!

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

Java从MIDI键盘获取输入 的相关文章

随机推荐

  • 删除重复的文件扩展名

    我有数千个名为 filename gz gz gz gz gz gz gz gz gz gz gz 的文件 我正在使用这样的 find 命令find name gz 找到这些文件并使用 exec或者通过管道连接到 xargs 并使用一些神奇
  • 无法访问 sencha 中整个控制器的全局变量

    我一直在尝试访问一个控制器内的全局值 但无法访问它 我一直在关注这个如何在sencha中定义全局变量 https stackoverflow com questions 18095037 how to define global varia
  • C3.js将折线图Y轴的标签位置更改为Y轴居中

    我需要更改 Y 轴标签在 Y 轴上的位置 当前的六个位置选项无法满足我的场景 我也尝试使用 d3 进行自定义 但仍然没有成功 我创建了一个plnkr http plnkr co edit WzXVForyGJP01WJlAXj5 p pre
  • 由于随机效应,lme 发出警告消息

    我有一个包含 5 个变量的数据框 批次 晶圆 序列号 电压 放大倍数 在此数据框中 有 1020 个按 Serial number 分组的子集 每个子集都有一定数量的测量数据点 电压放大 我将数据与 summary fit2 lme lt
  • 是否可以创建 DbContext 接口或抽象类并使用它来注入不同的 DbContext 对象?

    我有一个软件产品 数据库是在 SQLServer 上创建的 表和列名称是由开发团队定义的 然后使用数据库优先方法将模型导入到 Visual Studio 现在我们正在为其他公司开发相同类型的解决方案使用 ORACLE 并请求表和列的命名约定
  • MongoDB:对数据库的读/写是否并发?

    当百万个线程尝试执行时会发生什么read from and write to MongoDB同时 锁定是否发生在db level table level or row level 它发生在数据库级别 但是在 Mongo 2 0 中 有一些并
  • matplotlib 等高线图:对数刻度中的比例颜色条级别

    是否可以将颜色条的级别设置为对数比例 如下图所示 这是一些可以实现的示例代码 import matplotlib pyplot as plt import numpy as np from matplotlib colors import
  • 解决WinForms中的跨线程异常

    目前我正在使用 WinForms C 语言 并且必须在后台运行该应用程序 为此 我使用异步 当我运行该应用程序时 它显示一个异常 例如 跨线程操作无效 从创建它的线程以外的线程访问控制 我该如何解决这个错误 当对控件进行方法调用时 如果调用
  • 哪里可以获取其他 iOS 版本的 iOS 系统符号

    请注意 我要求提供一个可以下载这些符号的地方 或者要求一个明确的答案 此类网站被 Apple 禁止 重复 问题与我在问题中链接的问题类似 唯一建议的答案是访问物理设备或找到另一位拥有物理设备的开发人员 我已经符号化了故障转储 但只有我的应用
  • PHP 字符串转数组

    我有一个字符串 当我 var dump 返回以下内容时 string 20 key1 key1 value key2 key2 value 如何将其转换为一个数组 在 var dump 时返回以下内容 array 2 key1 gt str
  • MVC 5 阻止通过 Iframe 访问内容

    自从从 MVC4 升级到 MVC5 以来 我注意到我的网页中添加了一个额外的服务器标头 X 框架选项 SAMEORIGIN 我了解添加此标签的安全优势 但其中一个页面应该包含在其他项目 在其他域上 的 iframe 中 这个额外的标头会阻止
  • 将 git hook 添加到谷歌云存储库

    谷歌云附带的功能之一是git 仓库 https cloud google com source repositories docs 是否可以向此存储库添加挂钩 我想要收到推送 但我不知道如何访问 git hooks 如果您将代码托管在git
  • 假互联网差

    我正在尝试在网络状况不佳的情况下测试我的 iPhone 和 Android 应用程序 我记得不久前我读到过一个程序 它可以伪造不同类型的不良互联网 有谁记得这个程序叫什么或者是否有类似的东西我可以用来完成这个任务 对于 iOS 正如其他人所
  • 如何将自定义 HTML 内容添加到 FastAPI Swagger UI 文档?

    我需要在 FastAPI 应用程序的 Swagger UI 中添加一个自定义按钮 我发现这个答案 https stackoverflow com questions 74661044 add a custom javascript to t
  • 如何根据条件在 Pandas 中构建新列(新列应输出字符串)

    我正在尝试使用条件在 pandas 中创建一个列来创建定性观察 例如 如果数据框如下所示 Distance 1 1 2 5 3 40 4 15 我想创建一个新列 我们称之为df length 这是对距离的观察 例如 if df Distan
  • Hibernate Annotations - 如何从映射中排除 bean 字段?

    我有一个包含一些字段的 bean 其中两个字段不打算由 hibernate 映射 errorStatus 和 operationResultMessage 我如何告诉 Hibernate 通过注释 我不想映射这些字段 bean中的映射表没有
  • Elasticsearch:“function_score”与“boost_mode”:“replace”忽略函数分数

    我正在尝试使用 function score 中定义的不同函数来修改正常查询的分数 为了找出我的函数计算出的分数是什么 我将 boost mode 指定为 replace 然而 这使得所有分数保持不变 全部等于 1 考虑以下查询 query
  • 在 Android M 上对 TextInputLayout 设置错误后更改 EditText 背景时出现问题

    我已将自定义背景设置为 Xml 文件中的 EditText 验证后 我在运行时为 EditText 设置不同的背景 并为 TextInputLayout 设置错误 但在Android M中 不是设置背景资源 而是设置EditText的背景颜
  • Java 中的空语句(不是 for 循环)有什么用? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在查看 Eclipse 代码样式
  • Java从MIDI键盘获取输入

    我用 java 设计了自己的合成器 现在想将它与 midi 键盘连接 我的下面的课程搜索所有具有发射器的 MIDI 设备 它成功找到了我的 MIDI 键盘 我将自己的接收器添加到每个设备的每个发射器中 以便它能够接收所有可能的信号 通过阅读