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

时间:2014-01-30 19:22:27

标签: c# midi naudio

我正在玩一个真正的玩具项目NAudio,一个简单的音乐DSL。我想在MIDI流中设置速度我从头开始创建 - 实际上是从DSL开始 - 但我无法弄清楚如何发送速度(即每分钟节拍,即一分钟内的季度数) ),或者我能做得更好,但我必须使用黑客。 默认的MidiEvent构造函数/方法不允许我将额外的数据发送到流中(tempo被bitcoded为3个字节,表示四分音符的ms持续时间)并且我没有找到一种方法来执行此操作,除了这个糟糕的黑客(BTW就像魅力一样):

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 个答案:

答案 0 :(得分:1)

使用TempoEvent:

var evt = new TempoEvent(midiTempo, 0)