如何在 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);
并使用MusicTrack
和MusicEventIterator
阅读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 文件并获取曲目的预设信息的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OS X MusicPlayer 知道 MIDI 文件何时完成
如何从 MIDI 序列中获取 Note On/Off 消息?