Важная информация

User Tag List

Показано с 1 по 6 из 6

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

  1. #1
    Master Аватар для siril
    Регистрация
    01.02.2005
    Адрес
    perm/ru
    Сообщений
    520
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

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

    Для того, чтобы перевести модуль из одной частотной таблицы в другую недостаточно просто сменить байт, отвечающий за её номер - так сменятся только частоты нот, которые берутся из таблицы. Период огибающей, который задаётся не нотой (хотя мог бы!), а прямой записью периода останется прежним, и зазвучит фальшиво. Кроме того, поломает басы, извлекаемые Тон+Огибающая (где период тона и огибающей в определённом соотношении).

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

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master Аватар для siril
    Регистрация
    01.02.2005
    Адрес
    perm/ru
    Сообщений
    520
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В качестве примера - конвертор из таблички 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
    oisee.

  4. #3
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Из описания формата пт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).

  5. #4
    Master Аватар для siril
    Регистрация
    01.02.2005
    Адрес
    perm/ru
    Сообщений
    520
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    короче, все частоты всех нот в современном темперированном строе рассчитываются от камертона «Ля» первой октавы (A-4 в спектрумовской нотации), частотой 440 Герц по формуле: .
    таким образом, если мы контролируем максимальное приближение к "идеальному" равномерно темперированному звукоряду, а также считаем, что таблички 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:18.
    oisee.

  6. #5
    Master Аватар для siril
    Регистрация
    01.02.2005
    Адрес
    perm/ru
    Сообщений
    520
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  7. #6
    Master Аватар для siril
    Регистрация
    01.02.2005
    Адрес
    perm/ru
    Сообщений
    520
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Конвертация музыки Savage
    от Barmaley_m в разделе Программирование
    Ответов: 6
    Последнее: 19.11.2008, 19:35
  2. Ответов: 3
    Последнее: 11.03.2008, 22:00
  3. конвертация и эмуляция
    от jimon в разделе Эмуляторы
    Ответов: 12
    Последнее: 25.02.2006, 21:19
  4. Формат модулей Digital Studio?
    от Shiru в разделе Музыка
    Ответов: 3
    Последнее: 20.01.2005, 00:02

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •