Описание формата SFF файлов


Что такое CASM?

Фирма Yamaha выпускает относительно недорогие клавиатуры, содержащие достаточно качественный встроенный синтезатор. Обычно модели от Yamaha снабжены возможностями автоарранжировки, оформленной для пользователя в виде так называемых стилей. Под стилем подразумевается набор из нескольких музыкальных оркестровок, сыгранных в определенной тональности. В дальнейшем, при игре с использованием стиля, клавиатура обрабатывает нажимаемые пользователем клавиши в левой части, вычисляет нужную тональность и воспроизводит выбранную музыкальную оркестровку в нужной тональности. Собственно стиль содержит музыкальные данные, представляющие собой обыкновенный МИДИ файл и некоторые дополнительные сведения, не помещающиеся в спецификацию стандарта SMF0.
Стили для музыкальной автоарранжировки для пользователя представлены файлами с расширением STY. Фирма Yamaha называет эти файлы следующим образом: файлы в стандарте SFF. Практически все модели имеющие встроенные дисководы умеют читать и записывать стили именно в формате SFF. Пользователям звуковых карт стили от Yamaha также могут оказаться вполне пригодными - известная программа Yamaha Visual Arranger (далее YVA) имеет возможность работать с внешними файлами формата SFF. Несмотря на свою простоту, программа Yamaha Visual Arranger может с успехом использоваться пользователем - музыкантом для создания высококачественной MIDI - заготовки с аккомпанементом.


Состав файла стиля

Файл формата SFF состоит из двух частей:

1. Стандартный MIDI файл в формате SMF0
2. Дополнительная секция CASM

Если изменить расширение файла STY на MID, то музыкальные данные стиля можно просмотреть и отредактировать любым MIDI редактором (секвенсором).
Во второй части файла, которую мы будем называть CASM секцией файла стандарта SFF, содержится дополнительная информация, используемая автоарранжировщиком музыкальной клавиатуры или программой YVA.


Структура секции CASM

Секция CASM начинается четырех байтов : "CASM" [0x43, 0x41, 0x53, 0x4D]. Затем идет длина всех оставшихся байтов в виде четырех байтов - по младшим адресам располагается старшие байты.
Далее структура данных представлена произвольным числом разделов, носящих имя CSEG. Все разделы располагаются один за другим. Таким образом в целом файл формата SFF представлен в следующем виде:

CASM //текстовый заголовок - 4 байта
LEN //длина в обратном порядке - 4 байта
CSEG //первый раздел CSEG
...  
CSEG //последний раздел CSEG

Далее рассмотрим структуру раздела CSEG.


Структура раздела CSEG

Раздел начинается с текстового четырехбайтового заголовка: "CSEG" [0x42,0x53,0x45,0x47]. Далее идет четырехбайтовая длина всех оставшихся данных в разделе CSEG. Порядок обратный - по младшим адресам расположены старшие байты длины (далее аналогичные данные будем называть"длина в обратном порядке").
Далее расположен раздел "Sdec", который определяет к каким секциям стиля относится данный раздел CSEG. Состав раздела :

N Поле Байтов Пояснение
1 "Sdec" 4 Четыре байта заголовка [0x53,0x64,0x65,0x63]
2 LEN 4 Четыре байта длины в обратном порядке. В длину входят только данные названий секций (Текст)
3 Текст   Данные названий секций. Например "Main A,Fill In AA". В этом тексте через запятую без пробелов перечислены секции стиля к которым относится данная секция

Следом за разделом "Sdec" последовательно располагаются разделы "Ctab", число которых может быть от одного до 16. Каждый раздел "Ctab" описывает один трэк данных или один MIDI-канал.


Состав раздела"Ctab"

В таблицах ниже приведена структура раздела Ctab. Количество разделов Ctab в файле SFF фактически может быть равно сумме числа трэков ао асех секцях стиля.

N Поле Байтов Пояснение
1 "Ctab" 4 Четыре байта заголовка [0x43,0x74,0x61,0x62]
2 LEN 4 Четыре байта длины в обратном порядке. Длина 27 [0x00,0x00,0x00,0x1B]. В некоторых стилях встречаются нестандартные длины разделов "Ctab" - 31 и 33.
3 Track 1 Номер трэка [0...0x1F]
4 Name 8 Имя инструмента (трэка), все восемь байт значащие
5 MidiChan 1 Номер MIDI канала [0...0x1F], используемый на PSR для данного трэка
6 ReadOnly 1 Трэк только для чтения.[0...1] 1 - Read Only Track, 0 - Editable Track
7 NoteMute1 1 Приглушение нот [0x0F] Note Mute 1:
бит7...4 не используются (равны 0)
бит 3- нота B
бит 2- нота A#
бит 1- нота A
бит 0- нота G#
Установленный бит соответствует использованию трэка для этой ноты.
8 NoteMute0 1 Приглушение нот [0xFF] Note Mute 0:
бит 7- нота G
бит 6- нота F#
бит 5- нота F
бит 4- нота E
бит 3- нота D
#бит 2- нота D
бит 1- нота C#
бит 0- нота C
Установленный бит соответствует использованию трэка для этой ноты.
9 ChordMute4 1 Приглушение аккордов [0x03] Chord Mute 4:
бит 7...бит 3- не используются
бит 2 - всегда установлен для трэков ударных
бит 1- аккорд "1+2+5"
бит 0- аккорд "sus4"
Установленный бит соответствует использованию трэка для этого аккорда.
10 ChordMute3 1 Приглушение аккордов [0xFF] Chord Mute 3:
бит 7- аккорд "1+5"
бит 6- аккорд "1+8"
бит 5- аккорд "7aug"
бит 4- аккорд "Maj7aug"
бит 3- аккорд "7(#9)"
бит 2- аккорд "7(b13)"
бит 1- аккорд "7(b9)"
бит 0- аккорд "7(13)"
Установленный бит соответствует использованию трэка для этого аккорда
11 ChordMute2 1 Приглушение аккордов [0xFF] Chord Mute 2:
бит 7- аккорд "7(#11)
"бит 6- аккорд "7(9)"
бит 5- аккорд "7b5"
бит 4- аккорд "7sus4"
бит 3- аккорд "7"
бит 2- аккорд "dim7"
бит 1- аккорд "dim"
бит 0- аккорд "minMaj7(9)"
Установленный бит соответствует использованию трэка для этого аккорда.
12 ChordMute1 1 Приглушение аккордов [0xFF] Chord Mute 1:
бит 7- аккорд "minMaj7"
бит 6- аккорд "min7(11)"
бит 5- аккорд "min7(9)"
бит 4- аккорд "min(9)"
бит 3- аккорд "min7b5"
бит 2- аккорд "min7"
бит 1- аккорд "min6"
бит 0- аккорд "min"
Установленный бит соответствует использованию трэка для этого аккорда.
13 ChordMute0 1 Приглушение аккордов [0xFF] Chord Mute 0:
бит 7- аккорд "aug"
бит 6- аккорд "Maj6(9)"
бит 5- аккорд "Maj7(9)"
бит 4- аккорд "Maj(9)"
бит 3- аккорд "Maj7(#11)"
бит 2- аккорд "Maj7"
бит 1- аккорд "Maj6"
бит 0- аккорд "Maj"
Установленный бит соответствует использованию трэка для этого аккорда.
14 ChordRoot 1 Основной аккорд [0-C,1-C#...11-B]
15 ChordType 1 Вид основного аккорда [0...0x21]
16 NTR 1 Правило транспонирования нот [0...1]
17 NTT 1 Таблица транспонирования нот [0...5]
18 HighestKey 1 Верхняя нота [0-C,1-C#...11-B]
19 LowLimit 1 Нижнее ограничение нот [0...116]
20 HighLimit 1 Верхнее ограничение нот [39...127]
21 RTR 1 Правила смены тональности [0...4]
22 unkn26 1 Неизвестный байт [0x00]Обычно этот байт всегда 0, но в том случае когда длина раздела Ctab отличается от 27 этот байт принимает значение 1
Поле Описание
Chord Root Полное название: Source Chord Root.
Задает базовую ноту тональности в которой создан данный трэк данной секции . Возможные значения совпадают с количеством нот в октаве - 12.
Значения: [0-C, 1-C#... 11-B]
Значение по умолчанию: 0 - нота до
Chord Type Полное название: Source Chord Type.
Задает базовый тип аккорда, в котором создан данный трэк данной секции. Возможные значения от 0 до 33. (Всего 34 аккорда).
Названия аккордов , основные и вспомогательные ноты этих аккордов показаны на рисунке "Базовые типы аккордов" ниже таблицы.
Значение по умолчанию: 2 - соответствует Maj7
NTR Полное название: Note Transposition Rule
Правило транспонирования нот. Задает правило транспонирования для использования таблицы транспонирования (NTT).
Возможны два значения:
Root Transposition Rule
Правило транспонирования базового аккорда. Это правило сохраняет взаимное расположение отдельных нот по высоте при транспонировании. Установите это правило для трэков, содержащих фразы мелодий или похожих на мелодии, где следует сохранить относительное расстояние между нотами.
Пример: ноты C3, E3, G3 перейдут в F3, A3, C4, если аккорд изменился с До(C) на Фа(F)
Root Fixed Rule
Правило фиксированного базового аккорда. Это правило максимально сохраняет высоту нот в нотной последовательности. Установите это правило для трэков с фортепиано и трэков, напоминающих игру на гитаре аккордами.
Пример: ноты C3, E3, G3 перейдут в C3, F3, и A3, если аккорд изменился с До(C) на Фа(F)
Значения:
Fixed - значение 1.
Trans. - значение 0.
NTT Полное название: Note Transposition Table
Таблица транспонирования нот.
Задает одну из 6-ти возможных таблиц выполнения изменения аккордов (транспонирования) для исполняемой нотной последовательности.
Bypass
Обход, отмена - отменяет транспонирование. Партия ударных, например, ни в коем случае не должна трнспонироваться, т.к. каждой ноте соответствует свой ударный инструмент и при транспонировании фактически будут звучать совершенно другие ударные инструменты.
Melody
Мелодия. Эта таблица вполне подойдет для транспозиции мелодических фраз. Назначайте эту таблицу для трэков фраз PHRASE 1 и PHRASE 2.
Bass
Бас. Эту таблицу следует использовать для транспозиции партий баса. Содержимое таблицы совпадает с таблицей Melody, но еще распознаются аккорды на басу, так как это делается в режиме Fingered2. Используйте таблицу для низких по высоте инструментов, которыми исполняются партии баса.
Chord
Аккорд. Эта таблица более всего подходит для транспозиции аккордов. Используйте ее для трэков CHORD 1 и CHORD 2, где исполняются аккордовые партии на фортепиано или на гитаре.
M-m Only (M)
Мелодический минор. Эта таблица понижает терцию на полутон при переходе от мажорного аккорда к минорному или увеличивает минорную терцию на пол тона при переходе от минорного аккорда к мажорному. Все остальные ноты не изменяются.
M-m Only (H)
Гармонический минор. При переходе от мажорного аккорда к минорному эта таблица понижает терцию и шестую на полутон. При переходе от минорного аккорда к мажорному происходит увеличение пониженную терцию и шестую на пол тона. Все остальные ноты не изменяются.
Значения:
0-Bypass
1-Melody
2-Chord
3-Bass
4-M-m Only (M)
5-M-m Only (H)
Highest Key Верхняя нота
Устанавливает номер самой высокой ноты транспонирования для базовой ноты. Ноты, расположенные выше верхней ноты будут исполнены в октаве ниже верхней ноты. Это правило работает только когда Note Transposition Rule установлено в значение Root Transposition Rule.
Пример: HIGH KEY = F.
Исполнение на клавиатуре: C C# D F F#
Звучащие ноты: C3-E3-G3 / C#3-F3-G#3 / D3-F#3-A3 / F3-A3-C4 / F#2-A#2-C#3 Значения: [0-C, 1-C#... 11-B]
Low Limit Нижнее ограничение нот
Значение Low Limit определят самый низкий предел для всех нот данного трэка Ноты расположенные ниже этого предела реально будут воспроизводится на октаву выше. Это необходимо для того, чтобы при игре на PSR не появлялись звуки несвойственные данному инструменту (трэку). Например в обычных условиях невозможно исполнить звуки басового диапазона на флейте piccolo.
Значения: 0...116 (номера нот).
High Limit Верхнее ограничение нот
Значение High Limit определят самый высокий предел для всех нот данного трэка Ноты расположенные выше этого предела реально будут воспроизводится на октаву ниже. Это необходимо для того, чтобы при игре на PSR не появлялись звуки несвойственные данному инструменту (трэку). Например в реальности невозможно исполнить звуки контрабаса в высокочастотной области.
Значения: 39...127 (номера нот).
RTR Полное название: ReTrigger Rule
Правило переключения.
Задает метод воспроизведения нот трэка в момент когда происходит смена аккорда.Всего есть пяти возможных вариантов:
Stop
При смене аккорда текущая нота просто останавливается (прерывается) и начинает звучать новая нота.
PitchShift
Высота ноты изменяется и начинает соответствовать новому аккорду.
PShiftToRoot
(Pitch Shift To Root) Высота ноты изменяется и начинает соответствовать базовому тону нового аккорда.
Retrigger
Звучание ноты прерывается и затем она вновь звучит с высотой, соответствующей новому типу аккорда.
Ret.ToRoot
(Retrigger To Root) Звучание ноты прерывается и затем она вновь звучит с высотой, соответствующей новой ноте основания аккорда.

Рис. Базовые типы аккордов


От автора

Данное описание не является официальным и носит сугубо любительский характер. Автор не несет ответственности за программные продукты созданные с использованием данного описания.

К сожалению мне не удалось найти описание формата SFF в Internet. Поэтому если Вы обнаружите несоответствия или ошибки в данном описании или программе CasmEdit, то найдите время чтобы сообщить мне об этом.

Всего наилучшего... Осененко Евгений...

Мой адрес: osenenko@chat.ru

30 апреля 2000 г.