https://github.com/7474/SRC を弄るうえで避けて通れないのがMIDIファイルの再生なので少し手を付けてみた。できれば移植性のあるコードで再生したいので依存関係に.NET Standard 2しか入っていないっぽいNAudioを使って試してみた。バーンってMIDI対応してるっぽいこと書いてあるしな!!
var midiOut = new MidiOut(0);
var midiFile = new MidiFile(path, false);
var task = Task.Run(async () =>
{
var sw = new Stopwatch();
sw.Start();
var startMillis = midiFile.Events.StartAbsoluteTime;
foreach (var melist in midiFile.Events)
{
foreach (var me in melist)
{
var eventTime = me.AbsoluteTime - startMillis;
if (eventTime - sw.ElapsedMilliseconds > 0)
{
await Task.Delay((int)Math.Max(0, eventTime - sw.ElapsedMilliseconds));
}
midiOut.Send(me.GetAsShortMessage());
}
}
});