Воспроизведение TSFM треков

Начиная с версии 3270 в ZXTune появилась поддержка формата MTC.

Что это?

MTC (Multi Track Container) — контейнерный формат, позволяющий объединить различные треки для их последующего прослушивания как единого целого. Был придуман специально для вышеозвученной задачи, в частности, для комфортного распространения и прослушивания TSFM (TurboSound+TurboFM) треков. Несмотря на то, что на данный момент таких треков очень мало (мне удалось найти 6), задача видится гораздо более широкой и перспективной.

Характеристики «изобретения»

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

А послушать есть чё?
Чтоб не тянуть кота за подробности, можно скачать небольшой архив, в котором можно найти:
1) тулзу для работы с новым форматом (в архиве сборка под windows)
2) примеры треков с исходниками
3) скрипт для создания примеров из исходников (для демонстрации работы программы)

Бонусом можно послушать трек ProofOfConcept от самого Yerzmyey — микс из цифрового трека и обычного ау.

Технические подробности


С точки зрения данных, .mtc файл представляет собой IFF-контейнер из чанков, сгруппированных согласно структуре модуля.
Каждый чанк состоит из заголовка и данных. Заголовок занимает 8 байт и состоит из двух полей- идентификатора, состоящего из 4 символов и 4-байтовой длины данных, следующих за заголовком, в big endian формате. Чанк всегда выровнен по границе в 2 байта относительно начала данных.
Чанки могут располагаться последовательно, а могут быть вложенными друг в друга, образуя древовидную структуру данных. Ниже представлена структура типичного .mtc модуля в виде идентификаторов чанков, выровненных согласно вложенности.

MTC1 - единственный корневой чанк в файле
 <опциональные метаданные модуля>
 TRCK - трек
  <опциональные метаданные трека>
  DATA - данные для трека
  <опциональные метаданные для данных>
  <предыдущие два элемента могут повторяться, описывая несколько альтернативных источников данных для трека
 <другие треки>

Чанки метаданных:
NAME - название сущности (модуля/трека/потока данных)
AUTH - автор сущности
ANNO - комментарии
PROP - произвольное свойство в формате <имя>=<значение>

Строки хранятся без завершающего нуля.

Например, процесс создания одного модуля из примеров:

mtctool --create samples/CyberMotion.mtc \
          --title CyberMotion \
          --author Karbofos \
          --track samples/CyberMotion/cm.tfc \
          --track samples/CyberMotion/cyberm~1.mt3 \
          --track samples/CyberMotion/cyberm~2.m


Можно посмотреть содержимое результата:

mtctool --list samples/CyberMotion.mtc
Program=mtctool r3270 Apr 21 2015 windows-x86 i686
Title: CyberMotion
Author: Karbofos
 Track 0
  Data of size 10797
  Filename=cm.tfc
 Track 1
  Data of size 1101
  Filename=cyberm~1.mt3
 Track 2
  Data of size 1628
  Filename=cyberm~2.m

Видно, что для модуля указаны название и автор, а внутри содержится 3 трека. Дополнительная метаинформация (версия программы, создавшей файл, а также имена файлов) была добавлена программой mtctool.

Более сложный случай (не из примеров):

mtctool --create tsfm.mtc \
          --title "Complex TSFM track" \
          --author "Some cool musician" \
          --track \
            --property zxtune.core.aym.clockrate 1750000 \
            --property zxtune.core.aym.type 1 \
            --property zxtune.core.aym.layout 1 \
            ts_track.pt3 \
          --track tfm_track.tfe tfm_track.tfc

Создается контейнер tsfm.mtc с определенным названием и автором, содержащий два трека. Для первого, представляющего собой TurboSound трек, указываются дополнительные опции- частота чипа (1.75МГц), его тип (YM) и раскладка каналов (ACB). Для второго же трека указывается два источника данных- в оригинальном формате tfe и скомпилированный tfc. Плеер выберет один из них на свое усмотрение. Например, для воспроизведения на реальном ZX Spectrum подойдет только tfc вариант.
Имена свойств, интерпретируемых ZXTune, можно получить с помощью zxtune123, вызвав его с командами --list-attributes и --list-options. Свойства могут быть трех типов- число, строка и данные:

--property integer_property 100
--property string_property hello
--property data_property #00112233445566aabbccddee
--property another_string_property '1000' #одинарные кавычки обязательны для принудительной трактовки параметра как строки


Как можно заметить, контейнер можно использовать для хранения одного трека и его настроек или дополнительной метаинформации, которая не предусмотрена в оригинальном формате.

Для того чтобы вытащить оригинальные данные из контейнера, можно воспользоваться режимом --extract:

mtctool --extract samples\CyberMotion.mtc
Save 10797 bytes to cm.tfc
Save 1101 bytes to cyberm~1.mt3
Save 1628 bytes to cyberm~2.m


Спасибо moroz1999 , kyv и LessNick за помощь в тестировании и отзывы.

27 комментариев

avatar
Бонусом можно послушать трек ProofOfConcept от самого Yerzmyey — микс из цифрового трека и обычного ау.

О! как раз думал о треке ksa из эпилога с цифровыми ударниками, да и треки Scratchera с цифровыми семплами из Trashe и Condommed было бы клёво собрать в таком формате. Эх, мечты, мечты…
avatar
ну, и из SCROLLER тоже, вообще величайшая дема
avatar
я Condommed прекрасно перевел в Wav правда эмулятором и кусочек себе на рингтон поставил :)
avatar
Несколько вопросов (уж слишком я далеко от демосцен:))
— Из какого демо эпилог от ksa? Помню была какая-то, но название не вспомню.
— Поковырял Trashe/Condommed — цифровой музыки не нашел, только обычную. Если семплы выводятся через аук, то обычный .ay формат решит эту задачу. MTC- он для сведения сочетаний, отличных от ay+beeper или ay+ay
avatar
— Из какого демо эпилог от ksa? Помню была какая-то, но название не вспомню.

avatar
6:30
Тоже с цифросемплами.
avatar
Vitamin «Начиная с версии 3270 в ZXTune» — ты не желаешь использовать первую цифру для номера версии?
  • VBI
  • 0
avatar
Первую цифру чего для номера версии чего?:)
avatar
ZXTune 3 — звучит ГОРДО! %)
avatar
Не, я такой фаллометрией не страдаю:) Раньше номера версий назначались по номерам ревизий в репозитории. Сейчас назначаются на глаз по числу коммитов чтоб было кратно 10 (для андроидной версии надо).
avatar
окей!
avatar
Заметил, что ProofOfConcept.mtc в ZXTune играет не так, как на саундклауде. Слишком выпячена и хрипит огибающая. Какие-то настройки?..
avatar
Возможно, у Yerz'a стоит YM или другая раскладка каналов (тогда огибающая может маскироваться дигитальным треком).
avatar
avatar
Немного лучше, но не очень.
Сравни: soundcloud.com/yerzmyey/yerzmyey-proof-of-concept
У Йежа играет намного мягче.

Заодно заметил багу:
при перемотке трека ползунком происходит сначала заедание «ды-ды-ды-ды-ды», потом начинает играть невпопад — разъезжаются каналы, скачет скорость воспроизведения.
avatar
Ребята, не забывайте пожалуйста, что Yerzmyey обычно обрабатывает свои записи эквалайзером. Т.е. это не самый надёжный источник если вам хочется чтобы играло точь-в-точь «как на реале».
avatar
Я как-то об этом не подумал. У меня есть этот музончик в тапках, надо послушать на реале.
avatar
Да, с учетом этой поправки — вариант 2 намного ближе к «оригиналу».
avatar
Тупо включен режим моно, ничего большего. Ибо у Ерза резинка.
avatar
Ибо у Ерза резинка.
Надо запилить статью на хайпе о том, что Yerz произносится как «йеж». Может хоть кто-то запомнит…
avatar
Надо запилить статью на хайпе о том, что Yerz произносится как «йеж». Может хоть кто-то запомнит…
А это по правилам польской грамматики или в честь криво сокращенного полного ника?
avatar
По правилам польской грамматики (которую я знаю уже лет 20 не хуже русской) сочетание «rz» читается как «ж», кроме случаев, когда оглушается предыдущей глухой согласной типа «p», «t», «k». Zabrze [забжэ], dobrze [добжэ], krzywy [кшывы], przestrzen [пшэстшэнь]. Именно этому звуку, этимологически соответствующему русскому «рь», польский обязан своим характерным имиджом (остальные шипящие такие же как в русском). Сравни: река — rzeka [жэка], три — trzy [тшы].
Насчет «Y» — это йожык повыъебывался, ибо «y» в польском — это всегда и без исключений «ы». Но в данном случае, очевидно, что используется, как в английском — «й».
avatar
Ну это вот кому близок польский, тот и знает эти исключения. Остальные англопричастные типа меня юзают zh как заменитель «ж» (соотвецно, z — как «з» безо всякого). Ну и опять же, начальная Y получается вносит сумятицу.

Напоминает историю как чувак по имени Семён без задней мысли транслитерировал имя в ник (semen) и долго не мог понять почему его подкалывают:) Патамушта не учел специфику аудитории.
avatar
Я гарантирую, что ни одному поляку не придет в голову произнести rz иначе как ж. А как это произносят 95% — всем как обычно.
avatar
На реале не получится. Понадобится два реала и пляска с бубном.
avatar
Это я знаю. Можно по очереди отцыфровать и смешать.
А чо там с перемоткой?
avatar
Заикание- тонкости работы через dsound (через win32 такого не будет), но можно попытаться пофиксить. Расхождение треков посмотрю завтра.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.