如何在 OS X 中读取 midi 文件并获取曲目的预设信息

Posted

技术标签:

【中文标题】如何在 OS X 中读取 midi 文件并获取曲目的预设信息【英文标题】:how can i read a midi file and get track's preset info in OS X 【发布时间】:2016-04-06 07:19:51 【问题描述】:

我打开了一个 MIDI 文件:

MusicSequence sequence;
NewMusicSequence(&sequence);
MusicSequenceFileLoad(sequence, (__bridge CFURLRef _Nonnull)(midiFile), kMusicSequenceFile_MIDIType, 0);

并使用MusicTrackMusicEventIterator 阅读midi note 消息。 我怎样才能获得仪器预设信息?比如piano(id:0)或其他人..

【问题讨论】:

这些设置是由事件进行的。而且它们不一定是预设;它们可以随时更改。 【参考方案1】:

音轨的预设信息或乐器预设信息不是属于 MIDI 标准 AFAIK 的概念。为了找出是否有程序编号设置程序编号已更改,在您的 MIDI 读取回调中,您可能应该检测以下类型的二进制消息:

1100nnnn    0ppppppp

[nnnn = 0-15 (MIDI channel number 1-16)][ppppppp = program number] 的位置。

然而,这些只是事件生成的程序编号,可以指代任何声音。原始 MIDI 规范缺少通用 MIDI 系统中指定的“声音设置到程序更改编号”映射。因此,在您的代码中的某处应该搜索 GeneralMIDI 系统消息,例如:

通用 MIDI 系统开启(十六进制):

F0 7E <device-ID> 09 01 F7

通用 MIDI 系统关闭(十六进制):

F0 7E <device-ID> 09 02 F7

完整的规格可以阅读:MIDI Manufacturers Association。

【讨论】:

以上是关于如何在 OS X 中读取 midi 文件并获取曲目的预设信息的主要内容,如果未能解决你的问题,请参考以下文章

Midi TEMPO 信息如何应用于其他曲目?

如何使用 OS X MusicPlayer 知道 MIDI 文件何时完成

如何从 MIDI 序列中获取 Note On/Off 消息?

NAudio 和 Midi 文件读取

在 Mathematica 和 MIDI 踏板事件中叠加音乐曲目

使用 AudioKit 从 MIDI 文件中读取音符