«Лишние» записи в MIDI, или Как разработчики ПО соблюдают стандарты

Итак, поговорим немного о стандарте 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-проигрывателями? Ответ один: если бы архитекторы так проектировали дома, как программисты пишут код, то все города в зонах сейсмической активности давно лежали бы в руинах… И дело тут даже не в совести, а в жёстких временных рамках, превращении творческой профессии в способ заработка, формализация процесса сертификации ПО… Грустно смотреть, что объёмы и ресурсоёмкость операционных систем растут быстрее, чем ёмкость накопителей, частота процессоров и объёмы оперативной памяти.
Share post

Similar posts

Comments 17

    0
    Sonar 6 запросто открыл и воспроизвёл файл.
    При сохранении под другим именем в формате MIDI 1 — файл «похудел» на три килобайта. :)
      +1
      Ну сонар это все таки профессиональный софт, там реализация миди не для галочки
        0
        Ситуация с плеерами, это ошибка программистов, которые не стали следовать стандарту до конца, а реализовали только этап воспроизведения нотных данных. Логика, которой они руководствовались, скорее всего проста: обычный пользователь вряд ли будет работать с миди-файлами, содержащими необычные данные. Соответственно — можно сэкономить время.
        А вот если использовать для воспроизведения секвенсор (то есть программу, априори предназначенную для работы с миди-протоколом, в числе прочего) то всё нормально. Просто потому, что задача этого ПО несколько другая.

        А почему он воспроизводится в QuickTime без ошибок, так на это есть ответ в статье:

        Причина тому проста — QuickTime Player использует свой собственный синтезатор (разработанный, однако, Roland)


        Всё же Roland — далеко не последнее имя в разработке всяких синтезаторов, работающих в том числе с управлением по миди-протоколу. И было бы просто позорно, если бы у такого производителя, грубо говоря, собственный протокол не работал как следует. :)
        +1
        VLC тоже воспроизводит (нужен звуковой шрифт, скачать можно с SourceForge).
        +1
        Почему маленькая царапина на DVD-диске может привести к его полному нераспознаванию DVD-проигрывателями?
        Вот да, бывает возьмёшь в прокате какой-нибудь старый диск — исцарапанный весь, но спокойно играется в дешёвом домашнем DVD-проигрывателе. Засовываешь его в комп, чтобы рипнуть для планшета — ни одна программа его не берёт.
          0
          Для поцарапаных дисков могу порекомендовать Non-Stop Copy. Копирует файлы с дисков в несколько раз быстрее Проводника, из повреждённых участков восстанавливает всё, что только можно, наглядно отображая весь процесс.
          Пару лет назад почти полностью (за исключением нескольких карт и баз данных) восстановил ею. древний (ещё для Win98 написаный) атлас с убитого CD-диска. После копирования на винчестер и правки десятка записей в реестре (для отлучки от диска) он таки заработал:)
            0
            1. Для DVD эта программа вряд ли поможет — файлы мало скопировать, их нужно расшифровать.
            2. «ОС Windows (9x, NTx)» :)
              0
              В первый раз слышу про шифрованные DVD. У меня со всех дисков видео открывается (файлы VOB). Если бы там регион, допустим, не совпадал, чтение аппаратно было бы заблокировано приводом, можно подробнее, что Вы имеете в виду?
                0
                Видимо, систему шифрования содержимого – она используется на многих лицензионных DVD (не на всех). Либо у Вас диски без защиты от копирования, либо Вы открываете плеером – они на лету дешифруют.
                  +1
                  Под Windows есть программа AnyDVD, она работает как драйвер в фоне расшифровывая диски, так что можно копировать хоть Проводником.
                  Под OS X пока не нашёл аналога.
                    0
                    Это да, хотя для резервных копий мне больше нравятся варианты, которые не мониторят обращения к диску постоянно – DVD Decrypter (прекращена разработка по требованию Macrovision) или аналоги.
                      +1
                      AnyDVD, вроде бы, можно отключать и включать по желанию. Но оно только под Windows :(
                      Пока обхожусь MakeMKV (сайт прямо сейчас снова лежит) — в отличии от остальных рипперов эта программа не загружает процессор на маке и довольно шустро перегоняет DVD в mkv-файл, но без перекодирования видео, так что файл получается размером с DVD — 5-6 GB.
                  +1
                  В первый раз слышу про шифрованные DVD.
                  А вы с какой планеты? :)
                    0
                    С той, где лицензионные DVD вообще большая редкость:)
            0
            У меня на OS X этот файл тоже открывается и играет.
              0
              Дык не мудрено:) читайте выше.

              Вообще, по идее, под Макосью как раз должно проигрываться любым плеером, который использует стандартный системный синтезатор (он-то по умолчанию QuickTime-овский).
              0
              Кто бы знал, что эта хрень, Quicktime (под Windows), может осуществить мечту и проиграть мелодии из MusicDJ!
              А самое обидное, что iTunes, мой стандартный плеер, тоже все это может (что логично из-за quicktime).

              Все лежало под носом.

              Спасибо bodqhrohro большое!

              Only users with full accounts can post comments. Log in, please.