使用 NAudio 在 MIDI 文件中设置 MIDI 速度

Posted

技术标签:

【中文标题】使用 NAudio 在 MIDI 文件中设置 MIDI 速度【英文标题】:Setting MIDI Tempo in a MIDI file with NAudio 【发布时间】:2014-01-30 19:22:26 【问题描述】:

我正在使用 NAudio 玩一个真正的玩具项目,这是一个用于音乐的简单 DSL。我想在我从头开始创建的 MIDI 流中设置速度 - 实际上是从 DSL 开始 - 但我不知道如何发送速度(即每分钟节拍,即一分钟的四分之一数),或者更好,但我必须使用 hack。 默认的 MidiEvent 构造函数/方法不允许我将额外的数据发送到流中(速度被比特编码为 3 个字节,代表四分音符的毫秒持续时间),我没有找到一种方法来做到这一点,除了这个糟糕的 hack (顺便说一句,它就像一个魅力):

output = new MidiEventCollection(0, Tpq);

var evt = new MetaEvent(MetaEventType.SetTempo, 3, 0);
/* Oh no really please don't dont do that!!!!!
 * what does it mean? You are touching a privare variable
 * and what the neck is that BitConverter bloody mess?
 */
 var fi = evt.GetType().GetField("data", BindingFlags.Instance | BindingFlags.NonPublic);
 var midiTempo = 60000000 / Bpm;
 var split = BitConverter.GetBytes(midiTempo);
 fi.SetValue(evt, new byte[] split[0],split[1],split[2]  );
output.AddEvent(evt , 0);

我想问一下,目前 NAudio 有什么礼貌的方法吗?

【问题讨论】:

【参考方案1】:

为此使用 TempoEvent:

var evt = new TempoEvent(midiTempo, 0)

【讨论】:

我不知道我是怎么想念它的,谢谢:)

以上是关于使用 NAudio 在 MIDI 文件中设置 MIDI 速度的主要内容,如果未能解决你的问题,请参考以下文章

NAudio 和 Midi 文件读取

NAudio - 从 Stream 播放 MIDI

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

使用 NAudio 从一段 MIDI 文件中读取 MIDI 事件、消息

您如何确定 NAudio 1.7 中的 midi 文件持续时间(以条为单位)?

如何使用 NAudio 读取 MIDI 音符?