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

Место общения программистов C#
Ответить
Anonymous
 Чтение нот из MIDI-файла с помощью NAudio

Сообщение Anonymous »

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

Код: Выделить всё

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

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. Если я посмотрю в обоих событиях ( и NoteOff) я получал повторяющиеся заметки. Я прав?

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

Код: Выделить всё

((note.AbsTime - lastTempoEvent.AbsTime) / midi.ticksPerQuarterNote) * tempo + lastTempoEvent.RealTime.
Я не знаю параметров LastTempoEvent.RealTime и tempo. Это темп последнего события темпа или?

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

Подробнее здесь: https://stackoverflow.com/questions/238 ... ing-naudio
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»