AY-Track: -= X-FILES THEME =-
__________________________________________
__________________________________________
UNIVERSAL PT3 PLAYER
--------------------
Итак, Pro Tracker 3.31... В его SETUP'е
есть возможность смены таблицы нот: PT или
ST. Пока вы компилируете музыку вместе с
player'ом - все в порядке. Но когда на па-
ру десятков музонов приходится лишь один
player - начинаются проблемы...
Дело в том, что таблица нот находится в
проигрывателе (в самом деле, не пришивать
же ее к каждому музону ?). Поэтому музыка,
рассчитанная на другую табличку, будет иг-
раться таким player'ом просто отвратитель-
но (особенно, если используются Envelope -
они-то будут играть по-старому, вне зави-
симости от таблицы нот !).
С таким явлением столкнулся DANIEL при
подготовке Deja Vu #07. Помимо обезглючен-
ной версии, по стране гуляет вариант жур-
нала, в котором один музон (мой!) непра-
вильно играется. Кроме того, в 128-й обо-
лочке этой версии (в листалке) портится
стрелка.
К счастью, вскоре глюки были замечены и
исправлены. Для player'а пришлось хранить
две таблицы нот (по 192 байта каждая) и
для каждого музона ввести флажок, означаю-
щий тип таблицы. Причем, из-за катастрофи-
ческой нехватки памяти в 128-й оболочке,
пришлось одну из этих табличек кинуть на
область (257 байт) вектора прерываний...
Это и побудило меня заняться изучением
player'а. Оказалось, что в компилированном
модуле имеется один такой невзрачный бай-
тик, означающий тип таблицы. В проигрыва-
теле этот байтик никак не используется, и
в описании про него ничего не сказано...
Находится он по смещению #63 от начала мо-
дуля (без player'а), сразу за последним
байтом информации об авторе музыки.
Байтик этот равен нулю, если музон рас-
считан на Pro Tracker'овскую таблицу нот;
единице - на Sound Tracker'овскую.
На всякий случай привожу сами таблицы:
Pro Tracker frequency table:
╒════╤════╤════╤════╤════╤════╤════╤════╤════╤════╤════╤════╕
│#C21│#B73│#ACE│#A33│#9A0│#916│#893│#818│#7A4│#736│#6CE│#66D│
│#610│#5B9│#567│#519│#4D0│#48B│#449│#40C│#3D2│#39B│#367│#336│
│#308│#2DC│#2B3│#28C│#268│#245│#224│#206│#1E9│#1CD│#1B3│#19B│
│#184│#16E│#159│#146│#134│#122│#112│#103│#0F4│#0E6│#0D9│#0CD│
│#0C2│#0B7│#0AC│#0A3│#09A│#091│#089│#081│#07A│#073│#06C│#066│
│#061│#05B│#056│#051│#04D│#048│#044│#040│#03D│#039│#036│#033│
│#030│#02D│#02B│#028│#026│#024│#022│#020│#01E│#01C│#01B│#019│
│#018│#016│#015│#014│#013│#012│#011│#010│#00F│#00E│#00D│#00C│
╘════╧════╧════╧════╧════╧════╧════╧════╧════╧════╧════╧════╛
Sound Tracker frequency table:
╒════╤════╤════╤════╤════╤════╤════╤════╤════╤════╤════╤════╕
│#EF8│#E10│#D60│#C80│#BD8│#B28│#A88│#9F0│#960│#8E0│#858│#7E0│
│#77C│#708│#6B0│#640│#5EC│#594│#544│#4F8│#4B0│#470│#42C│*3F0│
│#3BE│#384│#358│#320│#2F6│#2CA│#2A2│#27C│#258│#238│#216│#1F8│
│#1DF│#1C2│#1AC│#190│#17B│#165│#151│#13E│#12C│#11C│*10B│#0FC│
│#0EF│#0E1│#0D6│#0C8│#0BD│#0B2│#0A8│#09F│#096│#08E│#085│#07E│
│#077│#070│#06B│#064│#05E│#059│#054│#04F│#04B│#047│#042│#03F│
│#03B│#038│#035│#032│#02F│#02C│#02A│#027│#025│#023│#021│#01F│
│#01D│#01C│#01A│#019│#017│#016│#015│#013│#012│#011│#010│#00F│
╘════╧════╧════╧════╧════╧════╧════╧════╧════╧════╧════╧════╛
Обратите внимание на числа из последней
таблицы, помеченные звездочкой. В PT3 они
были равны #3FD и #10A. В вышеприведенной
таблице (и в player'е) я заменил их на
значения из настоящего ST (видимо, при ко-
пировании таблички из ST в PT3, автором
были допущены неточности).
Теперь о player'е. После доработки его
длина увеличилась на 24 байта. Столь нез-
начительного увеличения объема удалось
достигнуть учтя некоторые особенности час-
тотной таблицы. Дело в том,что частоты нот
двух соседних октав относятся как 1:2. Т.
е., например, частота ноты "До" 1-й окта-
вы в 2 раза меньше частоты той же ноты
2-й октавы. Поскольку в AY'шке для задания
частоты звука используется нечто вроде пе-
риода звуковых колебаний (точнее - коэффи-
циент деления частоты), а период и частота
звука обратно пропорциональны друг другу,
то отношение будет 2:1.
Таким образом, зная коэффициенты для
нот одной октавы, можно получить все ос-
тальные. Т.к. все коэффициенты - целые
числа, то для минимизации ошибки вычисле-
ний лучше начать с самой низкой октавы, а
"частоты" нот других октав получить деле-
нием пополам.
Все это нетрудно увидеть из вышеприве-
денных таблиц: числа 2-й строки в 2 раза
маньше чисел первой и т.д.
Новый player рекомендуется для журналов
и различных проигрывателей музыки.
Он снимает проблемы связанные с таблич-
кой нот, но остаются еще проблемы при им-
порте музыки из других редакторов: в ST и
STP есть параметр HEIGHT (в PT3 его нет);
в ST орнамент зациклен также как и сэмпл;
в STP и PT3 разные способы понижения гром-
кости сэмпла (в STP - вычитанием из ампли-
туды некоторого числа со сбросом ее в ноль
если был перенос, в PT3 - по таблице) etc.
Листиг player'а весьма объемен, посему
размещать его здесь не имеет смысла. Весь
исходник (в XAS'е) помещен в ПРИЛОЖЕНИИ.
В нем использованы некоторые специфические
для XAS'а выражения:
label&h - выделение старшего байта.
DEFS 123,#0000 - зарезервировать 123 нуля.
Обратите также внимание на то, что XAS
не соблюдает приоритет операций - выраже-
ния вычисляются слева-направо.
Здесь я привожу небольшой кусок листин-
га, отвечающий за выбор таблиц и их "дек-
рюнчинг":
;-----------------------------------------
;На входе в A: 0 или 1.
;
;Выбор одной из двух таблиц:
LD HL,FREQ0+24
LD DE,FREQ1+24
PUSH HL
OLD_F CP 0
LD (OLD_F+1),A
JR Z,NO_SWAP
;Обмениваем 12 нот (24 байта) так, чтобы
;с метки FREQ0 оказались нужные:
SWAP DEC E
DEC L
LD C,(HL)
LD A,(DE)
LD (HL),A
LD A,C
LD (DE),A
JR NZ,SWAP
NO_SWAP POP DE
;Далее из самой низкой октавы получаем
;семь остальных:
LD L,B
LD B,12*7
FRQ_GEN LD A,(HL)
INC L
LD C,(HL)
INC L
SRL C
RRA
LD (DE),A
INC E
LD A,C
LD (DE),A
INC E
DJNZ FRQ_GEN
;Таблица "частот". Находится с адреса
;ORG+#200. Длина - 192 байта.
;В player'е до первой инициализации
;из этой таблицы присутствуют только
;24 начальных байта (12 нот PT3):
FREQ0 DW #C21,#B73,#ACE,#A33
DW #9A0,#916,#893,#818
DW #7A4,#736,#6CE,#66D
;Остальные 192-24=168 байт забиты нулями
;(только до первой инициализации).
;Первые 12 нот ST, находятся в конце
;player'а:
FREQ1 DW #EF8,#E10,#D60,#C80
DW #BD8,#B28,#A88,#9F0
DW #960,#8E0,#858,#7E0
;-----------------------------------------
Помимо этого я немного (байт на 8) сок-
ратил инициализатор и поставил EI на вы-
ходе.
При вызове [ORG+0] прерывания запреща-
ются, затем идет инициализация. На выходе
прерывания разрешаются (поставил EI).
При вызове [ORG+5] прерывания не тро-
гаются. ВНИМАНИЕ: при проигрывании юзает-
ся стек и регистр IY. Приход в это время
прерывания крайне нежелателен! На выходе
в LY заносится #3А (HY player'ом не изме-
няется), HL' грохается и не восстанавлива-
ется !
При вызове [ORG+8] не портится ни ре-
гистр IY, ни HL'. Прерывания не меняются.
К сожалению, пришлось грохнуть все над-
писи в player'е. Осталось только 3 байта,
в которые я запихал "CBX". Если это кого-
либо не устраивает - замените их на "PT3"
или "GDC"...
- - -- -----====***< 6 марта 1999 г.