(реадми - кому неохота качать архив, чтобы понять что там внутри).
PSG packer - это упаковщик файлов PSG, музыкального формата звукового
чипа AY/YM, представляющего собой дамп регистров. Создавался с целью
быстрого проигрывания музыки в демах, так как существовавшие плэеры не
устраивали чудовищной скоростью работы. Проигрывание же обычного PSG на
реальном спектруме практически невозможно из-за огромного размера файла.
Данный пакер и есть компромисс между скоростью и объемом.
Прототип пакера был написан еще в 2009 году, вначале на спектруме, но
памяти и скорости 128к машины было недостаточно для усовершенствования
алгоритма, поэтому в итоге пакер был написан на С для пц в 2010-2011
году. Через год был написан плэйер для z80, а еще через год наконец-то
все собрано в приличный вид и готово к выпуску в массы. Но временный
(надеюсь) отход от сцены, незаинтересованность общественности, появление
альтернативных вариантов задержали релиз на полгода. Огромное спасибо
introspec'у за постоянную мотивацию и помощь, без него этого "релиза"
так бы и не было.
Основная идея компрессора слегка напоминает стандартную схему LZ77
(поиск сопадений с уже распакованным потоком), вывернутую наизнанку:
ищутся совпадения с фрагментами запакованного потока, без распаковки
данных в память. При этом для достижения высокой производительности
проигрывателя данные хранятся в виде PSG1 и PSG2 (в зависимости от
сложности фрейма музыки).
Характеристики пакера/плэера:
+ высокая скорость проигрывания: средняя скорость примерно 650 тактов,
пиковая 1089 тактов (не учитывая зацикливания музона). К примеру
используемый нами плэер Vortex Tracker'а имеет среднюю скорость в 5К,
пиковую около 10K при смене паттернов.
+ существует вариант плэера, выровненный на 4 такта (для использования с
мультиколорами и бордер-эффектами) со скоростью 1329 тактов. Огромная
благодарность introspec'у эа него. В планах у него же еще ровный плэер
с распаковкой в буфер.
+ независимость от исходного формата музыки. Так как упаковывается
PSG-файл, то нет никаких ограничений на формат оригинала, размеры
паттернов и скорость.
+ размер плэера - 348 байт для быстрого варианта и 427 байт для
выровненного (1617 байт у вортекса для сравнения).
- несмотря на паковку в 40-50% все равно достаточно большой размер
получаемого файла.
- зацикливание только на начало музыки (при этом происходит ощутимый по
масштабам плэера тормоз (до примерно 1800 тактов). Объясняется тем,
что писалось для себя и только для использования в демах, где loop
трека не нужен.
Использование пакера:
1. Экспортируйте ваш трек в регистровый формат (*.psg), это можно
проделать, например, с помощью программы AY-Emul версии 2.х (экспорт
в *.psg является одной из опций меню экспорта трека в плейлисте
программы) и сохраните его в папку к пакеру.
ВНИМАНИЕ! Использовать PSG-файл, сохраняемый в эмуляторе FUSE НЕЛЬЗЯ!!!
Там сохраняется дамп-регистров без упаковки, которая присутствует в
PSG, на которую пакер надеется и не проверяет. Файл упакуется, но
размер его будет огромным.
2. Перейдите в папку с пакером и наберите в командной строке
build имя_вашего_файла.psg
В качестве примера прилагается музыкальный трек из нашей демы Machined,
сочинённый Fatal Snipe; он назван "machined.psg". Чтобы скомпилировать
этой файл нужно выполнить в командной строке команду
build machined.psg
Батник автоматически создаст снэпшот с плейером (*.sna), магнитофонный
и дисковый образы (*.tap и *.scl); их можно запустить чтобы убедиться
в верности конверсии. Кроме этих файлов, программа создаст бинарный
файл (*.bin) который можно загрузить на спектруме с адреса 32768.
Плейер доступен в виде ассемблерного кода для ассемблера sjasmplus. Есть
2 версии плейера: "быстрая" версия, оптимизированная по скорости, и
"ровная" версия, приспособленная для использования в программах, которые
должны точно учитывать время исполнения (бордерные эффекты, мультиколоры
и т.п.). Обе версии проигрывателя должны компилироваться с адреса,
кратного 256.
Точки входа "быстрого" плейера совпадают с наиболее распространненным
плэером PT3.x(Vortex):
PLAYER: инициализация плейера
PLAYER+5: распаковка и проигрывание одного фрейма
PLAYER+8: остановка проигрывателя
Схема проигрывателя совершенно стандартна:
call PLAYER
loop: ei
halt
call PLAYER+5
jr loop
Слово передается introspec'у:
"Ровный" плейер устроен немного сложнее. Проигрывание музыки разделено
в нём на 2 шага: распаковка фрейма в буфер и проигрывание фрейма из
буфера. Буфер находится по стартовому адресу плейера (первые 13 значений
соответствуют регистрам 0..12, регистр 13 хранится по адресу PLAYER+14).
Это может пригодится для визуализаторов музыки.
У "ровного" плейера сделаны следующие точки входа:
PLAYER+16: инициализация плейера (требует 226 тактов процессора)
PLAYER+16+5: распаковка в буфер одного фрейма (требует не более 760
тактов, конкретное число тактов всегда кратно 4).
PLAYER+16+8: остановка проигрывателя (требует 212 тактов)
PLAYER+16+10: проигрывание текущего фрейма в буфере (требует 569 тактов
процессора)
Проигрыватель в этом случае будет выглядеть примерно так:
call PLAYER+16
loop: ei
halt
call PLAYER+16+10 ; постоянное число тактов
[...] ; другой код с постоянным числом тактов
; или числом тактов кратным 4
call PLAYER+16+5 ; число тактов кратное 4
jr loop
Пожалуйста учтите, что "ровный" плейер написан подразумевая отсутствие
задержек памяти и/или процессора. Т.е. на классических спектрумах он
должен либо выполняться в быстрой памяти, либо не одновременно с
отрисовкой экрана. Плейер не учитывает задержки М1 и, вообще, не
гарантирует правильное время исполнения на "жёлтых" Скорпионах и других
машинах с задержками различных сортов.
Благодарности:
+ key-jee//tbk - за идеи и помощь с пакером и плэером.
+ introspec - за мотивацию, сборку, помощь с плэером и за "ровный
вариант" оного.
+ sq//skrju - за аски-логу
Не буду претендовать на идеальность плэера, сорцы прилагаются. Если у
кого-то получится улучшить/убыстрить, буду только рад. Присылайте письма
на
psndcj.tbk@gmail.com.
(c) Triebkraft 02.03.2014