我正在玩一个真正的玩具项目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一起做这件事?
答案 0 :(得分:1)
使用TempoEvent:
var evt = new TempoEvent(midiTempo, 0)