Из газеты Echo #2, Брест, 12.1996 (C) VfNG/NEW Многим в процессе написаний эффектов не хватало где-нибудь пары тысяч тактов. Обычно в таких случаях первым делом пытаются оптимизировать проигрыватель музыки. Думаю, что не лишним будет опубликовать форматы компилированых модулей самых известных музыкальных редакторов. Это немного облегчит вам жизнь и сделает более простым ковыряние в старом PLAYER'е. Начнем, пожалуй, с PRO TRACKER 2.101 by GDC. В следующий раз, может быть, опубликуем формат музыки STP PRO. Tерминология: QUARK: те элементы, из которых состоят SAMPLES, ORNAMENTS. QUANT: число QUARKS в каждом элементе PATTERN. Фактически-ско- рость проигрывания; PATTERN: куплет; POSITION LIST: порядок проигрывания PATTERNS; POSITION: позиция в POSITION LIST; Формат компилированого модуля: +0 DELAY-число QUARKS, за которое проигрывается 1 QUANT; +1 MUS_LEN-число позиций в мелодии; +2 LOOP TO POSITION-номер позиции, в которую будет производиться зацикливание по проигрывании всей мелодии (0-#FF); +3,64 SAMP_A-смещения от +0 до каждого из 32-х SAMPLE. SAMPLE с но- мером 0-не описан. Его номер используется для заглушения канала. +67,32 ORN_A-аналогично SAMP_A для 16 орнаментов. Орнамент номер 0-отсутствие орнамента. +99,2 PAT_OFFSET-смещение от +0 до первого описателя PATTERN'ов PAT. +101,30 NAME-имя музыки в ASCII. +131 POSITION LIST-список позиций-номера PATTERN для каждой пози- ции. Окончание таблицы-#FF. +? PAT-описатели PATTERN'ов. Kaждый PATTERN состоит из 3-х кана- лов. В этой таблице-смещения от +0 до описателей каналов каждого PATTERN. Таким образом по 6 байт/PATTERN. Окончание табли- цы-#0000. +? CHAN-описатели каналов. Канал представлен в виде списка бай- тов, которые анализируются следующим образом: LOOP LD A,(DE) INC DE ADD A,#20 JR C,L1 ADD A,#60 JR C,L2 ADD A,#10 JR C,L3 ADD A,#10 JR C,L4 ADD A,#40 JR C,L5 ADD A,#10 JR C,L6 INC A JR Z,L7 INC A JR Z,L8 INC A JR Z,L9 INC A JR NZ,L10 L11 Отключение команд и переход на LOOP. L10 Извлечь следующий байт-в нем значение прибавления к частоте NOISE. Затем на LOOP. L9 Извлечь три байта. В 1-м значение PORT, т.е. то число, кото- рое будет прибавляться к текущей частоте ноты. Следует учесть, что значение частоты самой высокой ноты самое маленькое, а самой низкой-самое большое, значит: положит. 128-255, отриц. 0-127. Во 2-м и 3-м байтах-разница в значениях частоты новой (той на кото- рой вызван PORT) и предидущей ноты. Существует ошибка компилято- ра, который неверно определяет это значение, если новая нота стоит в начале PATTERN. Команду следует выключить, когда сумма прибавлений из +1 превысит значение +2,+3. Переход на LOOP. L8 Извлечь 1 байт. В нем значение GLISSADE. Знаки-аналогично PORT. Затем переход на LOOP. L7 Извлечь 1 байт. В нем значение для DELAY (скорость проигрыва- ния). Затем переход на LOOP. L6 В А-громкость (0-F). Это значение умножается на 16 и прибав- ляется к началу таблицы TABL1. К полученому значению следует от- носиться как к началу 16-байтовой таблицы, где содержаться зна- чения для регистров амплитуды сопроцессора для каждого значения извлекаемого из SAMPLE. Затем переход на LOOP. L5 В А-сколько QUANTS не надо проводить анализ канала, т.е. расстояние в QUANTS между очередными изменениями параметров ка- нала. Затем на LOOP. L4 В А-номер орнамента. Если равен 0, то отсутствие орнамента. Переход на LOOP. L3 Если А=0 то выход. Если 0<А" DB #01,",",#01 DB #1C,#01,#0A DB #01,#FC,#00 DB #EF,#00,#E1 DB #00,#D6,#00 DB #C8,#00,#BD DB #00,#B2,#00 DB #A8,#00,#9F DB #00,#96,#00 DB #8E,#00,#85 DB #00,"~",#00 DB "w",#00,"p" DB #00,"k",#00 DB "d",#00,"^" DB #00,"Y",#00 DB "T",#00,"O" DB #00,"K",#00 DB "G",#00,"B" DB #00,"?",#00 DB ";",#00,"8" DB #00,"5",#00 DB "2",#00,"/" DB #00,",",#00 DB "*",#00,"'" DB #00,"%",#00 DB "#",#00,"!" DB #00,#1F,#00 DB #1D,#00,#1C DB #00,#1A,#00 DB #19,#00,#17 DB #00,#16,#00 DB #15,#00,#13 DB #00,#12,#00 DB #11,#00,#10 DB #00,#0F,#00 ;--------------------------------------------------------------- TABL1 ;ИНИЦИАЛИЗИРУЕТСЯ ПРОЦЕДУРОЙ ;INITVOL VOLTAB DS #F0 TABL1_F DS #10 ;--------------------------------------------------------------- LF748 DB #00 ;COUNTER A LF749 DB #00 ;COUNTER B LF74A DB #00 ;COUNTER C ;--------------------------------------------------------------- LF74B DB #00 ;TONE A LF74C DB #00 LF74D DB #00,#00 ;TONE B LF74F DB #00,#00 ;TONE C LF751 DB #00 ;NOISE LF752 DB #00 ;MASKS LF753 DB #00 ;AMPLITUDE A LF754 DB #00 ;AMPLITUDE B LF755 DB #00 ;AMPLITUDE C LF756 DB #00 ;ENVELOPE TYPE LF757 DB #00 ;ENVELOPE PERIOD LF758 DB #00 ; ;--------------------------------------------------------------- SMP_A DS #40 ORN_A DS #20 ;---------------------------------------------------------------