问题标签 [javax.sound.midi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - MidiSystem.getMidiDevice(...) 返回意外的类
我正在尝试使用 javax.sound.midi 编写一个简单的程序,该程序可以读取、编辑然后通过 FluidSynth 播放 midi 文件。这是我的代码片段:
代码编译成功,但是当我运行它时,出现以下异常:
我期待返回 Synthesizer 类,但我不明白com.sun.media.sound.MidiOutDevice
该类是什么。如果我将合成器切换到MidiDevice
类,播放工作,但我无法访问Synthesizer
类中的所有方法。知道我缺少什么吗?
java - 创建新的 MIDI 事件
我创建了一个 Java 代码,它从一个有一个轨道的 MIDI 文件中播放一个序列。我正在使用 MIDI 接口和硬件合成器对其进行测试,一切正常。
我现在要做的是将新的 MIDI 事件添加到新轨道。因此,为此我编写了以下代码:
新轨道已创建并且 MIDI 事件在其中,但没有声音输出。然而,新创建的事件正在发送到我的 midi 界面,因为“midi out” LED 正在闪烁。所以我猜虽然正在发送一个事件,但它缺少一些信息?
创建新轨道/新 MIDI 事件时,我是否需要在代码中包含更多信息?
java - Java MIDI - ControllerEventListener(如何更改乐器)
我正在开发一个生成和播放 MIDI 事件的程序。我已经实现了 ControllerEventListener 接口,因为我想在每次播放 15 个音符中的一个时打印消息。
问题是,我不能再改变演奏音符的乐器(我不得不说我的电脑不使用默认的钢琴,而是鼓或类似的东西,如果我将 ControllerEvent 添加到跟踪)我已经在 Java API 规范中查找了涉及的方法,但是我没有找到可以解决我的问题的方法,就像我在这个站点上或通过谷歌搜索找到的一样少。我也做了,是尝试改变整个频道的乐器(通过添加一个 Program Change 消息),但它和以前一样。
代码如下:
我现在的问题是:如何在不更改事件处理程序的情况下更改仪器?
java - 如何在 Java MIDI 程序中更改乐器
如何在 Midi 中更换乐器?我可以将通道的值更改为最多 9,之后它会显示“通道超出范围”,这都是钢琴。例如,如何将其更改为吉他
java - javax.sound.Midi,如何包含元事件类型的示例?
我正在检查这个问题Terminate Java Midi output
基于此文档https://www.csie.ntu.edu.tw/~r92092/ref/midi/
我想在受控模式中包含一些额外的事件......
这里是 Midi 代码:
这里是我的活动
- 时间签名
- 密钥签名
- 设定速度
- MIDI 端口前缀
- MIDI 通道前缀
- SMPTE 偏移
如何包含元事件类型?.
java - 有没有办法在java中读取原始midi数据?
过去使用javax.sound.midi
我设法打开我的 midi 设备以输出.midi
文件,但问题是我需要能够以原始形式拾取 midievent,如"3C40"/"903C40"
.
我能够找到有关打开发射器/接收器/定序器的文档,但没有代码示例使用这些来输出一个字符串作为来自我的 yamaha ypt-240 数字键盘的 midi 设备示例的原始数据。
基本上,为什么我想要这些原始数据背后的原因是制作一些简单的键绑定,这些键绑定将由来自 midi 设备的所述原始数据触发,几乎就像流卡座或使用允许这样做的软件。ShortMessage 似乎是要走的路,但又找不到任何我想要的方式使用它的代码。
每个示例都是 mididevice||file.midi -> synth||mididevice 我需要一种方法来拦截输入 java 从设备获取...
请帮助大声笑
android - Android中的虚拟合成器(基于jar) - 原生jni?
我正在尝试在 Android 中加载和使用 java 的虚拟(软)合成器。我读过Gervill jar 就是用来做这个的。其他构建块是javax-sound作为 aar 文件存在于我的项目中(因为它不存在于 Android 的修剪 Java 包中)
Gradle 文件包含
代码的问题区域
代码 1
一些答案表明仅包含 gervill jar 就足以进行自动检测。但是因为这对我不起作用,所以我写了这个
代码 2
我得到这个编译错误
代码 3
如上所述包含到 gradle 中,这是没有代码 2 的运行时错误
我按照https://stackoverflow.com/a/38749847/1029110添加 aar/jar 文件
但是,虽然 gervill 需要 javax.sound
最终目标是加载和播放 soundfont 文件。尽可能避免使用本机 jni 代码。
编辑
发现 1 个问题。Gervill.jar 不够好,无法正常工作。所以我从 com.sun.media.sound.* 中挑选了一些其他类并编译到新的 jar 中。现在代码 2 ( unresolved supertypes
) 中的错误已经消失。
下一个试验是包括 Android midi 服务
这提供了 2 项服务,具体取决于安装在移动设备上的外部应用程序。但无论如何,它们与软合成器无关。
因此,代码 1 仍然有 MidiDeviceInfo 的空数组。
代码 3 的一部分:synth?.open()
仍然严重失败,但出现了新的错误。
(目前卡在这里)
代码 4:
失败
我已经检查了 Java for windows 版本的源代码。没有使用 getSoundbank 的文件覆盖或实现。
修复和未来的步骤?
java - 无法在 Java MIDI 程序中更改乐器,InvalidMidiDataException:channel out of range
我无法使用 javax.sound.midi.ShortMessage.setMessage() 方法更改乐器。通道 0-15 为钢琴,不包括 9 为鼓。但是8-15应该是Chromatic Percussion。当我将频道设置为 16 或更多(范围从 0 到 127)时,我得到 javax.sound.midi.InvalidMidiDataException:频道超出范围:16。请问,我该如何解决这个问题?
midi - 如何从 MIDI 文件计算每个小节的节拍数
我正在尝试从 MIDI 文件计算每个小节(小节)的刻度数,但我有点卡住了。
我有一个 MIDI 文件,我可以从中提取以下信息(在元消息中提供):
@0:
拍号:4/4
,节拍器脉冲:24 MIDI clock ticks per click
,每拍 32 分音符数:8
有两条节奏消息,我不确定它们是否相关:
@0:
每四分音符微秒:400000
,每分钟节拍数:150.0
@1800:
每四分音符微秒:441176
,每分钟节拍数:136.0001450668214
通过反复试验,查看 Note On 消息,并查看 Garageband 中的 MIDI 文件,我可以“猜测”每个小节的节拍数是2100
,带有四分音符525
节拍。
我的问题是:我可以2100
使用上面提供的速度信息来获得数字吗?如果可以,如何?还是我没有从 MIDI 文件中解析足够的信息,是否还有其他一些我需要查看的控制消息?
java - Java MIDI 没有声音
我目前正在从 Head First Java 一书中学习 Java。我正在尝试书中给出的这段代码:
但是,当我运行此代码时,我既没有听到任何声音,也没有收到任何错误。我在 Pop 上使用 openjdk 11.0.6!操作系统 19.10。我无法弄清楚可能出了什么问题。