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 г.





Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
BBS - список станций BBS ZXNet.
Мнение - мнение о дисковых версия игр.
ZX News - Состоялся Fun Top'98. Вышла полная верси игры: 12 Тайных книг.

В этот день...   23 октября