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

Posted

技术标签:

【中文标题】你如何在 java 中访问 MIDI IN 流中的数据?【英文标题】:How do you access data from MIDI IN stream in java? 【发布时间】:2013-09-17 13:54:12 【问题描述】:

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

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

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

【问题讨论】:

显示代码。如果您解释您遇到的问题,我们会提供帮助... 这就是我什至不知道从哪里开始的问题。使用 Sequencer 接口,这一切都非常简单,因为您可以使用 addControllerEventListener() 或 addMetaEventListener() 作为在定序器播放指定消息时的触发器。不幸的是,这些方法不适用于 Sequencer 以外的设备。 您提出了一些非常有趣和独特的问题。如果您可以发布您拥有或可以找到的任何相关代码,您可能会成功。尝试将问题缩小到非常具体的问题。我希望看到 SO 社区帮助您实现目标。 【参考方案1】:

要录制 MIDI 数据,您必须

通过调用setReceiver 方法将输入端口的Transmitter 连接到您的SequencerReceiver, 创建新的Sequence/Track 对象,并将它们连接到Sequencer, 在您的曲目上启用录音,并且 开始在您的 Sequencer 上录制。

(见documentation)

【讨论】:

感谢您的努力,但这也不是我的意思。我知道我在解释自己方面做得很糟糕,尤其是作为一名音乐家而不是程序员【参考方案2】:

我终于找到了解决方案,我想澄清这个问题并添加我的解决方案,以防它对其他人有帮助。

我正在从事的项目(顺便说一句,这超出了我的想象)是一个 MIDI 键盘编曲器。如果您不知道它是什么,它是一个键盘,可以演奏模式(风格)并根据演奏的和弦改变音调和排列。我需要的是我认为从端口中的 midi 转储的东西,这样我的程序就可以找出播放的和弦,以便它可以让音序器以不同的方式响应。

因此,要回答我自己的原始问题,您需要为您的 midi in 端口创建一个新的发射器。然后创建一个新的接收器来接收来自新发射器的数据流。最后让接收方将数据发送到 PrintStream,然后你就可以对数据流做你想做的事了!

【讨论】:

【参考方案3】:

在您自己的类中实现 javax.sound.midi.Receiver 接口的 send(javax.sound.midi.ShortMessage, long) 方法,并像使用其他 Receiver 对象一样使用后者的实例。

【讨论】:

以上是关于你如何在 java 中访问 MIDI IN 流中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 MIDI 文件中的最后一个事件?

如何在 Java 中播放(MIDI)序列中的音频剪辑?

NAudio - 从 Stream 播放 MIDI

如何访问苹果照片流中的文件

如何在java中检查流中的参数? [关闭]

HTML5 中的 MIDI 音乐支持