Итак, поговорим немного о стандарте MIDI. Несмотря на то, что основным его предназначением было создание единого протокола связи между музыкальными инструментами, он завоевал довольно большую популярность и в виде файлового формата. Ввиду ограниченного банка сэмплов и низкого качества воспроизведения большинством стандартных программных синтезаторов, с увеличением объёма носителей данных и распространением качественных аудиокарт этот формат практически ушёл в небытие, будучи вытесненным оцифрованными аудиозаписями. Тем не менее, он успел снискать некоторую популярность, в особенности на мобильных устройствах, которые до недавнего времени были довольно ограничены в плане железа.
Но суть рассказа, собственно, не в этом. Суть в исследовании того, насколько совестно в наше время производителями программного обеспечения поддерживаются стандарты.
Идём в Википедию. За длительное время существование там выросла довольно подробная, местами до сих пор неточная, однако в целом хорошая, статья по данному стандарту. Итак, читаем внимательно и находим вот такой интересным момент:
Формат разработан таким образом, чтобы любой секвенсор мог читать и записывать такой файл таким образом, чтобы не потерялись его данные, и так, чтобы формат был достаточно гибким, чтобы приложения могли сохранять в файлах свою специфическую информацию, понятную только этим приложениям, но не понятную другим программам-приложениям, причем при загрузке файлов MIDI непонятная другим программам-приложениям информация не приводит к недоразумениям, а просто игнорируется.… Различные программы-секвенсоры способны читать MIDI-файлы, подобно тому, как различные текстовые редакторы читают ASCII-файлы, которые могут содержать вспомогательную информацию, понятную лишь данному редактору. Но в отличие от ASCII-файлов MIDI-файлы содержат цифровую информацию, и к тому же эта информация сохранена в виде записей, то есть групп байтов, которые содержат свой заголовок, состоящий из идентификатора записи и длины записи. Эти записи могут форматироваться, загружаться, игнорироваться и т. д. независимо друг от друга. Для осуществления работы с записями программы-приложения используют дополнительную информацию, записываемую в MIDI-файл. Например, возможно, программа «захочет» сохранить флаг, указывающий на то, что пользователь установил включенным звук метронома. Программа может вставить этот флаг в MIDI-файл таким образом, что другая программа-приложение сможет пропустить этот флаг без внимания. В будущем, возможно, существующий формат MIDI будет расширен и появятся новые типы записей. Новые программы для работы с MIDI-файлами будут распознавать и новые типы записей. Однако старые MIDI-файлы могут быть воспроизведены в своем исходном виде. Формат MIDI задуман таким образом, что с его расширениями будут совместимы более ранние его версии.
Как мы видим, стандарт не накладывает никаких ограничений на записи, которые может содержать MIDI-файл, то есть кроме стандартных MThd и MTrk он может содержать всё, что угодно, при условии, что оно корректно сохранено в виде записи с четырёхбайтовым заголовком и четырёхбайтовой длиной записи. И любой проигрыватель, поддерживающий воспроизведение MIDI-файлов, обязан такую запись проигнорировать. Но так ли это? Чтобы проверить это, нам нужен файл, содержащий такие нестандартные записи. Можно, конечно, создать его из любого MIDI-файла самому, отредактировав в шестнадцатеричном редакторе, но есть реальные примеры таких файлов…
Итак, наверняка многие посетители, имеющие представление о телефонах Sony Ericsson на платформах A100/A200, помнят незатейливый полифонический редактор MusicDJ. Суть его в том, что из готовых отрезков барабанных, басовых, клавишных и духовых партий разных стилей собирается своего рода музыкальное произведение. У большинства, разумеется, дальше «Hello world» простеньких «тили-тили-трали-вали» не заходило, что-то стоящее в этом редакторе писали единицы. И как же они огорчались, когда оказывалось, что ни на компьютере, ни на других телефонах их поделия не воспроизводятся. Но дело вовсе не в том, что файлы сохраняются в каком-то проприетарном никому не ведомом формате. Это обычные MIDI-файлы, но с одним «но»: они содержат «нестандартную» запись с заголовком SEM1. Зачем она нужна? Дело в том, что MusicDJ позволяет не только создавать мелодии, но и редактировать созданные. А поскольку распознать в готовом файле, из каких кусочков он собран, довольно сложно, в файл отдельно записывается последовательность номеров этих самых кусочков. Всё просто — редактор читает запись SEM1, восстанавливает последовательность отрезков музыки и сами отрезки уже может даже не читать. Итак, берём файл-пример из стандартных рингтонов — MusicDJ demo — и просматриваем его в шестнадцатеричном виде:
Как мы видим, ничего не нарушено, с MThd всё в порядке, с SEM1 тоже, длина записи соответствует указанной. Пробуем воспроизвести… Windows Media Player, Media Player Classic, Nokia Multimedia Player, Winamp, GOMPlayer, KMPlayer… все, как один, выдают ошибку воспроизведения. Даже AIMP и XMPlay с их хвалёной библиотекой bassmidi, которая использует не синтезатор, а т. н. «звуковые шрифты», благодаря чему обеспечивает превосходное качество звучания, «прожёвывать» файл отказываются.
Но «врагу не сдаётся наш гордый Варяг»… На диске из комплектации телефона (в данном случае — W660i), вместе с программкой для конвертации музыки в MP3 и какой-то обрезанной редакцией Фотошопа (скорее напоминающей по функционалу AcdSee, да ещё и Trial-версия) лежит установщик Apple QuickTime Player (кстати, несмотря на то, что роль плеера на Маках давно стал выполнять iTunes, это простенький продукт, во времена Win98 стоявший у многих ввиду поддержки большого числа кодеков, до сих пор поддерживается и обновляется корпорацией, причём как для MacOS, так и для Windows). Любопытно, что о том, зачем он там, собственно, лежит, в документации ничего не сказано. Устанавливаем, открываем в нём наш злосчастный файл, и — о чудо! — он воспроизводится. Причина тому проста — QuickTime Player использует свой собственный синтезатор (разработанный, однако, Roland), который с такой мелочью почему-то справляется. С другой стороны, воспроизводится мелодия в нём с заметным паннингом, хотя на телефоне в наушниках музыка звучит однозначно одноканально, да и команд паннинга в файле нет. Видимо, таким образом синтезатор имитирует звучание оркестра (хотя об этом, по сути, нужно при записи файла заботиться, а не при воспроизведении).
Для подтверждения гипотезы, вооружаемся шестнадцатеричным редактором, удаляем из файла «необычную» запись, и — вуаля! — файл воспроизводится в любом плеере. А вот в MusicDJ его уже, конечно, не отредактировать. Sad, but true. И невольно поднимается вопрос: почему такая мелочь, как неизвестная запись в файле, приводит плееры в ступор? Почему потоковое вещание обрывается при потере нескольких десятков битов? Почему маленькая царапина на DVD-диске может привести к его полному нераспознаванию DVD-проигрывателями? Ответ один: если бы архитекторы так проектировали дома, как программисты пишут код, то все города в зонах сейсмической активности давно лежали бы в руинах… И дело тут даже не в совести, а в жёстких временных рамках, превращении творческой профессии в способ заработка, формализация процесса сертификации ПО… Грустно смотреть, что объёмы и ресурсоёмкость операционных систем растут быстрее, чем ёмкость накопителей, частота процессоров и объёмы оперативной памяти.
Автор: bodqhrohro