问题标签 [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.

0 投票
3 回答
536 浏览

java - 你如何在 java 中访问 MIDI IN 流中的数据?

我想利用来自设备中 MIDI 的数据。当某些事件发生时,我需要得到通知,以便我可以做一些事情,比如即时转调某些音符或调用方法或任何你能想到的东西。

虽然我对一般编程特别是 java 还是很陌生,但我已经能够使用 javax.sound.midi 使用音序器播放序列。我什至可以添加一个侦听器,告诉我音序器何时播放某些事件。现在我希望能够用 MIDI IN 流做类似的事情,但我不知道怎么做。

欢迎任何想法或解决方法,因为我现在很困惑。

0 投票
1 回答
57 浏览

java - 检查 HashMap 是否包含 MidiMessage

抽象类MidiMessage有 3 个子类:MetaMessage、ShortMessageSysexMessage。我正在听一个 MidiDevice,它发送短消息或 sysexmessages。问题是 MidiMessage 的哈希码永远不会相同。因此 MidiMessages 之间的唯一区别是数据字节数组。

我目前的解决方案是将字节存储在一个字符串中,然后检查 hashmap 是否包含该字符串:

但我不喜欢它,因为转换的开销(如果我总是切断最后一个字节,可以摆脱它;这几乎总是可以工作......)和字符串转换。那么,有没有更好的方法来检查 hashmap 或集合是否包含 midimesage ?

0 投票
1 回答
1169 浏览

java - Changing instruments in javax sound midi Sequencer

I have a Sequence player in which I simply open(), set the tempo, and start a Midi file where the Midi file is actually the bulk of my project (parsing a string file into a music piece)

Now in all the complexity of my code, I can't figure out how to change the instrument per voice:

The midi files can have multiple voices which my sequencer takes as being multiple notes to play at once. So if I have:

Then my sequencer will play those two parts simultaneously. Maybe splitting the two to play different instruments isn't doable but at least how do I change the Instrument for the entire sequence?

0 投票
0 回答
423 浏览

java - Java听不到声音

我正在尝试玩一点,javax.sound.midi但遇到了一个问题 - 我听不到声音。顺便说一句,我安装了 soundbank。代码如下所示:

System.out.println 行的结果如下所示:

有什么想法为什么不播放声音(我尝试了不同的乐器,不同的音符,速度和 midichannels - 没有效果)?

0 投票
2 回答
1391 浏览

java - 如何从 MetaMessage.getData() 返回的字节数组中获取整数值?

我需要从 midi 文件中获取速度值。我发现 set_tempo 命令的值为 0x51,所以我有这段代码:

但是 getData() 方法返回一个字节数组!如何将其转换为正常的人类形式,即整数?我读过它以这样的格式存储:“tt tt tt”,但是整个大/小端,有符号/无符号和可变长度的东西让它太混乱了。

0 投票
1 回答
62 浏览

java - 是否需要关闭 MIDI 序列?

我正在用 Java 解析一个 MIDI 文件。首先,我使用以下方法创建一个序列:

抛出检查的 IOException。我应该以某种方式关闭此资源吗?如果是这样,为什么序列或 MidiSystem 不实现可关闭?

0 投票
1 回答
437 浏览

java - 如何在java中获取midi文件类型(0/1/2)?

我正在使用以下方法解析 MIDI 文件:

如何区分 SMF 文件类型?我还没有找到任何返回它的方法。是否可以安全地假设,只有一个轨道的序列是 0 型,而多轨道是 1 型?

0 投票
1 回答
18 浏览

java - 防止 TempoCache 打乱节奏

我正在使用 TempoCache 的复制粘贴javax.sound.midi来处理我的 MIDI 播放器的节拍计算,但在某些文件上,速度被严重错误计算。它似乎从节奏事件中平均了节奏,但我想不出任何办法让它变得更好。

受影响的文件在这里:https ://github.com/TechShroom/MidiShapesEL/blob/master/src/com/k/midishapes/midi/MidiUtils.java

如果还需要什么,我会在这里添加。

0 投票
1 回答
707 浏览

java - 从Java中的MIDI控制器接收com.sun.media.sound.FastShortMessage,如何解码?

我有一个 java 程序设置,它从控制器获取 MIDI 输入,理想情况下根据发送的 MIDI 音符做不同的事情(不一定与播放合成器输出有关)。

我的代码很大程度上基于这个 SO 问题中的代码:Java getting input from MIDI keyboard,特别是我正在使用整个 MidiInputReceiver 类。我已经修改它来执行 System.out.println(msg) 以及打印“收到的 MIDI”,并且它似乎可以在每次我按下控制器上的一个键时检测到 MIDI 并打印 midi msg ,但我不知道如何将输出解码为我可以破译的东西,如果这可能的话。

我得到的输出是:

我一直在尝试使用这个 Java 类http://www.jsresources.org/examples/DumpReceiver.java.html来解码消息,但它只解码 ShortMessages,而不是 FastShortMessages,而且我在网上找不到任何文档关于什么是 FastShortMessage,更不用说如何从 FSM 转换为 SM。有人有什么想法吗?有没有比我正在做的更简单的方法?

编辑:这可能不是最好的方法,但我只是想出了一种可行的方法,我无法在 8 小时内回答我自己的帖子,但我会在这里发布以防其他人需要它。

我只是设法用下面的代码解决了我自己的问题。

按下两个键的示例输出:

所以 aMsg[1] 保存了每个笔记的 Midi 号​​码,可以在网上任何地方引用,由于代表我无法发布链接。

getMessage() 和 getLength() 方法来自http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/MidiMessage.html,我还没有弄清楚什么是 FastShortMessage ,但它可能只是遗留的遗留代码或其他东西?它是 com.sun 的东西,所以它一定很老了。

从这里我可以在 aMsg[1] 上执行 switch() 语句,具体取决于按下哪个键,这正是我的目标,因为它是一个整数,所以它将向后兼容 1.6。

0 投票
1 回答
776 浏览

java - 在 Java 中为 Garage band 构建 sysex 消息

我试图通过从 Java 程序发送一些 midi 消息来控制我的 GarageBand 音序器。它适用于短消息。例如,我可以用这种方式在 GarageBand 中录制 C3:

现在我想发送一些 SysEx 消息来“控制”我的音序器,例如,开始录音。但是构建一个 SysexMessage 比一个 ShortMessage 更难,因为它需要构建一个字节数组。特别是,必须指定“制造商 ID”。在网上寻找一些关于这个问题的信息让我觉得我没有朝着正确的方向前进,因为似乎没有什么很清楚。有人熟悉这个问题吗?