Воспроизведение файла Midi со смещением времени в C # - PullRequest
1 голос
/ 29 июня 2011

В настоящее время я пытаюсь просмотреть MIDI-файл при воспроизведении песни, при этом этот MIDI-файл «проигрывается» за несколько миллисекунд до начала песни. Более подробно, я визуализирую ноты песни, перемещая эти ноты справа налево экрана. Я создаю визуализацию заметок в правой части экрана по сигналу из файла midi, а затем начинаю переводить их влево. Я бы хотел, чтобы они миновали центр экрана одновременно с тем, как на самом деле звучит нота в песне.

Я могу нормально воспроизвести MIDI-файл, используя этот код:

 if (counter < _file.Events[track].Count)
        {
            double s_ms = Microsoft.Xna.Framework.Media.MediaPlayer.PlayPosition.TotalMilliseconds;
            double m_ms = _file.Events[track][counter].AbsoluteTime / _pulses_per_millisecond;
            if (s_ms + offset > m_ms)
            {
                counter++;
                if (_file.Events[track][counter].CommandCode == NAudio.Midi.MidiCommandCode.NoteOn)
                {
                    Console.Beep(777, 25);
                    Console.Write("Beep ");
                }
            }
        }

Смещение эффективно заставляет midi-файл воспроизводить серию нот, а затем возвращается в положение дорожки, в котором он был бы, если бы смещение не использовалось вообще.

Я в тупике и буду очень признателен за любую помощь. Я использую XNA 3.1 и NAudio. Миди играет вовремя с песней просто отлично. Конечно, мне нужно, чтобы скорость воспроизведения миди оставалась такой же, как и у песни.

1 Ответ

0 голосов
/ 30 июня 2011

Почему бы вам не воспроизвести 2 миди-файла одновременно, а использовать только один для вывода звука (если аудио API это поддерживает ...)

Или, что еще лучше, один раз проанализируйте весь файл midi. Получите заметку и ее время, и сохраните ее в одном большом массиве. При воспроизведении самого миди-файла используйте только что заполненный массив для визуализации нот.

...