Четверг, 25.04.2024, 09:15
Вы вошли как Гость | Группа "Гости" | RSS

.
 
 
Главная Регистрация Вход
Меню сайта

Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Поиск

Links
  • Спрайт-ripper
  • Romhacking.net
  • Owls-Группа
  • Romhack Streams
  • Romhack Discord

  • XD

    Статьи » Технические

    SMPS Sound Driver: Общая инфа
    Звуковой движок Simple Music Playback System (SMPS)

    SMPS – довольно распространенный в играх Sega MegaDrive/Genesis звуковой движок. Используется в таких играх, как например Sonic The Hedgehog, Phantasy Star, Alien Soldier и многих других. Структура мелодии на этом движке довольно проста, откуда и появилось его название. В этой статье я постараюсь освятить основополагающие принципы движка, его состав, разновидности, и конечно создание музыки для него.

    Существуют 3 разновидности движка SMPS:

    1. SMPS z80 – всю музыку, звуки и PCM сэмплы проигрывает процессор z80. Используется в таких играх как: Sonic The Hedgehog 3, Phantasy Star 3, Battletoads;
    2. SMPS 68k – музыку и звуки проигрывает основной процессор Motorola68000, а PCM сэмплы играет z80. Используется в играх Sonic The Hedgehog, Shinobi 3 – The Return of Ninja Master.
    3. SMPS/Treasure – некая помесь первых двух версий, встречается в основном в играх от Treasure: Light Crusader, Yu Yu Hakusho. В данной статье рассматриваться не будет.


    Структура мелодии

    Мелодия на движке SMPS любой версии состоит из трех частей:

    1. Заголовок, он же Header. В заголовке содержится информация о числе используемых мелодией звуковых каналов (FM(0-5), PSG(1-3) и DAC), указателей (pointer) на последовательности нот для каждого канала, а также поинтер, указывающий на инструменты или дословно «голоса» (voices), которые использует данная мелодия. В заголовке сразу же просматривается первое отличие между двумя типами движков 68k и z80: как вы знаете, z80 использует остроконечный (little-endian) способ хранения данных. Поэтому байты в слове записываются задом наперед. Далее, опять, как всем известно, доступ z80 к адресному пространству 68k осуществляется посредством банков памяти по 32КБ ($8000 символов), и помещается этот банк в адресное пространство z80 по адресу $8000 (для справки: для 68k он будет выглядеть как $A08000). И указатели в мелодии для SMPS z80 показывают только абсолютные адреса, а не относительные, как в SMPS 68k. В общем, наверно я уже совсем вас запутал, рассмотрим лучше пример.

    Пример 1: имеем мелодию формата SMPS 68k. Лежит она в роме по офсету $2000. В ней, допустим, есть поинтер по офсету $2100 следующего вида: $0123. Куда он указывает – все просто, поинтеры 68k относительные, поэтому просто прибавляем его значение к значению местоположения его в роме. То есть $2100+$0123=$2123. Сюда он и указывает. Однако это не относится к поинтерам в заголовке! Здесь у него значение также относительное, только относительно оно не местоположению поинтера, а местоположению начала заголовка!

    Пример 2: имеем ту же мелодию, но в формате SMPS z80. Банк у нас самый первый ($0-$7FFF). Сразу представим, как этот банк полностью помещается в оперативку z80. То есть оффсет поинтера в роме выглядит как $100, а для z80 это уже будет $8100. Смотрим на сам поинтер: $23A1. Куда же он указывает? Во-первых, помним, про остроконечный метод хранения данных и поменяем байты местами, получилось $A123. Это, по сути, абсолютный адрес в оперативке z80. Отнимем $8000 и получим адрес относительно текущего банка: $2123. Смотрим, в каком банке лежит мелодия: банк 0 ($0-$7FFF) и прибавляем к значению начала банка наш получившийся поинтер: $0+$2123=$2123. Вот куда указывает наш поинтер в роме.

    Более подробно структура заголовка рассмотрена в разделе «Заголовок» ниже.

    2. Тело мелодии. Собственно тут записываются сами нотные последовательности. Ноты соответствуют байтам. Вообще в этой части мелодии используются все возможные значения байта. Рассмотрим их:

    • [$0..$7F] – значение продолжительности звучания ноты;
    • [$80] – просто тишина;
    • [$81..$DF] – номер ноты;
    • [$E0..$FF] – координационный флаг.
    Способы записи нотной последовательности показаны в разделе «Ноты», о флагах рассказывается в разделе «Флаги» ниже.
    3. Инструменты (voices), используемые мелодией. Размер этой части обычно кратен 25 байтам, т.к. каждый инструмент в SMPS формате занимает ровно 25 байт.

    Заголовок (Header)
    Оффсет
    Описание
    $00
    Поинтер на голоса 
    $02
    Число FM каналов, которые использует мелодия. Важно помнить, что реальное число FM каналов на один меньше, чем указано, т.к. один канал выделяется под DAC. Если вы не используете DAC, то нужно перед нотными данными канала поставить $F2. 
    $03
    Число PSG каналов, которые использует мелодия. Если вы хотите использовать Noise, то его может проигрывать только канал 3. 
    $04
    Множитель для вычисления продолжительности звучания ноты. Величина продолжительности умножается на значение, здесь указанное. 
    $05
    Скорость воспроизведения мелодии. $0 – быстрейшая, $FF – самая медленная.

    Это главный заголовок мелодии. После него следуют заголовки каналов FM и PSG. Размер заголовка FM равен 4 байтам, а размер заголовка PSG равен 6 байтам.

    Ноты (Notes)

    Нотная последовательность имеет общий вид:

    dc.b Нота, Продолжительность

    Однако, если вам нужно, чтобы данная нота играла несколько раз подряд с разными продолжительностями, необязательно каждый раз вот так ее указывать:

    dc.b Нота1, Продолжительность1, Нота1, Продолжительность2, Нота1,

    dc.b Продолжительность3

    Нота сохраняется в памяти, поэтому достаточно просто вызвать новую продолжительность.

    dc.b Нота, Продолжительность1, Продолжительность2, Продолжительность3.

    Каждый нотный номер конечно же эквивалентен реальной ноте. Вот таблица соответствия (взято с segaretro.org):

     Байт Нота Байт Нота Байт Нота БайтНота 
     $81 C0  $99 C2 $B1 C4 $C9 C6
     $82 C#0 $9A C#2 $B2 C#4 $CA C#6
     $83 D0  $9B D2 $B3 D4 $CB D6
     $84 D#0  $9C D#2 $B4 D#4 $CC D#6
     $85 E0  $9D E2 $B5 E4 $CD E6
     $86 F0  $9E F2 $B6 F4 $CE F6
     $87 F#0  $9F F#2 $B7 F#4 $CF F#6
     $88 G0 $A0 G2 $B8 G4 $D0 G6
     $89 G#0 $A1 G#2 $B9 G#4 $D1 G#6
     $8A A0 $A2 A2 $BA A4 $D2 A6
     $8B A#0 $A3 A#2 $BB A#4 $D3 A#6
     $8C B0 $A4 B2 $BC B4 $D4 B6
     $8D C1 $A5 C3 $BD C5 $D5 C7
     $8E C#1 $A6 C#3 $BE C#5 $D6 C#7
     $8F D1 $A7 D3 $BF D5 $D7 D7
     $90 D#1 $A8 D#3 $C0 D#5 $D8 D#7
     $91 E1  $A9 E3 $C1 E5 $D9 E7
     $92 F1  $AA F3 $C2 F5 $DA F7
     $93 F#1 $AB F#3 $C3 F#5 $DB F#7
     $94 G1 $AC G3 $C4 G5 $DC G7
     $95 G#1 $AD G#3 $C5 G#5 $DD G#7
     $96 A1 $AE A3 $C6 A5 $DE A7
     $97 A#1 $AF A#3 $C7 A#5 $DF A#7
     $98 B1 $B0 B3 $C8 B5 

     

    Флаги (Coordination Flags)
    Coming Soon...
    Категория: Технические | Добавил: Smoke (06.12.2011)
    Просмотров: 3905 | Теги: Driver, hacking, music, documentation, Genesis, Sega, Song, SMPS, smoke, Sound | Рейтинг: 5.0/1
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]

    Select language:
    English
    French
    German
    Portuguese
    Chinese
    Nemesis_c, r57shell, Smoke, Lipetsk, GoodBye (aka vfiuchcikicshuusrch) & Segaman © 2024
    Хостинг от uCoz