Чтение нот из файла MIDI с помощью NAudio

Задача - получить все ноты и их время из MIDI-файла с помощью библиотеки NAudio. До сих пор я получаю все заметки из файла, но я не могу получить их время.

            Note noteOn = new Note(); //custom class Note
            MidiFile midi = new MidiFile(open.FileName);
            List<TempoEvent> tempo = new List<TempoEvent>();

            for (int i = 0; i < midi.Events.Count(); i++)
            {
                foreach (MidiEvent note in midi.Events[i])
                {
                    TempoEvent tempoE;

                    try { tempoE = (TempoEvent)note; tempo.Add(tempoE); }
                    catch { }

                    if (note.CommandCode == MidiCommandCode.NoteOn)
                    {
                        var t_note = ( NoteOnEvent)note;

                        var noteOffEvent = t_note.OffEvent;

                        noteOn.NoteName.Add(t_note.NoteName);
                        noteOn.NoteNumber.Add(t_note.NoteNumber);
                        noteOn.NoteVelocity.Add(t_note.Velocity);
                        noteOn.NoteLenght.Add(t_note.NoteLength);

                        double d = (t_note.AbsoluteTime / midi.DeltaTicksPerQuarterNote) * tempo[tempo.Count() - 1].Tempo;

                        noteOn.StartTime.Add(TimeSpan.FromSeconds(d));
                    }

                }
            }

Вопросы:

1) Чтобы получить только список заметок, я просто смотрю вNoteOnEvents или нет? Если я правильно понимаю, каждая нота имеет «начало» и «конец», начало определяетсяNoteOnEvent и «конец» определяется какNoteOffEvent, Если я посмотрю в обоих событиях (NoteOn а такжеNoteOff) Я бы получил дубликаты заметок. Я прав?

2) Как узнать время заметки? В соответствии сэта почта Я получаю некоторые значения, но кажется, что время первой ноты правильное, а другие нет. Также в этом посте есть комментарий, в котором говорится, что формула для расчета времени должна быть:

((note.AbsTime - lastTempoEvent.AbsTime) / midi.ticksPerQuarterNote) * tempo + lastTempoEvent.RealTime.

Я не знаю параметровlastTempoEvent.RealTime а такжеtempo, Это темп последнего события темпа или?

3) Чтение MIDI-файла происходит очень медленно, для небольших файлов это нормально, но для больших файлов - нет. Это небольшие файлы имеют ~ 150NoteOnEvents и это большие файлы имеют ~ 1250NoteOnEventsчто не так "тяжело". Почему так медленно?

Ответы на вопрос(2)

Ваш ответ на вопрос