NAudio и Midi чтение файла - PullRequest
0 голосов
/ 25 июня 2011

Я публикую свой вопрос здесь, как это было предложено на странице NAudio (http://naudio.codeplex.com/documentation).

Учитывая, что я загрузил файл .mid с помощью NAudio, я бы хотел своевременно просмотреть события дорожки. При достижении события «NoteOn» я хотел бы написать в свою консоль что-то вроде «Beep». Таким образом, я мог отобразить простую активность файла .mid. Подробно, как я могу правильно просмотреть события файла во времени?

Я использую vsC # 2008 и .dll из NAudio работает нормально. Я загрузил в MIDI-файл с библиотекой и могу извлечь информацию о треке и все остальное, но я просто не уверен, как использовать его в отношении времени. Я думаю, что мне нужно что-то сделать с предоставленными значениями «абсолютного времени» или «дельта-времени». Спасибо за помощь.

Edit: После очень полезного ответа я смог понять, как делать то, что я хотел.

   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" зависит от машины.

1 Ответ

2 голосов
/ 25 июня 2011

Псевдокод:

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");
}
...