4

我意识到这里有许多类似的问题,但我相信我的情况非常独特,足以保证它自己的帖子。

我正在研究某种“视觉指挥”——我已经构建了一个程序,可以跟踪一个人的手势并从这些手势中推断出节奏(以每分钟节拍为单位)。我现在想做的是将测量到的速度映射到一个 MIDI 文件,该文件在人指挥时播放。基本上,我希望该程序允许某人进行合成乐曲,其中正在播放的文件的速度会受到指挥家手势的实时影响。我已经使用 OpenCV 库在 C++ 中编写了这个。

这就是事情变得有趣/多毛的地方。直接修改 MIDI 文件的速度看起来是一项艰巨的任务,鉴于今年夏天剩下的时间有限,我决定换个地方看看。我碰巧在 Java API 中找到了 Sequencer 接口,它有一个可爱的方法,叫做setTempoinBPM. 它完全符合我的需要;我只是很难让它在我的 C++ 代码中工作。

我尝试创建自己的 JVM 以在 C++ 代码中调用 Java 方法,但无济于事。我还尝试通过将适当的命令行参数传递给 来调用 Java 程序 system(),但是在使用这种方法开始播放后,我无法更改 MIDI 文件的速度。

我正在考虑将我的 C++ 代码转换为 Java 代码以便setTempoinBPM()直接调用,但我一直听到关于这是否会影响 OpenCV 性能的相互矛盾的报告。

我想听听您的意见:OpenCV 在 Java 上的性能是否足以与其 C++ 性能相媲美,以至于将我的项目转换为 Java 是否值得付出努力?(如果您碰巧知道如何轻松更改正在播放的 MIDI 音轨的速度,也请随时分享。)

4

2 回答 2

0

除了映射到 MIDI 文件,也许您可​​以遵循解析/编译方法。

将 MIDI 视为数据的表示(序列化的数据)。将数据解析为对您的特定问题有意义的中间表示 (IR)(即调整速度)。试想一下,“我怎样才能最好地构造内存中的数据,以便于操纵节奏呢?”

然后,使用这样的包您可以解析 midi 文件并提取重要部分。该软件包可能已经有适合您的问题的 IR。它看起来确实有一个序列化方法,可能需要将文件输入回播放器。或者,您可能会找到一个可以将您的 IR 直接传递给的玩家。如果您选择的 IR 已经用于已知播放器(并且仍然适合您的节奏操作),那么您不必在修改后考虑序列化您的 IR。

希望有帮助...

于 2013-07-29T19:12:29.343 回答
0

我对 c++ 不是很有经验,但通过openFrameworksofxMidi使用了一些 midi 。

在幕后它使用rtMidi

快速搜索一下,似乎可以直接从 C++ 控制节奏(参见bottom of void RtMidiIn :: initialize方法)。不确定是否有一个干净整洁的 API,因为我没有太多使用 rtMidi,但可能值得检查。

于 2013-07-29T21:46:55.683 回答