я окончательно разуверился в святости ValleyBell'a
итак - Comix Zone. 003 трек - там есть момент цик цик цик в самом начале. звук не правильный. точно так-же играет в эмуляторе Gens, но это не верно. верно как во Fusion. дело в том, что GEMS должен прочитать включен ли Ch3mode в инструменте - специальный режим для 3 канала, когда частота ноты выставляется не только в двух регистрах, но и еще в дополнительных. как пример звук соник танка в Дюне.
так вот - в случае если у инструмента включен этот флаг Ch3mode - GEMS должна посылать эту дорожку в 3 канал. но там по всей видимости ошибка и шлет в первый свободный, как обычно GEMS делает динамическое свое перераспределение. но там должно быть четкое правило слать именно в 3 в этом случае. потому что никакой другой канал не умеет играть этот специальный режим.
начал вырезать и чот фигня какая-то... когда вся песня играет - нет этого цик цик цик. когда только 1 дорожка - цикает... скатина. по идее не должна будучи одна. ведь 3 канал в этом случае свободен.
Добавлено позже:однако этот одиночный цик цик цик играет в 3 канале как и положено... но почему его не слышно когда играет весь трек? тупо не хватает места и поэтому он не проигрывается?
так. дело видимо в громкости. она в треке должна быть 15 - довольно тихая. однако при проигрывании в библиотеке по видимому не слушается этой самой громкости. громкость Total Level. управляется через регистры. значение из инструмента в 4 операторах + значение volume из мелодии.
Добавлено позже:так. по всей видимости точно громкость. ром собирается изначально правильно. моя собиралка могла содержать ошибку, но нет. байт в байт одинаково собирает. значит дело точно в библиотеке.
громкость: три байта. через макрос.
$72 - флаг что это макрос.
$05 - volume
$xx - значение
так-же есть еще mastervolume - типа глобальная громкость для всех дорожек. не распространяется на PSG и на сэмплы. но FM можно регулировать.
$72 - флаг что это макрос
$04 - mastervolume
$xx - значение
в итоге громкость, в зависимости от алгоритма (параметр в инструменте) должна производить для от 1 до 4 операторов - подобное сложение:
громкость TL из оператора инструмента + volume + mastervolume. где-то в этом коде ошибка. и этот цик цик цик играет слишком громко.
Добавлено позже:насколько я понимаю это глобальная переменная громкости:
static UINT8 MASTERATN; // [15CF] master attenuation is 7 frac bits (0 = full volume)
то есть mastervolume
case 114: // 114 = seekrit codes [Is this supposed to be "secret codes"?]
{
UINT8 CurCode; // Register D
UINT8 CurVal; // Register E
CurCode = GETSBYTE(ChnCCB, CHBUFPTR); // get code
CurVal = GETSBYTE(ChnCCB, CHBUFPTR); // get value
switch(CurCode) // dispatch on code
{
case 4:
//seqatten:
MASTERATN = CurVal;
return 0x01; // [jp seqdelay]
case 5:
//seqchatten:
ChnCCB[CCBATN] = CurVal;
return 0x01; // [jp seqdelay]
чтение из кода мелодии обычной volume - для конкретного канала и общая mastervolume
внутри функции gems_loop тоже есть. это я не понимаю что и откуда берется. но предположим все верно. уж тем более что в том треке все равно нет команды для всех дорожек mastervolume. только volume для отдельной дорожки.
case 32:
//cmdmasteratn:
MASTERATN = GETCBYTE();
break;
функция NOTEON
noteon.atten = MASTERATN + ChnCCB[CCBATN]; // sum channel and master attenuations, limit to 127
if (noteon.atten >= 0x80)
noteon.atten = 127;
тут по видимому сложение мастерволум и обычной волум в дорожке, и проерка на превышение лимита значения громкости. 127 самое большое что может быть (то есть тихо, вовсе не будет слышно)
и дальше я не понимаю что происходит в функции WRITEFM
NoteAtt = ((CurData << 1) * noteon.atten) >> 8;
понятно что здесь видимо происходит установка инструмента. но где определение параметра Algoritm инструмента? согласно алгоритму должно происходить определение в каких именно операторах следует производить изменение параметра Total Level - TL.
то есть должно быть что-то типа
Select Algorithm
Case 0 to 3
; изменяется только 4 оператор TL
Case 4
; изменяется 2 и 4 (но видимо из-за порядка операторов 1, 3, 2, 4 - видимо 3 и 4)
Case 5, 6
; изменяется 2, 3, 4
Case 7
; изменяются все 4 оператора
Endselect
Добавлено позже:алгоритм в файле инструмента (39 байт. начиная с единицы, не с нуля. то есть первый байт - это 1, а не 0):
Case 1 ; |??????tt| - type
Case 2 ; |????ovvv| - LFO on, LFO value
Case 3 ; |mm??????| - Channel 3 mode
Case 4 ; |??fffaaa| - Feedback, Algorithm
Case 5 ; |lraa?fff| - Left/Right, AMS, FMS
; дальше идут 4 оператора
; оператор 1
Case 6 ; |?dddmmmm| - Detune, Multiply
Case 7 ; |?ttttttt| - TLevel
Case 8 ; |rr?aaaaa| - Rate Scale, Attack
Case 9 ; |a??ddddd| - AM, Decay
Case 10 ; |???sssss| - Sustain
Case 11 ; |ssssrrrr| - Sustain Level, Release
; тут я не уверен. наверное оператор 3
Case 12 ; |?dddmmmm| - Detune, Multiply
Case 13 ; |?ttttttt| - TLevel
Case 14 ; |rr?aaaaa| - Rate Scale, Attack
Case 15 ; |a??ddddd| - AM, Decay
Case 16 ; |???sssss| - Sustain
Case 17 ; |ssssrrrr| - Sustain Level, Release
; если предыдущий 3, то этот 2. но может порядок и не перепутан. и этот 3 на самом деле.
Case 18 ; |?dddmmmm| - Detune, Multiply
Case 19 ; |?ttttttt| - TLevel
Case 20 ; |rr?aaaaa| - Rate Scale, Attack
Case 21 ; |a??ddddd| - AM, Decay
Case 22 ; |???sssss| - Sustain
Case 23 ; |ssssrrrr| - Sustain Level, Release
; оператор 4
Case 24 ; |?dddmmmm| - Detune, Multiply
Case 25 ; |?ttttttt| - TLevel
Case 26 ; |rr?aaaaa| - Rate Scale, Attack
Case 27 ; |a??ddddd| - AM, Decay
Case 28 ; |???sssss| - Sustain
Case 29 ; |ssssrrrr| - Sustain Level, Release
; там дальше должны идти
; 4 двухбайтовых параметры дополнительных частотв для регистров в случае работы Ch3mode.
Case 38 ; параметр KeyOn - стартует звучание ноты. содержит в себе флаги операторов, какие будут включены
вот согласно алгоритму должны изменятся соответствующие параметры TLevel.