问题标签 [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 投票
1 回答
47 浏览

java - 油漆组件的事件监听器

我正在开发音乐应用程序,该应用程序创建一个正方形并在每个事件中重新绘制屏幕。事件就是声音,我用 sound.midi API 创建了它们。但是,当我运行应用程序时,方块不会出现在窗口上!有人可以告诉我我做错了什么吗?

这是我的主要课程:

这是 DrawPanel 类:

0 投票
1 回答
490 浏览

java - 停止 MIDI 音序器,以便我可以播放其他内容

编辑:这是一个独立的例子:

我能够找到MidiLatte here的源代码。很抱歉不得不处理它;我需要在课堂上使用它。(如果由我决定,我会javax.sound.midi直接使用......)这应该做的是开始播放 12 个音符的序列(第一个for循环),但在 3000 毫秒后停止它,以便它可以播放不同的序列(第二个for循环)。然而,最终发生的事情是,当第二个序列开始播放时,它并没有从头开始播放;它开始了几个音符。


我正在制作一个使用javax.sound.midiAPI 的 Java GUI 应用程序。具体来说,它是一个音序器,允许用户输入音符并按顺序播放它们。我遇到的问题是我需要一种方法,在我发送我的 MIDI 消息之后,阻止它们,以便我可以播放其他东西。例如,假设用户点击播放。然后,显然,程序播放音符。我想要发生的是,如果用户在播放序列时按下播放,它会停止当前播放并重新开始。

我让 MIDI 与 Swing 一起工作的方式——在不破坏事件队列的情况下这样做并非易事——是通过单独Thread处理 MIDI 内容。除了我在上一段中提出的问题之外,这工作正常。这是run我的Thread实现方法:

MidiLatte是一个实用程序类,可以更轻松地发送 midi 消息并包装一个Sequencer. 基本上,它的工作方式tasks是 a LinkedBlockingQueueof Consumer<MidiLatte>s。这允许我做的是在外部类中有一个方法(MPThread我的自定义Thread,是一个内部类),它将 a 添加Consumer<MidiLatte>到队列中。这样可以很容易地安排这样的 MIDI 任务:

但是,如上所述,我需要能够取消这些任务并在它们已经发送后停止 MIDI 播放。前者很简单——我可以清空队列:

但是,后者很困难,因为 MIDI 任务已经发送并且在 MIDI API 手中。我试过使用sequencer.stop(),但我得到了奇怪的结果,如本例所示:

WherecancelPending()调用sequencer.stop()并清除队列。最终发生的情况如下(我从经验中知道,当用户不清楚地描述他们的错误时,它可能会令人烦恼和困惑,所以我将一步一步地展示它。如果你仍然不明白什么,请告诉我发生。):

  • 第一个序列开始正确播放。
  • 3000(或多或少)毫秒后,第一个序列停止。
  • 第二个序列立即开始播放,但不是从头开始;相反,它开始播放就好像它一直在播放一样。

为了说明这一点,假设第一个序列的音符是A B C D E F G A,第二个序列的音符是1 2 3 4 5 6 7 8。应该发生的是,如果 3000 mils 落在第一个序列之间C和之间D,则整个播放是A B C 1 2 3 4 5 6 7 8. 然而,实际发生的是A B C 4 5 6 7 8.

我怎样才能实现我想要的行为?如果我设置并发的方式存在固有问题,请告诉我。只是为了重申我想要的行为,就是这样。当按下播放按钮时,MIDI 序列播放。如果我在序列仍在播放时再次按下它,第一次播放将停止并且序列从头开始再次播放。如果我有任何不清楚的地方,请告诉我。谢谢!

0 投票
0 回答
397 浏览

java - 如何使用 Java 音序器对 MIDI 音符进行弯音

我正在尝试将弯音应用于 Java 中的 MIDI 文件。MIDI 文件由两个 C4 音符组成,我想将第二个音符弯音到小于半音的间隔。我已阅读 Oracle 文档,但我并不真正了解如何将所有代码正确链接在一起以实现此目的。到目前为止我有这个代码,但它没有做任何弯音。谁能帮我实现弯音,谢谢。

另外,我不太理解myMsg.setMessage(ShortMessage.PITCH_BEND, 1, 2, 100);. 我如何知道将哪个通道用作第二个参数,以及第三个和第四个参数到底是什么?

0 投票
1 回答
134 浏览

java - 无法使用 java.midi.sequencer 播放声音

我有以下代码,我在其中创建了一个 Sequencer,给它一个序列,给序列一个新的轨道,将 MidiEvents 写入轨道,然后在我调用 sequencer.start() 时尝试播放序列。我究竟做错了什么?

0 投票
1 回答
141 浏览

java - Java Gervill 软件合成器不工作

在 JDK8 中,我似乎无法从 SoftSynthesizer 创建的 AudioInputStream 中获取任何有用的数据。

但是,println() 只显示 0,没有音频数据从 AudioInputStream 中输出。难道我做错了什么?还是从 JDK 8 开始不推荐使用 Gervill?

0 投票
1 回答
331 浏览

java - Java MIDI 音序器没有以正常速度播放

在这里,我有一段简单的代码,它使用自定义 Soundbank 以恒定的间隔播放 10 个音符,但结果不是以固定的速度播放,或者某些东西导致了明显的延迟。难道我做错了什么 ?有“热身”时间吗?

我在带有 OpenJDK 8 的 Ubuntu 上。

谢谢 :)。

0 投票
1 回答
203 浏览

java - 什么是 Java 中的合成器和音序器(javax.sound.midi)?

我想知道合成器和音序器的实际工作,或者他们实际做了什么?

0 投票
1 回答
2052 浏览

java - 如何在 Java 中实现 Midi 合成器

我想用 Java 实现一个 Midi 合成器。(合成器 = 代表一种或多种乐器的新设备)

我实现的是 javax.sound.midi.Receiver:

这是使用默认值播放 MIDI 文件的方式:

所以我的问题是我如何告诉定序器使用我的接收器?

我尝试/发现的事情:

  • 我没有办法告诉音序器使用我的接收器。
  • 我发现接收器被 javax.sound.midi.Synthesizer 使用,但是我发现没有办法将自定义合成器类附加到音序器。
0 投票
3 回答
116 浏览

java - Java MIDI Sequence.getTracks() 错误编号

我正在尝试获取 MIDI 序列的轨道数:

... 其中 strSource 是我的 .mid 文件的完整路径+文件名。numTracks 为 1,但 .mid 文件有 16 个音轨(正如我在另一个 MIDI 编辑器中打开它时看到的那样)。文件类型为 0。

我在某处读到 type-0 文件不能为同一频道包含多个轨道。在这种情况下,所有轨道都被强制为单个轨道。那是对的吗?我怎样才能避免这种情况?

0 投票
1 回答
1077 浏览

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

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

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

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

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

编辑:现在我有

我现在连接到我的 APC Mini 了吗?抱歉,我是初学者...如果是,我现在如何阅读 midi 输入?如果没有,我需要改变什么?