Как-то давно, еще делая демку на tum2009 я искали быстрый проигрыватель AY-музыки, но на все мои вопросы что хочу в районе 1500 тактов говорили что это нереально.
Тогда помню мне пришлось ручками переводить музыку из PT3 в PSC, ибо плейер первого никак не влезал под некоторые эффекты...
Теперь для меня это в прошлом!
Представляю вам универсальный проигрыватель и компилятор, который не зависит от типа используемого трекера, а компилирует дамп AY регистров, при этом размер компилированного модуля примерно в полтора раза больши, а порой даже меньше чем оригинала 
кушает 964..1251t, в зависимости от музыки, при компиляции указывается точный диапазон тактов под конкретный музон (или фиксированное кол-во тактов)
Метод сжатия основан на том, что в паттернах каналов бывают повторяющиеся фрагменты.
Каналы паттерна рассматриваются отдельно друг от друга, также отдельно рассматриваются огибающая с формой, регистр управления и шума, в результате получаем список повторяющихся фрагментов для каждого канала и табличку (трек) для их проигрвания.
Сами данные регистров ay группируются в группы (например reg0, reg1, reg8) и составляется табличка вариантов принимаемых значений, из которой по индексу вытаскиваем значения.
Приведу тут наглядно примерный алгоритм (остальное - проигрыватель, компилер и пример в приложенном файле):
Рассмотрим какие регистры AY присутствуют в дампе
и какие биты в них задействованы:
Код:
;-----------------------------------------------------------
; Регистр / Номер / Обознач./ диапазон / битовая раскладка
;-----------------------------------------------------------
; RegA_lo 0 L 0-255 LLLLLLLL
; RegA_hi 1 H 0-15 0000HHHH
; RegA_Vol 8 V 0-15 000EVVVV
; RegB_lo 2 L 0-255 LLLLLLLL
; RegB_hi 3 H 0-15 0000HHHH
; RegB_Vol 9 V 0-15 000EVVVV
; RegC_lo 4 L 0-255 LLLLLLLL
; RegC_hi 5 H 0-15 0000HHHH
; RegC_Vol 10 V 0-15 000EVVVV
; Noise 6 N 0-31 000NNNNN
; Control 7 C 0-63 00cccCCC
; Period_lo 11 p 0-255 pppppppp
; Period_hi 12 P 0-255 PPPPPPPP
; Form 13 F 0-15 0000FFFF
Разделив на "каналы", данные можно представить следующим образом
Код:
; Channel_A
; LLLLLLLL 0000HHHH 000EVVVV (3 байта, reg 0,1,8)
; Channel_B
; LLLLLLLL 0000HHHH 000EVVVV (3 байта, reg 2,3,9)
; Channel_C
; LLLLLLLL 0000HHHH 000EVVVV (3 байта, reg 4,5,10)
; Channel_Env
; pppppppp PPPPPPPP 0000FFFF (3 байта, reg 11,12,13)
; Channel_Reg
; 000NNNNN 00cccCCC (2 байта reg 6,7)
Далее для каждого из "каналов" вычисляем кол-во принимаемых значений, и составляем таблицу возможных значений (256 знач макс)
если значений больше 256, то разделяем на более мелкие каналы
(например Channel_A оставляем только значения частоты, и например если кол-во вариантов Channel_Reg больше 256, то рассматриваем отдельно Channel_Noise, Channel_Control)
Далее разделяем каналы на паттерны, вычисляем совпадающие паттерны, и составяем треклист содержащий адреса паттернов в памяти
Если сразу не понятно - смотрим листинг кода проигрывателя.
Есть ограничения:
- длинна паттернов может быть хоть с постоянной, хоть с плавающей скоростью, но должно соблюдаться правило: длина паттерна в прерываниях должна быть одинаковой, либо половиной/четвертью и т.д.
Версия 1.3
Основное - добавил анализатор трека при загрузке (очистка неиспользуемых регистров, удаление громкости если установлена огибающая в регистрах громкости и т.п.) ну и по мелочи.