Deja Vu
#08
31 мая 1999 |
|
CODING - Универсальный Player - Pro Tracker v3.31.
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 г.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября