更改midi文件的源代码

Posted

技术标签:

【中文标题】更改midi文件的源代码【英文标题】:change source code of midi file 【发布时间】:2016-11-19 16:02:27 【问题描述】:

我不是编码员,所以希望我能以对你们有意义的方式提出这个问题! ;-)

是否有一种简单的方法可以修改单个 MIDI 文件的内容?例如,我有一个 MIDI 文件,其中列出了 [sets in stone, more like it] 这首歌的调为 C,而实际上它是 D。

我有很多 MIDI 程序可以让我改变键[和移动音符]。这不能解决我的问题。笔记在正确的位置,关键只是贴错了标签。

我以为我可以在 Atom 中打开文件并将 C 更改为 D 并完成......但这没有用。在 Atom 中都是胡言乱语。

我在 Mac 上。有什么方法可以修改我的 midi 文件的内容吗?

在此先感谢所有回复的人!

【问题讨论】:

我认为你应该研究一下 midi 文件的结构,然后用二进制/十六进制编辑器更改它。无论如何,我不确定midi文件是否有“密钥”。我认为它只有音符、持续时间和乐器,只有当你用音乐程序打开它时,它才会猜到钥匙。至少那是我当时用音乐程序打开 MIDI 文件时的想法。 :) 我在十六进制编辑器中打开了一个 midi 文件,但这并不是很有启发性。顺便说一句,我很确定密钥以某种方式设置在文件中。几个 MIDI 程序显示了键[都一直是错误的],我不认为他们在猜测,因为大多数歌曲被列为 C,而它们显然不是 [甚至没有关闭] 如果你用同样的程序打开另一个midi,它们使用不同的键吗?也许他们只是使用 C 作为每个 midi 的默认设置,因为它没有升号或降号。当然只打开一个midi是没有用的,这就是为什么我首先说你应该对midi结构做一些研究。 ;) 密钥在我拥有的每个 MIDI 程序中保持一致,让我觉得它在文件中。 在来到这里之前,我做了尽可能多的研究......我找到了关于设置密钥的文章,但没有一篇文章提到他们是如何做到的[比如在什么环境中]。对于程序员来说,这可能是显而易见的。对我来说,这只是令人困惑......这就是我最终来到这里的原因! 【参考方案1】:

大多数 MIDI 文件不存储密钥。

但当他们这样做时,他们会使用可以用十六进制表示为FF 59 02 sf mi 的调号事件,其中sf 是升号(正)或降号(负)的数量,mi 是 0/ 1 代表主要/次要。

如果某些文件没有这个事件,你必须添加它。最简单的方法是使用一些 SMF 库作为您选择的编程语言。

【讨论】:

谢谢!如果大多数 midi 文件不存储密钥信息,C 是默认的吗?我想这可以解释为什么大多数都在 C 调中。 官方没有默认值,但 0/0 听起来很明显的默认值。 找到了一个程序,MidiYodi,它可以让我非常轻松地更改密钥!

以上是关于更改midi文件的源代码的主要内容,如果未能解决你的问题,请参考以下文章

MIDI - 使用来自不同银行的乐器更改 MidiMessage 程序

如何在 MIDI 文件中嵌入控制更改命令

BLE MIDIMIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI 文件头长度 | MIDI 文件格式 | MIDI 轨道个数 | 基本时间 )(代码

C# - 使用外部 Midi 控制器更改音量

如何读取 MIDI 文件、更改其乐器并将其写回?

用JS生成MIDI文件(附代码)