问题标签 [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 - 油漆组件的事件监听器
我正在开发音乐应用程序,该应用程序创建一个正方形并在每个事件中重新绘制屏幕。事件就是声音,我用 sound.midi API 创建了它们。但是,当我运行应用程序时,方块不会出现在窗口上!有人可以告诉我我做错了什么吗?
这是我的主要课程:
这是 DrawPanel 类:
java - 停止 MIDI 音序器,以便我可以播放其他内容
编辑:这是一个独立的例子:
我能够找到MidiLatte
here的源代码。很抱歉不得不处理它;我需要在课堂上使用它。(如果由我决定,我会javax.sound.midi
直接使用......)这应该做的是开始播放 12 个音符的序列(第一个for
循环),但在 3000 毫秒后停止它,以便它可以播放不同的序列(第二个for
循环)。然而,最终发生的事情是,当第二个序列开始播放时,它并没有从头开始播放;它开始了几个音符。
我正在制作一个使用javax.sound.midi
API 的 Java GUI 应用程序。具体来说,它是一个音序器,允许用户输入音符并按顺序播放它们。我遇到的问题是我需要一种方法,在我发送我的 MIDI 消息之后,阻止它们,以便我可以播放其他东西。例如,假设用户点击播放。然后,显然,程序播放音符。我想要发生的是,如果用户在播放序列时按下播放,它会停止当前播放并重新开始。
我让 MIDI 与 Swing 一起工作的方式——在不破坏事件队列的情况下这样做并非易事——是通过单独Thread
处理 MIDI 内容。除了我在上一段中提出的问题之外,这工作正常。这是run
我的Thread
实现方法:
MidiLatte
是一个实用程序类,可以更轻松地发送 midi 消息并包装一个Sequencer
. 基本上,它的工作方式tasks
是 a LinkedBlockingQueue
of 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 序列播放。如果我在序列仍在播放时再次按下它,第一次播放将停止并且序列从头开始再次播放。如果我有任何不清楚的地方,请告诉我。谢谢!
java - 如何使用 Java 音序器对 MIDI 音符进行弯音
我正在尝试将弯音应用于 Java 中的 MIDI 文件。MIDI 文件由两个 C4 音符组成,我想将第二个音符弯音到小于半音的间隔。我已阅读 Oracle 文档,但我并不真正了解如何将所有代码正确链接在一起以实现此目的。到目前为止我有这个代码,但它没有做任何弯音。谁能帮我实现弯音,谢谢。
另外,我不太理解myMsg.setMessage(ShortMessage.PITCH_BEND, 1, 2, 100);
. 我如何知道将哪个通道用作第二个参数,以及第三个和第四个参数到底是什么?
java - 无法使用 java.midi.sequencer 播放声音
我有以下代码,我在其中创建了一个 Sequencer,给它一个序列,给序列一个新的轨道,将 MidiEvents 写入轨道,然后在我调用 sequencer.start() 时尝试播放序列。我究竟做错了什么?
java - Java Gervill 软件合成器不工作
在 JDK8 中,我似乎无法从 SoftSynthesizer 创建的 AudioInputStream 中获取任何有用的数据。
但是,println() 只显示 0,没有音频数据从 AudioInputStream 中输出。难道我做错了什么?还是从 JDK 8 开始不推荐使用 Gervill?
java - Java MIDI 音序器没有以正常速度播放
在这里,我有一段简单的代码,它使用自定义 Soundbank 以恒定的间隔播放 10 个音符,但结果不是以固定的速度播放,或者某些东西导致了明显的延迟。难道我做错了什么 ?有“热身”时间吗?
我在带有 OpenJDK 8 的 Ubuntu 上。
谢谢 :)。
java - 什么是 Java 中的合成器和音序器(javax.sound.midi)?
我想知道合成器和音序器的实际工作,或者他们实际做了什么?
java - 如何在 Java 中实现 Midi 合成器
我想用 Java 实现一个 Midi 合成器。(合成器 = 代表一种或多种乐器的新设备)
我实现的是 javax.sound.midi.Receiver:
这是使用默认值播放 MIDI 文件的方式:
所以我的问题是我如何告诉定序器使用我的接收器?
我尝试/发现的事情:
- 我没有办法告诉音序器使用我的接收器。
- 我发现接收器被 javax.sound.midi.Synthesizer 使用,但是我发现没有办法将自定义合成器类附加到音序器。
java - Java MIDI Sequence.getTracks() 错误编号
我正在尝试获取 MIDI 序列的轨道数:
... 其中 strSource 是我的 .mid 文件的完整路径+文件名。numTracks 为 1,但 .mid 文件有 16 个音轨(正如我在另一个 MIDI 编辑器中打开它时看到的那样)。文件类型为 0。
我在某处读到 type-0 文件不能为同一频道包含多个轨道。在这种情况下,所有轨道都被强制为单个轨道。那是对的吗?我怎样才能避免这种情况?
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 输入?如果没有,我需要改变什么?