Навигация по сайту
Follow Us
Funding Request

If you like what we are doing, please consider supporting us.

Support Via Patreon

Visit Our Patreon Profile

Visit our Patreon profile and become a patron.

Any amounts raised will directly support the development of our current and upcoming projects.

Thank you very much!

Принимаем пожертвования

Яндекс: 410012588249319
WMR: R371578751646 (рублики)
WMZ: Z803750001922 (доллары)

Случайная игра

Вступай!!!
Облако тегов
TurboSound FM
Руководство программиста

v1.11


Содержание

1. Описание

2. Конвертирование музыки с Sega Genesis (Mega Drive)
2.1. Формат дампа музыки с эмуляторов Sega Genesis (*.gym)
2.2. Формат дампа gym2tfm (*.tfm) и TFM Music Maker (*.tfd)
2.3. Выходной формат конвертора RE_TFD v0.2 (*.tfm)

3. Создание TFM музыки
3.1. Формат компилированного модуля TFM Compiler v1.0 (*.tfc)

4. Описание микросхемы YM2203
4.1. Принцип синтеза
4.2. Операторы каналов
4.3. Амплитудная огибающая оператора
4.4. Регистры YM2203
4.5. Описание регистров
4.6. Тестовая программа

5. Тонкости программирования TFM

5.1. Работа с регистрами
5.2. Особенности FM синтеза
5.3. Особенность инициализации TFM

1. Описание

TurboSound FM (в дальнейшем TFM) - звуковое устройство, подключаемое в панельку вместо AY-3-8910 (YM2149). Имеет 6 обычных каналов TurboSound (в дальнейшем - PSG каналы, они же SSG*) и 6 каналов более сложно синтезируемого звука (FM каналы). Шесть PSG каналов независимы от шести FM каналов, равно как и наоборот, таким образом TFM имеет одновременно 12 каналов*.
TFM построен на двух микросхемах (они же "чипы") YM2203 (серия OPN), совместимых с AY-3-8910. Каждая из этих микросхем имеет помимо 16 стандартных регистров AY-3-8910 (управление PSG-каналами и обменом по параллельным портам) ещё несколько десятков регистров, управляющих FM синтезом и таймерами.

Для отладки программ для TFM можно использовать эмулятор UnrealSpeccy v0.36.

* Прим. Shiru: PSG (Programmable Sound Generator) - термин, применяемый в официальной документации фирмы General Instruments для обозначения функционального назначения AY-3-8910 (и прочих микросхем из этой серии). SSG (Software-controlled Sound Generator) - термин, применяемый Yamaha в тех же целях относительно YM2149F. Для Texas Instruments SN76489 используется термин DCSG (Digital Complex Sound Generator).
* Если у каждой микросхемы YM2203 рассматривать 3-й FM канал c 7-м алгоритмом как четыре независимых канала, выдающих синусоидальные сигналы с заданными параметрами, то получается 18 каналов.


2. Конвертирование музыки с Sega Genesis (Mega Drive)

На приставке Sega Genesis имеется связка из двух звуковых чипов (SN76489 и YM2612), обладающая приблизительно теми же возможностями, что и TFM. Основные принципиальные отличия от TFM таковы:
* PSG каналов (SN76489) не 6, а 4 (считая шум за отдельный канал - он имеет отдельную громкость и может использоваться как грязный тон), причём у PSG нет огибающей;
* В FM каналах есть LFO (Low Frequency Oscillator) для амплидутного и частотного вибрато;
* В FM каналах есть примитивное панорамирование (левый/правый/центр), но далеко не на всех экземплярах приставки есть стереовыход.
Возможно почти полноценное конвертирование музыки с Sega Genesis на TFM. Основная проблема в том, что на Sega Genesis часто используются цифровые ударные инструменты (вместо одного из FM каналов).
Для конвертирования музыки с Sega Genesis имеется утилита gym2tfm v0.1 (by Dexus & Shiru). На входе ей требуется несжатый файл .gym, выгружаемый эмуляторами Megasis и Gens (в Internet можно найти готовые .gym-файлы). Некоторые .gym-файлы эта утилита не обрабатывает, в том числе сжатые (их отличительная особенность - размер всего в несколько килобайт). Утилита автоматически убирает паузу любой длины в начале дампа.

Результат конверсии можно:
* Играть плейером tfdplay.H (самый простой плейер, по которому вы можете понять принципы программирования TFM);
* Сконвертировать в более плотный формат утилитой RE_TFD v0.2 by Alone Coder (её плейер называется retfd02+.H и позволяет играть музыку длиной во много страниц ОЗУ).
В плейерах имеется константа pseudo60hz. При конвертировании музыки с приставки она должна быть равна 1, чтобы играть музыку на ZX с той же скоростью, с которой она играла в игре (по NTSC стандарту).
Плейеры являются продуктом коллективного творчества - изначально их писали Dexus и Shiru, после чего дорабатывали Lord Vader и (в основном) Alone Coder. Вы можете свободно изменять код, если захотите вставить сконвертированную музыку в свою программу.
Используя чужую музыку в своей программе, указывайте, откуда эта музыка взята, и (если знаете) её автора.

2.1. Формат дампа музыки с эмуляторов Sega Genesis (*.gym)

Если имеется заголовок "GYMX", то следует пропустить 256 начальных байт с текстом.
* #00 - ждать следующий кадр (1/60 секунды);
* #01 R n - записать n в регистр R 0-й половинки YM2612 (каналы 1,2,3);
* #02 R n - записать n в регистр R 1-й половинки YM2612 (каналы 4,5,6);
У YM2612 регистр key on/off - общий для обеих половинок. Поэтому, если прочитано событие key on или key off с установленным 3-им битом, его надо перенаправлять на второй чип TFM.
Порты >=#b4 и <#30 (кроме #28) транслировать на TFM не нужно.
Частоты YM2612 при конверсии на TFM требуется корректировать, т.к. YM2612 на Sega Genesis тактируется частотой 7.67 MHz (реально звучит как 3.84 MHz).
* #03 val - записать значение val в PSG. Обрабатывается следующим образом:
if(val&128)
    {
        chan=(val>>5)&3;
        div=(PSG.chanDiv[chan]&0xfff0)|(val&15);
        PSG.latchedChan=chan;
        PSG.latchedType=val&16;
    }
    else
    {
        chan=PSG.latchedChan;
        div=(PSG.chanDiv[chan]&15)|((val&63)<<4);
    }
    
    if(PSG.latchedType)
    {
        PSG.chanVol[chan]=(PSG.chanVol[chan]&16)|(val&15);
    }
    else
    {
        PSG.chanDiv[chan]=div;
        if(chan==3)
    {
            if(((div>>2)&1)) PSG.noiseTBits=9; else PSG.noiseTBits=1;
            PSG.noiseLFSR=0x8000;
        }
    }


2.2. Формат дампа gym2tfm (*.tfm) и TFM Music Maker (*.tfd)

Файл представляет собой поток парных байт, определяющих номер регистра и значение для него, а также набор служебных маркеров длиной 1 или 2 байта.
Заголовок *.tfd из TFM Music Maker, начиная с v1.0:

СмещениеРазмерНазначение
+04Сигнатура "TFMD"
+4NНазвание трека, до 64 байт (включая код 0)
+4+NMИмя автора, до 64 байт (включая код 0)
+4+MXКомментарий, до 384 байт (включая код 0)


Все текстовые поля хранятся в ASCII-кодировке, и заканчиваются кодом 0. Если поле не заполнено, сохраняется только код 0. Комментарий может быть многострочным, переносы строк выполняются по #0D #0A.
Маркеры:
* #FF - начало кадра (в начале проигрывания и кадра активен первый чип);
* #FE n - ждать n+3 кадра - только в дампах TFM Music Maker;
* #FD - выбор второго чипа;
* #FC - выбор первого чипа (не применяется);
* #FB - конец трека, либо переход на цикл (ставится в конце последнего кадра музыки);
* #FA - маркер цикла (идёт сразу перед #FF или #FE; по маркеру #FB должен происходить переход на это место) - только в дампах TFM Music Maker.
Данные:
* #00..F9 n - номер регистра и значение для этого регистра.

2.3. Выходной формат конвертора RE_TFD v0.2 (*.tfm)

* Убраны лишние #A6, #A5, #A4 (в которых значение равно старому значению соответствующего регистра);
* #0E/F, #10/1, #12/3 - декремент/инкремент старшего байта частоты PSG канала A/B/C;
* #14 - начало цикла;
* #2A/B, #2C/D, #2E/F - key off/offon канала A/B/C;
* #A4 xx yy - #A4=xx, #A0=yy;
* #A5 xx yy - #A5=xx, #A1=yy;
* #A6 xx yy - #A6=xx, #A2=yy;
* #Cx, #Cx+8, #Dx - младший байт частоты канала A/B/C += x-4;
* #Dx+8, #Ex, #Ex+8 - младший байт частоты PSG канала A/B/C += x-4;
* #Fx, #Fx+4, #Fx+8 - громкость PSG канала A/B/C += x-2;
* #FC - конец цикла (ставится в конце последнего кадра музыки);
* #FD - выбор второго чипа;
* #FE n - ждать n+3 кадра;
* #FF - начало кадра (в начале проигрывания и кадра активен первый чип);
* Остальные коды R n - запись в регистр R значения n.

3. Создание TFM музыки

Для написания собственных композиций используйте редактор TFM Music Maker by Shiru. В редакторе на данный момент поддержаны только FM каналы и нет раздельного задания частот всех операторов 3-х каналов YM2203, что не мешает TFM Music Maker'у быть мощным инструментом для создания музыки.
Редактор выгружает музыку либо во внутреннем формате .tfe (который не предназначен для проигрывания на ZX), либо в виде дампа регистров с расширением .tfd.
Этот дамп регистров можно:
* Играть плейером tfdplay.H (константа pseudo60hz должна быть равна 0);
* Сконвертировать в более плотный формат утилитой RE_TFD v0.2 by Alone Coder (её плейер называется retfd02+.H и позволяет играть музыку длиной во много страниц ОЗУ).
* Скомпилировать утилитой TFM Compiler v1.2 by Alone Coder (её плейер называется tfmcom12.H, он является самым быстрым из перечисленных).

Плейер tfmcom12.H считает минимальное, максимальное и среднее время выполнения. Это 1-е, 2-е и 3-е выводимые числа соответственно. Подсчёт тактов настроен на Pentagon в режиме slow. Типичное пиковое время - 13000 тактов, типичное среднее время - 1500 тактов.
Чтобы уменьшить пиковое время, не инициализируйте все инструменты сразу, лучше сделать перед началом сонга отдельный паттерн, где происходят все инициализации по очереди. Таким образом, если в вашем модуле не происходит постоянного переключения инструментов, вы можете получить пиковое время меньше 7000 тактов, что не превышает пикового времени проигрывания шести PSG-каналов плейерами от Pro Tracker 3.x.

3.1. Формат компилированного модуля TFM Compiler v1.1 (*.tfc)

* 6 символов "TFMcom" и 3 символа номера версии (например, "1.0")
* скорость проигрывания в Гц (50 или 60)
* смещение канала A (16-разрядное, младшим байтом вперёд)
* ...
* смещение канала F
* резерв 12 байт под смещения для PSG каналов (заполнено нулями)
* ASCIIZ название трека (макс. 64 байта, но программа пользователя может не выводить больше 32 символов)
* ASCIIZ имя автора (аналогично)
* ASCIIZ комментарий (макс. 384 байта), может содержать коды CR+LF (программа пользователя может ломать строки длиной более 32 символов и не выводить больше 12 строк, включая добавленные при разломе)
* канал A
* ...
* канал F

Данные канала кодируются покадрово, для чего в начале кадра кладётся управляющий байт:
* %11111111,-disp8 = use old frame data
* %111ttttt = skip 32..2 frames
* %110ddddd = slide d+16
* %11010000,frames,-disp16 = repeat block (skips are used as 1 frame)
* %10111111,-disp16 = use old frame data
* %10NNNNNf = keyoff,[freq,]0..30 regs, keyon
* %01111111 = end
* %01111110 = begin
* %01NNNNNf = keyoff,[freq,]0..31 regs
* %00NNNNNf = [freq,]0..30 regs

Где:
* f - признак наличия freq. Если f=1, то из потока читается значение регистра #A4+, затем значе-ние регистра #A0+;
* -disp8 - отрицательное 8-разрядное смещение;
* -disp16 - отрицательное 16-разрядное смещение, хранится старшим байтом вперёд;
* NNNNN - число регистров, которые требуется заполнить (не считая тех, которые заполнены в предыдущем пункте). Формат регистра: номер регистра (1 байт), значение регистра (1 байт).

4. Описание микросхемы YM2203

YM2203 содержит:
* SSG, полностью аналогичный YM2149 (3 канала + шумовой генератор + генератор огибающей), с аналоговым выходом;
* 3 канала FM синтеза, сигнал которых суммируется и выдаётся на внешний ЦАП в 13-разрядном последовательном коде;
* 2 таймера для использования программой. В TFM прерывание по этим таймерам не генерируется.

4.1. Принцип синтеза

Каждому FM каналу задаётся основная частота (тон) и данные для преобразования этой частоты в сложный сигнал. Для этого в канале имеется 4 генератора синусоидального сигнала (называемые "операторами"), которые соединяются в одну из восьми схем ("алгоритмов"), где одни генераторы модулируют другие. Ниже даны схемы соединения операторов.
TurboSound FM Руководство программиста

Соответствие алгоритмов и получаемых звуков:
0. Гитара с “дисторшн”, тарелки, бас;
1. Арфа, меандр;
2. Бас, электрогитара, духовые инструменты, фортепиано, деревянные духовые;
3. Струнные инструменты, акустическая гитара, колокола;
4. Флейта, колокольчики, хорус, бас-бочка, рабочий барабан, том;
5. Духовые инструменты, орган;
6. Ксилофон, том, орган, вибрафон, рабочий барабан, бас-бочка;
7. Большой орган.

4.2. Операторы каналов

Каждый оператор имеет свою амплитудную огибающую, а также свою частоту, зависящую от основной частоты канала. Частота оператора с точностью до так называемой "расстройки" кратна основной частоте, либо равна 1/2 основной частоты*.
Фаза оператора модулируется сигналом на его входе. Сигнал на выходе конкретного оператора описывается формулой:

F = A sin (ωCt + I sin ωMt),


* Канал 3 может использовать полностью независимые частоты для каждого оператора, даже если они не кратны ос-новной (не являются гармониками). Применимо для синтеза ударных инструментов и различных аккордов (однако мажорное и минорное трезвучия можно воспроизвести и на других каналах).

где:
* A - амплитуда (уровень сигнала оператора);
* I - коэффициент модуляции (амплитуда сигнала на входе оператора);
* ωC - угловая частота (несущая) самого оператора;
* ωM - угловая частота (модулирующая) на входе оператора.
В операторе 1 каждого канала имеется обратная связь. Сигнал на выходе первого оператора описывается формулой:

F = A sin (ωCt + βF),

где β - коэффициент обратной связи.
Одни операторы своим выходом модулируют другой оператор, другие (называются “слотами” – на схемах алгоритмов они закрашены серым) идут на конечный выход, где суммируются. Слоты могут быть использованы как независимые каналы, но, как правило, их все включают одновременно, и поэтому раздельное звучание не встречается.

4.3. Амплитудная огибающая оператора

TurboSound FM Руководство программиста

Сигнал начинает развиваться после нажатия на клавишу (событие “key on”). При "key on" уровень сигнала не обнуляется, развитие продолжается от текущего уровня.
Сигнал имеет “атаку” (Attack), сильное основное затухание (Decay), потом медленное вторичное затухание (Sustain, оно же Decay 2). После отпускания клавиши (событие “key off”), сигнал резко затухает (Release) - как у рояля: после отпускания клавиши демпфер опускается на струны и заглушает их.
Амплитудная огибающая сигнала управляется амплитудой TL, уровнем начала удержания SL (он же T1L), углами AR, DR (он же D1R), SR (он же D2R) и RR, а также несколькими дополнительными регистрами. Значения на диаграмме:

TL(Total Level) Общая амплитуда, наивысший уровень сигнала.
AR(Attack Rate) Скорость атаки, задает скорость начального роста уровня сигнала. Если атака достаточно медленная, то событие отпускания клавиши (key off) может произойти прежде, чем уровень сигнала достигнет значения TL.
DR(Decay rate) Скорость затухания после роста.
SL(Sustain level) Уровень (отностельно TL), с которого начинается затухание во время удержания клавиши.
SR(Sustain rate) Скорость затухания во время удержания клавиши. Будет продолжаться до события “key off”.
RR(Release rate) Скорость финального затухания после события “key off”.


Дополнительные регистры, влияющие на огибающую:

RS Масштабирование скорости (Rate Scaling). Коэффицент, указывающий, насколько короче становятся все элементы огибающей на более высоких частотах. Например, на рояле высокие ноты затухают быстрее, чем низкие.
SSG-EGРегистр, указывающий последовательность стадий огибающей (зацикливание, перево-рот и т. д.). Действует по аналогии с огибающей SSG.


4.4. Регистры YM2203

Основные системные регистры:
* Управление предделителем частоты микросхемы;
* Управление таймерами;
* Раздельное включение-выключение ("key on" и "key off") операторов FM каналов. Имеется не-зависимое управление включением-выключением каждого из 12 операторов;
* Режим использования канала 3. Обычно канал FM имеет одну основную частоту и множители для операторов, но в расширенном режиме можно выбрать 4 независимых частоты - одна для каждого оператора.

Регистры управления каналами:
* Значение частоты канала (в обычном режиме) или основной частоты для оператора 4 (в расши-ренном режиме 3-го канала);
* Коэффициент обратной связи для оператора 1;
* Номер алгоритма связи операторов.

Остальные регистры управляют отдельными операторами. Связи операторов определяются вы-бранным алгоритмом, но огибающая всегда задается независимо для каждого оператора. В случае с 3-м FM каналом основная частота также может задаваться независимо для каждого оператора.


ВНИМАНИЕ: перед записью новых данных надо прочитать байт из любого регистра YM2203. Бит 7 указывает на занятость чипа. Надо ждать, пока он не станет равным 0. (См. раздел 5.1.)
TurboSound FM Руководство программиста
Bus - 1=чип занят, 0=чип свободен;
OvA / OvB - 1=таймер закончил счет и переполнился.

ВНИМАНИЕ: в случае записи сдвоенных регистров, например, 10-битного регистра таймера или 14-битного регистра частоты, следует записывать старшую половину первой.

TurboSound FM Руководство программиста

“+” возле номера регистра означает диапазон. Для регистров с 30H+ до 90H+ диапазон имеет 16 значений. Из них используется всего 12 (3 канала по 4 оператора). Формирование номера регистра для диапазона 30H+ видно из таблицы:

30HКанал 1, Оператор 1
31HКанал 2, Оператор 1
32HКанал 3, Оператор 1
33H
34HКанал 1, Оператор 3
35HКанал 2, Оператор 3
36HКанал 3, Оператор 3
37H
38HКанал 1, Оператор 3
39HКанал 2, Оператор 3
3AHКанал 3, Оператор 3
3BH
3CHКанал 1, Оператор 4
3DHКанал 2, Оператор 4
3EHКанал 3, Оператор 4
3FH


TurboSound FM Руководство программиста

Значения полей “Оператор” и “Канал”:

ND3D2ОператорD1D0Канал
0001001
1012012
2103103
311411недопустимо


Справа в виде таблицы дан наглядный пример формирования конечного адреса регистра. Серые поля не используются. Формирование адреса для диапазонов от 40H+ до 90H+ происходит аналогично.

В диапазонах от A0H+ до B0H+ занято только 3 номера регистров из каждых 4. Для A0H+ это номера:

A0HКанал 1, l
A1HКанал 2, l
A2HКанал 3, l
A3H
A4HКанал 1, h
A5HКанал 2, h
A6HКанал 3, h
A7H


Исключение составляют диапазоны A8H+ и ACH+:

A8HКанал 3, оператор 2, l
AAHКанал 3, оператор 1, l
A9HКанал 3, оператор 3, l
ABH
ACHКанал 3, оператор 2, h
ADHКанал 3, оператор 1, h
AEHКанал 3, оператор 3, h
AFH


4.5. Описание регистров
Регистры 24H и 25H – Таймер A

TurboSound FM Руководство программиста

Регистры 24H и 25H объединены в 10-битный таймер A. Порядок записи должен быть таким: сначала записать число в регистр 24H, затем в регистр 25H (или скорее наоборот?). Период срабатывания считается по формуле:

18 * (1024 – Таймер A) микросекунд

Таймер A – все 1 -> 18 µs = 0.018 ms
Таймер A – все 0 -> 18400 µs = 18.4 ms

Регистр 26H – Таймер B

TurboSound FM Руководство программиста

8-битный таймер B. Формула:

288 * (256 – Таймер B) микросекунд

Таймер B = все 1 -> 0.288 ms
Таймер B = все 0 -> 73.44 ms

Регистр 27H


D7D6D5D4D3D2D1D0
CSM MODE*Режим канала 3Сброс BСброс AВключение AВключение BЗагрузка AЗагрузка B


* Если здесь 1, то по переполнению таймера A осуществляется key on всех операторов канала 3.

Регистр 27H управляет таймерами A и B и режимом 3-го FM канала.

Режим канала 3D6
Нормальный0Канал 3 такой же, как и остальные
Особый1Канал 3 имеет 4 разных частоты


В нормальном режиме операторы канала используют частоты, кратные частоте оператора 1.
В особом режиме каждый оператор имеет собственную частоту. Частота оператора 4 канала 3 лежит в регистрах A2H и A6H. Частоты операторов 2, 1 и 3 канала 3 - в регистрах A8H и ACH, A9H и ADH, AAH и AEH соответственно.

Загрузка1 запускает таймер, 0 останавливает его.
Включение1 разрешает устанавливать флаг при переполнении. 0 таймер считает без установки флага.
СбросЗапись 1 очищает флаг, запись 0 ничего не делает.


Регистр 28H – Включение/выключение ноты

TurboSound FM Руководство программиста

Регистр используется для генерации событий "key on" и "key off".
"Key on" - аналог нажатия на клавишу синтезатора.
"Key off" - аналог отпускания клавиши.
Последовательность извлечения ноты: 1 – установить параметры, 2 – “key on”, 3 - подождать, 4 – “key off”. Когда происходит “key off”, оператор прекращает медленное затухание и начинает быстрое, скорость которого задана в "RR" (Release Rate – скорость отпускания).

При одиночной записи в регистр 28H состояние всех операторов канала устанавливается одновременно. Обычно их устанавливает либо все в 1 (вкл) либо все в 0 (выкл). Благодаря особенности канала 3 можно использовать для каждого оператора отдельные ноты, включая и выключая их по отдельности.

Микросхема реагирует непосредственно на изменение битов key on/off, поэтому нельзя сделать подряд два key on для одного и того же оператора - между ними должен быть key off.

Номер канала кодируется следующим образом:

D2D1D0Канал
0001
0012
0103


Регистры 2D-2FH – Управление предделителем частоты чипа


См. раздел 5.3.

Диапазон регистров 30H+ – Расстройка и множитель

TurboSound FM Руководство программиста

DT1 (Detune - расстройка) и MUL (Multiple - множитель) задают частоту оператора в зависимости от основ-ной частоты в канале.

Значение MUL лежит в пределах 0..15 и является множителем основной частоты. Исключение составляет значение 0 – оно соответствует 1/2 основной частоты. Таким образом, MUL=0..15 даёт *1/2, *1, *2, ...*15.

DT1 даёт небольшую вариацию (расстройку) основной частоты *MUL. Старший бит DT1 (бит D6 в 30H+) яв-ляется знаком, а остальные два - значением.

D6D5D4Множитель
000без изменений
001×(1+E)
010×(1+2E)
011×(1+3E)
100без изменений
101×(1-E)
110×(1-2E)
111×(1-3E)

Где E – малое число.

Диапазон регистров 40H+ – Основная амплитуда

TurboSound FM Руководство программиста

TL (Total Level – общая громкость) задаёт максимальную амплитуду огибающей оператора, причём 0 – наи-большая амплитуда, 127 – наименьшая. Изменение происходит с шагом примерно в 0.75 dB.

Для управления громкостью ноты следует изменять TL только у слотов (выходных операторов). Изменение TL других операторов приводит к изменению тембра.

Диапазон регистров 50H+ – Масштаб скорости и скорость атаки

TurboSound FM Руководство программиста

В регистрах 50H+ содержится RS (Rate Scaling – масштаб скорости) и AR (Attack Rate – скорость атаки). AR - скорость начальной атаки, которая продолжается до максимального уровня TL (см. выше). При AR=31 атака самая быстрая, при AR=1 - самая медленная, при AR=0 движения не происходит (аналогично с другими скоростями). При увеличении AR (и др. скоростей) на 2 единицы скорость увеличивается вдвое.

RS - коэффицент ускорения амплитудной огибающей в зависимости от частоты звука (чем больше частота, тем сильнее ускоряется), и влияет на все скорости (AR, DR, SR и RR) одинаково.

Пять старших бит частоты (3 бита октавы и 2 бита ноты) называются KC (Key code – код клавиши) и исполь-зуются при расчете общего RS по формулам:
RS=0 -> Итоговая скорость = 2 * Скорость + (KC/8)
RS=1 -> Итоговая скорость = 2 * Скорость + (KC/4)
RS=2 -> Итоговая скорость = 2 * Скорость + (KC/2)
RS=3 -> Итоговая скорость = 2 * Скорость + (KC/1)
key scale rate=kcode>>(3-KSR)
KC/N всегда округляется в меньшую сторону.

Так как все скорости изменяются в пределах 0..31, то диапазон влияния RS на скорости меняется от малого (0-3) до большого (0-31).

Диапазон регистров 60H+ – Скорость первого затухания

TurboSound FM Руководство программиста

DR - скорость первого затухания (см. рисунок огибающей). Как и все другие скорости, зависит от RS.

Диапазон регистров 70H+ – Скорость затухания удержания

TurboSound FM Руководство программиста

SR - скорость второго (медленного) затухания, продолжающегося, пока нажата клавиша.

Диапазон регистров 80H+ – Амплитуда удержания и скорость отпускания

TurboSound FM Руководство программиста

SL - вторичная амплитуда, после которой первое затухание переходит во второе. Чем больше число – тем меньше амплитуда (0 – максимальная).

RR - скорость отпускания (точнее, быстрого затухания после отпускания клавиши). Все скорости - 5-битные числа, но здесь доступно всего 4 бита. Для соответствия здесь используются 4 старших бита скорости от-пускания, а младший бит всегда равен 1. Иными словами, умножьте на 2 и прибавьте 1.

Диапазон регистров 90H+ – Вариант направления/цикла огибающей

TurboSound FM Руководство программиста

Регистр управляет формой, направлением и зацикливанием огибающей. Если бит D3 равен 0, то считается, что регистр не активен. Значения трактуются следующим образом (все времена уменьшаются в 4 раза, а переворот осуществляется по оси громкости, а не по оси времени):
TurboSound FM Руководство программиста

Диапазон регистров A0H+, A4H+, A8H+, ACH+ - Частота и октава

TurboSound FM Руководство программиста

Частота канала 1 - в регистрах A0H и A4H.
Частота канала 2 - в регистрах A1H и A5H.
Частота канала 3 в нормальном режиме (см. выше) - в регистрах A2H и A6H.

Если канал 3 в специальном режиме:
Частота 4 оператора канала 3 - в регистрах A2H и A6H
Частота 2 оператора канала 3 - в регистрах A8H и ACH
Частота 1 оператора канала 3 - в регистрах A9H и ADH
Частота 3 оператора канала 3 - в регистрах AAH и AEH

Частота – это 14-битное число. Надо устанавливать сначала старший, затем младший байт (например, сначала регистр A4H, потом регистр A0H). Старшие 3 бита называются “блоком” и задают октаву. Следующие 11 бит задают позицию в октаве, и возможна последовательность из 12 значений:
TurboSound FM Руководство программиста

Эти числа (их можно пересчитать под другой строй) используются в каждой октаве.
По всей видимости, формула частоты такова:
TurboSound FM Руководство программиста

где:
* F – получаемая частота;
* N – значение частоты.
* Block – номер блока (октавы), от 0 до 7;
* Clk – частота микросхемы;
* Scale – коэффицент деления частоты микросхемы. По умолчанию (после сброса) равен 6*12 (72), также возможны значения 2*12 (24) и 3*12 (36) – после переключения предделителя (регистры 2DH/2EH/2FH).
Если плавно менять частоту во время звучания ноты, можно получить эффекты вибрато и портаменто.

Диапазон регистров B0H+ - Обратная связь и алгоритм

TurboSound FM Руководство программиста

Обратная связь – это степень возврата собственного сигнала 1-го оператора в него обратно.
Алгоритм – способ взаимодействия операторов. Диаграммы алгоритмов смотрите выше.

4.6. Тестовая программа

Тестовая программа инициализации ноты "Grand Piano" (рояль):

TurboSound FM Руководство программиста

Примечание: всегда записываем сначала старший байт, затем младший.

5. Тонкости программирования TFM

5.1. Работа с регистрами

В TFM (даже в PSG регистры) нельзя записывать данные слишком быстро. До и после указания номера регистра следует ожидать готовность YM2203. Флаг готовности читается из 7-го бита любого регистра YM2203 (т.е. из порта #fffd), если включен режим чтения готовности. Этот режим включен, если последний выбранный псевдорегистр TFM имел номер %1111100c, где c - номер микросхемы. Псевдорегистрами TFM являются все регистры вида %11111frc, где f включает FM синтез (0 = включено), r включает режим опроса готовности (0 = включено), c - номер микросхе-мы. Выбор псевдорегистра обрабатывается ПЛИС, до YM2203 он не доходит - текущий регистр не меняется.
Если FM синтез выключен (f=1), то в TFM можно писать с любой скоростью.

Работа с TFM происходит следующим образом:
* Выбираем регистр %11111001, работаем с одной микросхемой;
* Выбираем регистр %11111000, работаем с другой микросхемой;
* После окончания работы с FM (конец музыки) следует выбрать регистр %11111111.

Работа с конкретным чипом при условии, что выбран псевдорегистр %1111100c:
1. Читаем бит состояния (7-й в порту #fffd) и ждём готовность (=0);
2. Ставим номер регистра;
3. Читаем бит состояния (7-й в порту #fffd) и ждём готовность (=0);
4. Пишем в регистр, номер которого установлен в пункте 2.

5.2. Особенности FM синтеза

Изменения параметров инструмента (кроме TL, MUL и, видимо, Detune) отрабатываются только после очередного key on. Поэтому последовательность "keyoff, keyon, изменение" не работает (точнее, изменение произойдёт на следующей ноте). Это позволяет заполнять параметры инструмента за фрейм (кадр) до начала ноты, как в TFM Compiler.
Во время key on и в начале нового периода огибающей генератор синусоиды инициализируется, что даёт более предсказуемое звучание, чем на PSG.
Нельзя писать только старший или только младший регистр частоты - надо каждый раз заполнять оба (старший, затем младший). Иначе частота получается не такой, какую ожидали.

5.3. Особенность инициализации TFM

При инициализации (после зануления регистров) следует записать в регистр #2F любое число, затем любое число в регистр #2D. Иначе музыка играет завышенно. Это регистры прескалера - управляют предделителем частоты. В MAME их работа описывается следующим образом:

  prescaler circuit (best guess to verified chip behaviour)

TurboSound FM Руководство программиста

reg.2d : sel2 = in21 (select sel2)
reg.2e : sel1 = in11 (select sel1)
reg.2f : sel1 = in10 , sel2 = in20 (clear selector)
reset  : sel1 = in11 , sel2 = in21 (clear both)


Авторы: HardWareMan, Dexus, Alone Coder, Shiru



Вернуться
  • Комментарий: 0
  • Просмотров: 2564

Комментарии:

Оставить комментарий