Добавление MIDI-файлов с помощью bytearray в Actionscript 3 - PullRequest
0 голосов
/ 13 февраля 2012

Мне нужно добавить MIDI-файлы: оставить заголовок (одинаковый для всех файлов) и другую мета-информацию, просто скопировать партию музыки / партитуры. У меня уже есть MIDI-файлы в соответствующих байт-массивах, так как я догадался, что мне нужно использовать writeBytes, но, к сожалению, не смог найти, какие байты мне нужно взять и скопировать. Примерно так:

 var newFileBytes:ByteArray=new ByteArray();
 newFileBytes.writeBytes(firstMIDIBytes);
 newFileBytes.writeBytes(secondMIDIBytes,8);

Работает только частично, файл воспроизводим; первая часть полностью, а вторая - только некоторые заметки (затем игрок зависает)

Честно говоря, byteArrays - не моя сильная сторона, как структура файла MIDI. Можете ли вы предложить, как решить эту проблему? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

Структура файла MIDI не позволяет просто «добавить» к нему больше данных по следующим причинам:

  1. Каждый трек заканчивается событием «Конец трека», отображая всепримечания после этого события не имеют смысла.
  2. Каждый фрагмент заголовка дорожки определяет размер данных, которые следуют.Даже если вы добавляете новые данные, любой читатель будет читать только [размер] байтов, прежде чем начнет искать новую дорожку.
  3. MIDI-файл определяет, сколько дорожек присутствует в файле, поэтому даже если вы добавилиМассив байтов одной дорожки MIDI, если вы не обновите счетчик дорожек данных заголовка, любой читатель просто проигнорирует добавленную дорожку.

Если вы добавляете данные в файл MIDI, вам нужночтобы убедиться, что структурная целостность формата файла сохраняется.Простое добавление данных не позволяет этого сделать.

0 голосов
/ 14 февраля 2012

Согласно моему комментарию, вы, вероятно, хотите добавить эти файлы, а не объединить их. Предполагая, что это так, вы не можете просто добавить данные из второго файла в конец первого. Поскольку протокол MIDI оптимизирован по полосе пропускания, он делает ряд предположений относительно потоковой передачи событий. Такое поведение означает, что вы должны соблюдать особую осторожность при добавлении данных MIDI.

MIDI-файлы могут (и обычно) использовать текущее состояние, что означает, что четное число может пропускать байт состояния, и в этом случае событие должно использовать байт состояния предыдущего события. Это может не быть причиной ваших проблем, но вы абсолютно уверены, что вы анализируете только необработанные MIDI-данные, а не заголовки файлов и тому подобное? Если бы это было так, все виды странных данных были бы ошибочно интерпретированы как действительные события MIDI.

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

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

...