FLS

Общие замечания

Информация о трекере поступила ко мне от Евгения Барского в виде архива мелодий и исходника плеера. Из-за наличия исходника формат немедленно был добавлен в Ay_Emul с расширением имени файла ".fls".

Главная особенность формата – привязка всех указателей к адресу компиляции. В этом же и его главная проблема: для того, чтобы проиграть FLS-модуль, нужно определить этот адрес компиляции. Внутри модуля он нигде не хранится, таких же простых методов, как с большинством других привязанных к адресу форматов, не применить. Ay_Emul применяет перебор вариантов в наиболее вероятном диапазоне с глубоким тестированием валидности каждого варианта. Громоздко, но работает достаточно быстро, так как неверные варианты отпадают почти сразу.

Второй момент, на котором бы хотелось заострить внимание: структура сэмплов, орнаментов и каналов паттерна полностью идентична STC. Единственная не совпадающая с STC структура – список позиций: в нём отсутствует информация о транспозиции.

Таким образом, любой FLS можно без потерь конвертировать в STC. Однако конвертировать в FLS можно только те STC, в которых не используется транспонирование паттернов.

Поскольку редактор для AY с названием "Flash Tracker" публике представлен так и не был, можно предположить, что все встречающиеся в архивах и в различных программах модули FLS получены конвертированием из STC.

Формат модуля

СмещениеРазмерОбозначениеОписание
+02PossPtrУказатель на список позиций.
+22OrnsPtrУказатель на орнаменты.
+42SamsPtrУказатель на сэмплы.
+6?PatPtrsПо три указателя (описатели каналов A, B, C, итого 6 байт) на каждый паттерн (нумерация с 1).
+OrnsPtr?OrnPtrsУказатели на орнаменты (до 15 штук, нумерация с 1).
+SamsPtr?SamPtrsДля каждого сэмпла (до 16 штук, нумерация с 0) по четыре байта:
+0 – 0 – сэмпл не зациклен, 1..32 – тик для зацикливания, увеличенный на 1;
+1 – 1..32 – количество тиков в зацикленной части для зацикленных сэмплов (для незацикленных сэмплов не используется, но обычно 1);
+2 – указатель на тело сэмпла.
+PossPtr?PosListСписок паттернов в порядке проигрывания, 0 – маркёр конца списка.
+PatPtrs[]?PatChnsСписок описателей каналов паттернов, у каждого такая же структура, как в обычном STC. Когда анализатор канала в плеере FLS встречает орнамент 0, происходит простое выключение орнамента (в STC играется пустой нулевой орнамент). Также этот анализатор по-другому интерпретирует избыточный код 0x82: в оригинальном STC устанавливается 0-й орнамент, в FLS – тип огибающей 2 и извлекается один байт для периода огибающей (похоже в плеере FLS просто ошибка).
+OrnPtrs[]?OrnsОрнаменты (по 32 байта в каждом), такие же, как в STC.
+SamPtrs[]?SamsСэмплы (по 3 байта на тик, 32 тика на сэмпл), такие же, как в STC.