PDA

Просмотр полной версии : Конвертация музыкальных модулей из одной частотной таблицы в другую.



siril
16.06.2009, 09:56
Для того, чтобы перевести модуль из одной частотной таблицы в другую недостаточно просто сменить байт, отвечающий за её номер - так сменятся только частоты нот, которые берутся из таблицы. Период огибающей, который задаётся не нотой (хотя мог бы! (http://zx.pk.ru/showthread.php?p=155250#post155250)), а прямой записью периода останется прежним, и зазвучит фальшиво. Кроме того, поломает басы, извлекаемые Тон+Огибающая (где период тона и огибающей в определённом соотношении).

Корректный способ - это пропорциональный перевод периода огибающей для модулей в частотных таблицах 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)?

siril
16.06.2009, 10:03
В качестве примера - конвертор из таблички ST в ASM и обратно, для текстовых файлов Vortex II (на руби).



ff = File.new("filename.txt","r")

lines = ff.readlines("\n")
freqtable =nil

lines.each { |z|
if z =~ /NoteTable=(\d+)/ then
freqtable = $1.to_i
abort "Incorrect FreqTable" if freqtable != 1 and freqtable != 2
end
}

lines.each { |z|
if z =~ /(NoteTable=)(\d+)/ then
ft = $2.to_i
z = $1 + (ft == "1"? "2": "1")
end

if z[0,5] =~ /^\.*([A-G|0-9]+)\|/ then
originalEnvelope = $1.to_i(16)
case freqtable
when 1 #st to asm
resultedEnvelope = (originalEnvelope.to_f * 0.879143316085256).to_i.to_s(16).upcase
when 2 #asm to st
resultedEnvelope = (originalEnvelope.to_f * 1.13747096941248).to_i.to_s(16).upcase
end
# print "#{$1} hex = #{$1.to_i(16)} = #{resultedEnvelope} \n"
prefix = ""
(4-resultedEnvelope.length).times {prefix = prefix + "."}
resultedEnvelope = prefix + resultedEnvelope
#puts resultedEnvelope
z[0,4] = resultedEnvelope
puts z
else
puts z
end
}
# end

ff.close

Vitamin
16.06.2009, 11:15
Из описания формата пт3:


Таблица ASM or PSC не имеет отношения к соответствующим редакторам. Модули из этих редакторов следует импортировать с таблицей Sound Tracker. Таблица ASM or PSC рассчитана так,чтобы при тактовой частоте AY 1.7744 MHz ноты в редакторе
совпадали с одноименными нотами фортепиано. (Таблица Real Sound - аналогично, но для 1.75 MHz.)

Вкратце, чтоб определить тактовую частоту сопроцессора по первой ноте таблички (считая, что она есть C-1, равная 32.7Гц):

F = 32.7 * 16 * period = 523.2 * period

На деле же, это все несколько расходится:) Например, таблица ASM в этом случае идеально подходит для 1.75МГц (делитель 3344).

siril
16.06.2009, 21:04
короче, все частоты всех нот в современном темперированном строе рассчитываются от камертона «Ля» первой октавы (A-4 в спектрумовской нотации), частотой 440 Герц по формуле: http://upload.wikimedia.org/math/0/c/f/0cf7b559f526a01f53c1b7aa5851270a.png.
таким образом, если мы контролируем максимальное приближение к "идеальному" равномерно темперированному звукоряду, а также считаем, что таблички ProTracker и RealSound никуда не смещены, то:

1) табличка 0 (ProTracker) идеально соответствует равномерно темперированному звукоряду при частоте музыкального сопроцессора 1823360 Hz!

На этой частоте:
A-1 точно соответсвует 55 Hz = 1823360 / (16 * 2072)
A-2 точно соответсвует 110 Hz = 1823360 / (16 * 1036)
A-3 точно соответсвует 220 Hz = 1823360 / (16 * 518)
A-4 точно соответсвует 440 Hz = 1823360 / (16 * 259)

небольшие расхождения начинаются лишь с A-5:
883,410852713178 = 1823360 / (16 * 129) что очень близко к 880 =)

2) RealSound (3) также точно фиксирует ноту «Ля» при частоте сопроцессора 1823360Hz!

тайна этих частотных таблиц - разгадана =)

до кучи, точная фиксация ноты «Ля» (от которой все остальные строятся) происходит для табличек:

SoundTracker (1) - при частоте 1774080 (что довольно близко к 1774400 Hz)
ASM or PSC (2) - при частоте 1749440 (что довольно близко к 1750000 Hz).

P.S.Таблички брал из файла ToneTables.csv, который прилагался к VortexTracker'у.

Итак, повторим:


ProTracker (0) - при частоте 1823360 (что довольно непонятно откуда взялось).
SoundTracker (1) - при частоте 1774080 (что довольно близко к 1774400 Hz)
ASM or PSC (2) - при частоте 1749440 (что довольно близко к 1750000 Hz).
RealSound (3) - при частоте 1823360 (что довольно непонятно откуда взялось).

siril
16.06.2009, 21:12
Желающие могут проверить выкладки и расчёты в .xls-файле тут -> http://slil.ru/27764644

siril
17.06.2009, 13:32
а, да, если выравнивать частотную табличку SoundTracker, предполагая, что она не смещена на два полутона вниз - то она фиксирует ноту "ЛЯ", при частоте 1999360 Hz