Для того, чтобы перевести модуль из одной частотной таблицы в другую недостаточно просто сменить байт, отвечающий за её номер - так сменятся только частоты нот, которые берутся из таблицы. Период огибающей, который задаётся не нотой (хотя мог бы!), а прямой записью периода останется прежним, и зазвучит фальшиво. Кроме того, поломает басы, извлекаемые Тон+Огибающая (где период тона и огибающей в определённом соотношении).
Корректный способ - это пропорциональный перевод периода огибающей для модулей в частотных таблицах SoundTracker и ASM =)
из ASM в ST:
STenv = (ASMenv * (1773400/1750000)) * 2^(1/6) )
из ST в ASM
ASMenv = (STenv* 1750000 / 1773400 / 2^(1/6) )
где
1750000 - это частота сопроцессора, для которой рассчитана табличка ASM.
1773400 - это частота сопроцессора, для которой рассчитана табличка SoundTracker.
2^(1/6), это ни что иное как 2^(1/12)*2^(1/12) - то есть корень двенадцатой степени из двух, во второй степени (то есть как раз та самая разница в два полутона между этими двумя табличками).
(эта коррекция в два полутона нужна оттого, что табличка SoundTracker рассчитана со смещением в 2 полутона: то, что в ней выглядит как C4 на самом деле звучит как Bb3 (A#3).)
ну и, естественно, 1750000 / 1773400 / 2^(1/6) это ни что иное как 1/(1773400/1750000)) * 2^(1/6)) =)
то есть:
STenv = ASMenv * 1,13747096941248 или
ASMenv = STenv * 0,879143316085256.
#4E F(asm) фа = 78dec
78 * 1,13747096941248 = ~89dec = #59hex = F(st) фа
В нижеследующей таблице присутствуют следующие данные:
Нота -> (период огибающей Hex) период огибающей Dec из таблицы ST, затем период огибающей, рассчитанный по формуле из таблички ASM в ST и отклонение.
Код:
C-1 -> (F0) 240 ST = 238 (ASM to ST) отклонение = 0.009
C#1 -> (E1) 225 ST = 224 (ASM to ST) отклонение = 0.004
D-1 -> (D6) 214 ST = 212 (ASM to ST) отклонение = 0.011
D#1 -> (C8) 200 ST = 200 (ASM to ST) отклонение = -0.001
E-1 -> (BE) 190 ST = 189 (ASM to ST) отклонение = 0.006
F-1 -> (B2) 178 ST = 179 (ASM to ST) отклонение = -0.003
F#1 -> (A8) 168 ST = 168 (ASM to ST) отклонение = -0.002
G-1 -> (9F) 159 ST = 159 (ASM to ST) отклонение = -0.002
G#1 -> (96) 150 ST = 150 (ASM to ST) отклонение = -0.001
A-1 -> (8E) 142 ST = 141 (ASM to ST) отклонение = 0.007
A#1 -> (86) 134 ST = 133 (ASM to ST) отклонение = 0.007
B-1 -> (7E) 126 ST = 126 (ASM to ST) отклонение = -0.002
На самом большом значащем периоде огибающей - отклонения очень маленькие, на более коротких периодах, которые обычно и используются для извлечения нот, погрешность будет ещё меньше.
(Но, разумеется, самым корректным и простым способом перевода периода огибающей - будет построение таблицы соответствия из 256 значений для одной частотной таблицы и, соответствующих им 256 значениям другой частотной таблицы.
Период огибающей, для генератора огибающей, соответствующий ноте - это ни что иное, как период ноты для генератора тона, поделёный на 16, таким образом в частотной таблице нот уже есть 96 значений, соответствующим нотам. Недостающие 160 промежуточных значений можно получить интерполяцией.
Возьмём два соседних значения, для
Код:
C-1 D1hex 209 dec (ASM) - 240 (ST)
C#1 C5hex 197 dec (ASM) - 225 (ST)
Таким образом, за 12 шагов (209-197) нам надо попасть из значения 240 в 255.
Код:
ASM ST
C-1 209 209 240
C#1 197 208 239
207 237
206 236
205 235
204 234
203 232
202 231
201 230
200 229
199 227
198 226
197 225
то есть: каждое последующее значение у нас будет отличаться пот предыдущего на (225/240)^(1/кол-во шагов).)
Ну да ладно, это всё понятно, рассчитать не сложно.
Внимание, вопрос!
Для каких значений частоты сопроцессора расчитаны таблички Pro tracker (0), и Real Sound (3).
При каких значениях частоты сопроцессора они звучат нормально? (максимально не-фальшиво). Имеют ли они смещения в полутонах (как SoundTracker)?