2011-06-24 93 views
0

我在這裏發佈我的問題,因爲它建議在NAudio頁面(http://naudio.codeplex.com/documentation)上這樣做。NAudio和Midi文件讀取

鑑於我已經用NAudio加載了一個.mid文件,我想在適當的時候逐步完成一個曲目的事件。在到達「NoteOn」事件後,我想寫一些類似「Beep」的控制檯。這樣我可以顯示.mid文件的簡單活動。詳細地說,我該如何正確地逐步完成文件的事件?

我正在使用vsC#2008和NAudio的.dll工作正常。我已經在庫中加載了一個midi文件,可以提取軌道信息和所有內容,但我不確定如何在時間方面使用它。我想我需要用提供的「絕對時間」或「增量時間」值做些事情。感謝您的幫助。

編輯: 經過一個非常有用的迴應,我能夠弄清楚如何去做我想要的。

double convertAbsoluteTimeToMilliseconds = 1.0/30.0; 
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
    sw.Start(); 
    foreach (MidiEvent note in _f1.Events[1]) 
    { 
     while (note.AbsoluteTime * convertAbsoluteTimeToMilliseconds > sw.ElapsedMilliseconds) { } 
     if(note.CommandCode==MidiCommandCode.NoteOn) 
      Console.Write ("beep "); 
    } 
    sw.Stop(); 

如果有人知道另一種方法來做到這一點,請讓我知道。由於某種原因,使用睡眠時間會導致響應速度變慢,速度變慢。這似乎很好地工作。另外,我確定「convertAbsoluteTimeToMilliseconds」取決於機器。

回答

2

僞代碼:

DateTime offset = DateTime.Now; /Start playing here. 
foreach (MidiEvent note in events) 
{ 
    DateTime beepAt = offset.AddMilliseconds (note.AbsoluteTime * convertAbsoluteTimeToMilliseconds); 
    System.Threading.Thread.Sleep (beepAt - offset); 
    Console.WriteLine ("beep"); 
} 
+0

謝謝您的答覆。你的僞代碼真的幫助我弄清楚如何做我想做的事。 – viperld002