N-SPC Player is a common SPC player included in many SNES games. The actual player N-SPC itself seems to vary slightly from game to game. Secret of Mana's internal music format can be thought of as a counterpart to N-SPC, as can Seiken Densetsu 3. The N-SPC format was limited in terms of the sample size available. Other developers created their own formats to really push the SPC700's power.

Rare's format for the Donkey Kong Country games and Square's SPC format made use of longer/higher quality samples, and better use of the 8 channels (for example, using a wide range of instrument samples in one single channel). HAL Labs made good use of a wide range of effects that the SPC chip offered too - the music in Kirby Super Star is a wonderful example.

N-SPC Games

These games use some variant of the N-SPC system.

Game N-SPC Version Engine Offset
BS Special Tee Shot
3x3 Eyes - Seima Kourinden
4 Nin Shogi
Act Raiser
Albert Oddysey
Albert Oddysey 2
Alcahest
Alice's Paint Adventure
Arkanoid: Doh It Again
Benkai Gaiden
Bishin Densetsu Zoku
Bubsy in Claws Encounters of the Furred Kind
Bulls vs. Blazers 0xE1D86 US
Captain Tsubasa 3
Captain Tsubasa 4
Captain Tsubasa 5
Cardmaster
Casper
Clock Tower
Daze Before Christmas
Donald Duck - Mahou no Boushi
Doreamon
Doreamon 2
Doukyuusei 2
Dragon Ball Z - RPG
Dragon Ball Z - Super Butouden
Dragon Ball Z - Super Butouden 2
Drakkhen
Earthbound
F1 Pole Position
F-Zero Common (0xE0 Instrument Command)
Fire Emblem - Monshou no Nazo Extended Version
Ginga Eiyuu Densetsu
Gradius 3
Harapeko Bakka
Hashire Hebereke
Hebereke no Popun
Hyper Zone
Inspector Gadget
Joe & Mac
Kiki Kaikai
Kiki Kaikai 3
Kirby Super Star
Kirby's Dream Course
Kirby's Dream Land 3
Kirby's Kira Kira Kids
Last Fighter Twin
Lemmings
Lupin Sansei - Densetsu no Hihou o Oe
Magical Drop Common (0xE0 Instrument Command)
Magical Taruruto Kun
Mario Paint
Marvelous - Mouhitotsu no Takarajima Extended Version
Mouryou Senki Madara 2
Pac Man 2
Panel de Pon Altered Beta / Old Version
Pilotwings Beta / Old Version
Pipe Dream
Pirates of Dark Water
Pocky & Rocky 2
Pocky & Rocky
Power Rangers
Sailor Moon S - Kurukkurin
Sailor Moon Super S - Zenin Sanka - Shuyaku Soudatsusen
Satellaview BIOS 0xF1560
SD Great Battle
SD Gundam Gaiden
SD Gundam Gaiden 2
SD Gundam X - Super Gachapon World
SD Hiryu No Ken
SD Kidou Senshi Gundam V
Shigesato Itoi no Bass Tsuri No.1
Sim City
SNES Test Programm
Snoopy Conecrt
Soul Blazer
Star Fox
Star Fox 2
[[Stunt Race FX]]
Sugoi Hebereke
[[Super Adventure Island]]
Super Game Boy 0x3019A v1.1
Super Mario All-Stars Common (0xE0 Instrument Command)
Super Mario Kart
Super Mario World Beta / Old Version (0xDA Instrument Command)
Super Mario World 2 - Yoshi's Island Basic Version
Super Metroid
Super Scope 6
Super Tetris 2 + Bombliss
Super Wagan Land
Super Wagan Land 2
Sutte Hakkun
Tadaima Yusya Bosyutyu Okawari
Tenchi Muyo RPG
Tetris & Dr. Mario
Tetris Attack Beta / Old Version (0xDA Instrument Command)
The Smurfs
Tom & Jerry
Ushio No Tora
Waku Waku Ski Wonder Shoot
Xardion
Yadamon Wonderland Dreams
Yoshi's Cookie
Yoshi's Safari
Ys 3
Yuu Yuu Hakusho
Yuuyu no Quiz de Go! Go!
Zelda: A Link to the Past Common (0xE0 Instrument Command)

Structure

nintendo-music-format

; song list
feff: dw $ffff,$a000,$a200,$a400,...
; block list of song $01
a000: dw $b000
a002: dw $b010
a004: dw $0003,$b020 ; $0001-$007f - play for 4 (3+1) times
a006: dw $00ff,$a002 ; $0080-$00ff - goto $a002 (loop)
a008: dw $0000       ; end of song (shouldn't come here, though)
; block - starting point for each track ($00xx for null)
b000: dw $c000,$c100,$c200,$c300,$0000,$0000,$0000,$0000
; sequence
c000: ; voice cmds to playback...

どんな形で演奏データが表現されるのか、アセンブリで擬似的に示してみました。多くのゲームでは標準MIDIファイルのように、最初にデータの先頭位置を指定したらあとはひたすら演奏するのみかと思いますが、このゲームでは上位に小区間演奏データを束ねる形で曲データを表現します。繰り返しも簡単な制御構造によってそこで記述されています。ブロックの終端は演奏データ側で示されます。詳細は後述。

なお、通常は繰り返し回数がマイナスであれば goto なのですが、ゲームによっては $80,$81 のあたりを特別扱いしている感じも見られました。このあたりに関してはまだよく調べていません。

拙作のnintspcは、html出力の先頭にこれらの演奏制御情報を出力します。

Translated:

Will it be played on any form of data representation, assembly reveals a pseudo-I. Many games are standard MIDI as a file after you specify the beginning of the data first, but I think I only played earnestly, this game represents the music data in the form of bundle performance data small section on top. There has been described by a simple control structure is also repeated. Block at the end of the performance data shown. See below.

The number of iterations is usually negative if a goto is, the game is $80, found to be of special treatment to like around $81. This area is not well studied for yet.

Of the nintspc 拙作, html output control information output at the beginning of these performances.

Version / Variation of the Format

  • Old Version (has 24 VCMDs ($DA-F2), used by Super Mario World & Pilotwings).
  • Basic Version (has 27 VCMDs (usually $E0-FA, used by a lot of games, Yoshi's Island for example).
  • Extended Version (based on Basic Version).
  • • May have additional VCMDs (Super Metroid, Marvelous, Intelligent Systems games, etc.).
  • • VCMDs may start from not $E0 (Intelligent Systems games, Fire Emblem for example).
  • • Some of its vbytes may work differently from Basic Version (Intelligent Systems games, Lemmings).

$e0-faの27コマンドを持っているものが基本的です。Super Mario World と Pilotwings に使われている初期のエンジンは少しコマンドが少ないですが、内容は対応します。その他、いくらか標準のものをベースにコマンド追加、あるいはそれ以上の拡張をしているものがあります。ちなみに、拡張コマンドの中には可変長のものもありました。

どれを扱うにしても、ひとまず基本的なタイプの構成を知らなければなりません。本稿では以降、基本タイプのコマンドについて解説したあと、少しだけ拡張の例について触れたいと思います。

Translated:

$E0-FA is essentially what you have command of 27. Super Mario World & Pilotwings early engine that is used a little less command, the content is supported. Other add some commands based on those standards, some of which extend to or more. By the way, was also in command of variable length extension.

How to deal with it, must know the basic types of configuration for now. We later discussed after the basic types of commands, I touch on a little extended example.

VCMD Map (Basic Version)

VCMD Description Arguments
$00 End / Return
$01-7F Note Parameters [xy]
$80-C7 Notes
$C8 Tie
$C9 Rest
$CA-DF Percussion Note
$E0 Set Instrument [xx]
$E1 Pan [xx]
$E2 Pan Fade [xx yy]
$E3 Vibrato On [xx yy zz]
$E4 Vibrato Off
$E5 Master Volume [xx]
$E6 Master Volume Fade [xx yy]
$E7 Tempo [xx]
$E8 Tempo Fade [xx yy]
$E9 Global Transpose [xx]
$EA Per-Voice Transpose [xx]
$EB Tremolo On [xx yy zz]
$EC Tremolo Off
$ED Volume [xx]
$EE Volume Fade [xx yy]
$EF Call Subroutine [xx yy zz]
$F0 Vibrato Fade [xx]
$F1 Pitch Envelope To [xx yy zz]
$F2 Pitch Envelope From [xx yy zz]
$F3 Pitch Envelope Off
$F4 Tuning [xx]
$F5 Echo VBits / Volume [xx yy zz]
$F6 Echo Off
$F7 Echo Parameters [xx yy zz]
$F8 Echo Volume Fade [xx yy zz]
$F9 Pitch Slide [xx yy zz]
$FA Percussion Patch Base [xx]
$FB-FF Undefined (Out of Table)

VCMD Map (Old Version)

VCMD Description
$00 End / Return
$01-7F Note Parameters
$80-C5 Note
$C6 Tie
$C7 Rest
$C8-CF Unused (May Work As a Rest?)
$D0-D9 Percussion Note
$DA Set Instrument
$DB Pan
$DC Pan Fade
$DD Pitch Slide
$DE Vibrato On
$DF Vibrato Off
$E0 Master Volume
$E1 Master Volume Fade
$E2 Tempo
$E3 Tempo Fade
$E4 Global Transpose
$E5 Tremolo On (Buggy)
$E6 Tremolo Off
$E7 Volume
$E8 Volume Fade
$E9 Call Subroutine
$EA Vibrato Fade
$EB Pitch Envelope To
$EC Pitch Envelope From
$ED (Undefined) Pitch Envelope Off (Code Exists, but Never Reached)
$EE Tuning
$EF Echo VBits / Volume
$F0 Echo Off
$F1 Echo Parameters
$F2 Echo Volume Fade
$F3-FF Undefined (Out of Table)

Voice Bytes

End/Return ($00)

  • "End" of block, or "Return" from subroutine. See also: $EF.
  • When a voice reaches "End", all voices end up then go to next block. "Return" works independently per voice.

演奏データの終端を意味します。サブルーチンコマンドで呼び出されてきたのであればサブルーチンの終端を、そうでないならブロックの終端を意味します。

ブロックの終端に達した場合、他のブロックも同じタイミングで演奏を中断し、次のブロックに移ります(繰り返し指定がなければ)。これに対して、サブルーチンからの復帰はチャンネル別に独立しておこなわれます。

Translated:

Means the end of the performance data. The end of the subroutine if the subroutine has been called in command means the end of the block otherwise.

If you reach the end of the block, stopped playing at the same time other block and move to the next block (if there be repeated.) In contrast, the return from the subroutine is done independently for each channel.

Note Parameters ($01-7F)

[xy]
When $xy < $80
  $x = Duration Rate (0-7)
  $y = Velocity Rate (0-15)
  • VByte itself means the length of the following note (48 = quarter note, usually).
  • Some games (Fire Emblem, Lemmings) takes Duration / Velocity info in different manner, be careful.

コマンドバイト自身で音の長さを表します。48で四分音符だと言われていますが、あまり気にしなくていいです。

続くバイト($xyとする)が$80未満であればそれも処理します。xで音の長さ(クオンタイズ)、yで音の大きさを段階的に指定します。数値に対応してどのような比率が割り当てられているのかは、中のテーブルを見てください(拙作nintspcはテーブルの位置を自動検索します)

Translated:

Itself represents the length of the sound-byte command. The note is said to be four in 48 do not have to worry too much.

Last byte ($xy that) but it also handles of less than $80. $x The length of the sound (quantization), $y specify the size of the sound stages. What percentage of assigned numbers correspond to what, please see the table in (拙作 nintspc automatically searches for the position of the table.)

Notes ($80-C7)

Tone Map (Some instruments might be tuned differently):

C C+ D D+ E F F+ G G+ A A+ B
Oc1 80 81 82 83 84 85 86 87 88 89 8A 8B
Oc2 8C 8D 8E 8F 90 91 92 93 94 95 96 97
Oc3 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3
Oc4 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
Oc5 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB
Oc6 BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7

音程を伴って音符を意味します。長さや強さは$01-7Fで設定します。

Translated:

Means the notes with a pitch. The length and intensity set at $01-7F.

Tie ($C8)

Rest stops uttering sound, Tie keeps.

Rest ($C9)

Rest stops uttering sound, Tie keeps.

Percussion Note ($CA-DF)

  • VByte itself means percussion note (#). Relations between percussion note and SRCN depends on $FA.

Set Instrument ($E0)

  • xx = voice number (SRCN and ADSR is stored in a table, xx is index for it.)
  • • When SRCN >= $80, the music engine sets "noise sound" VBit on, then uses lower-5bit for its clock.

音色を設定します。実際に音源に設定されるSRCNやADSRの情報は内部のテーブルに収められていて、このコマンドで指定するのはそのテーブルのインデックスです。

テーブル内部のSRCN情報が$80以上のときは、音源にノイズフラグを立てて、下位5ビットをそのクロックに設定します(古いバージョンにはそのような機能はない)。

Translated:

Set the tone. Is set to the actual source of the information they SRCN ADSR and housed inside the table, this command is to specify the table's index.

SRCN table inside information when more than $80, the instrument noise and flags and set the clock to the lower 5 bits (the older version is no such functionality.)

Pan ($E1)

音の左右位置を設定します。値の範囲は0~20と狭いです(実際の設定比率は内部テーブル定義)。バージョンによって、大きい値が左なのか右なのか異なります。上位2ビットは位相反転に用いられます。

Translated:

Set the location of the sound side. The range is from 0 to 20 and small (the ratio of the actual settings within the table definition.) Depending on the version differ a right or a left or greater. The upper two bits are used for phase inversion.

Pan Fade ($E2)

xx = Length
yy = Destination. (yy <= 20?)

音の位置をxx時間かけて現在の値からyyへとフェード。

Translated:

Sound position from its current value over time xx yy to fade.

Vibrato On ($E3)

xx = Delay
yy = Rate
zz = Depth

ビブラート(音程の揺れ)を有効にします。発音からxx時間後に、yyの早さでzzの大きさのビブラートがかかるよう設定します。

Translated:

Vibrato (pitch swing) to be enabled. Hours later the sound xx, yy zz sets in as fast as it takes the size of vibrato.

Vibrato Off ($E4)

Disable vibrato. Specifically set the Vibrato Depth to 0.

Master Volume ($E5)

The volume of the entire song set to $xx. The initial value is somewhat lower than the maximum.

Master Volume Fade ($E6)

xx = Length
yy = Destination

楽曲全体の音量をxx時間かけて現在の値からyyへとフェード。

Translated:

The volume of the entire song from the current value over time xx yy to fade.

Tempo ($E7)

x = Speed (about 24/60 of beat per minutes)

楽曲の演奏速度を指定します。bpmとの正確な対応はよくわかりませんが、およそ24/60の値が書かれています。

Translated:

Specifies the speed of music playing. BPM and the exact response, but I do not know, has been written about the value of 24/60.

Tempo Fade ($E8)

xx = Length
yy = Destination

楽曲の演奏速度をxx時間かけて現在の値からyyへとフェード。

Translated:

Musical performance rate from its current value over time xx yy to fade.

Global Transpose ($E9)

xx = Semitones (Signed)

全チャンネルの演奏音程をxx上げます(負数も指定可)。

Translated:

xx raises the pitch of all channels playing (can also specify a negative number.)

Per-Voice Transpose ($EA)

xx = Semitones (Signed)

単一チャンネルの演奏音程をxx上げます(負数も指定可)。

Translated:

Increase the pitch plays a single-channel xx (can also specify a negative number.)

Tremolo On ($EB)

xx = Delay
yy = Rate
zz = Depth

As far as I know, Super Mario World cannot handle tremolo correctly.

トレモロ(音量の揺れ)を有効にします。発音からxx時間後に、yyの早さでzzの大きさのトレモロがかかるよう設定します。

Translated:

Tremolo (shaking volume) enabled. Hours later the sound xx, yy zz sets in as fast as it takes the size of the tremolo.

Tremolo Off ($EC)

Disable the tremolo.

Volume ($ED)

xx = Length
yy = Destination

The volume of the channel. The initial value is $FF, the maximum.

Volume Fade ($EE)

チャンネルの音量をxx時間かけて現在の値からyyへとフェード。

Translated:

The volume of the channel from its current value over time xx yy to fade.

Call Subroutine ($EF)

  • Play block $yyxx for $zz+1 times.
  • Subroutine call cannot be nested.
  • See also $00

ブロック$yyxxの演奏をzz+1回繰り返します。サブルーチンはネスト不可です。

Translated:

zz+1 $yyxx playing block repeated twice. Subroutine is not nested.

Vibrato Fade ($F0)

xx = Length, Fade Vibrato depth from 0 to current value.

ビブラートの深さを一時的に0に設定したのち、xx時間かけて滑らかに元の値へと変化させます。

Translated:

After temporarily set to 0, the depth of vibrato, xx to the original value is varied smoothly over time.

Pitch Envelope To ($F1)

xx = Delay
yy = Length
zz = Key (Signed)
  • Sort of "do pitch slide for all of the following notes" vcmd.
  • Utter a note normally, wait for xx ticks, then fade the key to zz semitones higher (lower, when it's a minus number) for yy ticks.

以降の音が「xx時間後にyy時間かけてzzだけ高くなる」ように指定します。zzは半音単位で、負数も指定できます。

Translated:

Since the sound of "xx yy hours after hours to increase by zz" as specified. zz is a semitone, you can also specify a negative number.

Pitch Envelope From ($F2)

xx = Delay
yy = Length
zz = Key (Signed)
  • Sort of "do pitch slide for all of the following notes" VCMD.
  • Utter a note from higher (lower, when it's a minus number) than zz semitones, wait for xx ticks, then fade the key to normal pitch for yy ticks.

以降の音が「通常よりzz高い音程で発音、xx時間後にyy時間かけて通常の音程に戻る」ように指定します。zzは半音単位で、負数も指定できます。

Translated:

Since the sound of "high-pitched than usual pronunciation zz, xx yy h after return to normal pitch over time" as specified. zz is a semitone, you can also specify a negative number.

Pitch Envelope Off ($F3)

Disables the effect of the Pitch Envelope.

Tuning ($F4)

xx = Unsigned. Make the pitch xx/256 semitones higher.

音程をわずかに変化させます。指定できる値は正の数のみなので、音程を下げることはできません。

Translated:

Slightly alters the pitch. Since only values are positive numbers, not to lower the pitch.

Echo VBits / Volume ($F5)

xx = Echo Switch (EON)
yy = Echo Left Volume (EVOL (L))
zz = Echo Right Volume (EVOL (R))

エコーを有効にするチャンネルと音量を指定します。レジスタに設定される値そのままです。

Translated:

Specifies the volume to enable the echo channel. Register value is set to remain the same.

Echo Off ($F6)

Disable the echo.

Echo Parameters (Delay, Feedback, FIR Filter) ($F7)

xx = Echo Delay (EDL)
yy = Echo Feedback (EFB)
zz = Echo Filter (Index for table, 0-3 in most cases)

エコーの詳細を設定します。xxとyyはレジスタの値そのまま、zzはFIRフィルタの種類で、だいたい0~3の範囲で指定します。

Translated:

Sets the details of the echo. The value of the register as it is xx and yy, zz are the FIR filter type - Specifies the range of about 0 3.

Echo Volume Fade ($F8)

xx = Length
yy = Left Volume Destination
zz = Right Volume Destination

エコーの音量をxx時間かけて現在の値から指定した値へとフェード。yyとzzで左右別々に値を指定。

Translated:

Xx echo fades into the volume of the specified value from the current value over time. yy and zz values with separate left and right.

Pitch Slide ($F9)

xx = Delay
yy = Length
zz = Note VByte
  • This VCMD works only for current note, not for all of the following notes.
  • Old version doesn't have this VCMD in address table, but it's certainly handled specially.

This VCMD is handled at different timing than other VCMDs.

; utter note $90, (wait), set instrument to $01, utter note $92
$90, $e0 $01, $92
; utter note $90 then change the key immediately to note $91, (wait),
; utter note $92.
$90, $f9 $00 $01 $91, $92
; utter note $90 then change the key immediately to note $91, (wait),
; set instrument to $01, utter note $92.
$90, $f9 $00 $01 $91, $e0 01, $92
; <weird example> utter note $90, (wait), set instrument to $01,
; (pitch slide vcmd appears but note $90 has been end), utter note $92.
$90, $e0 01, $f9 $00 $01 $91, $92

発音中の音の音程を滑らかに変化させます。発音からxx時間後に、yy時間かけてzzの音程(絶対的指定)に変化させます。ひとつの音の途中で上げたり下げたりしたい場合、連続してこのコマンドを記述します。発音時間が長い場合はタイを交えて記述すればよいです。

普通はNoteの出現後は、音符の長さだけ待ってから次のバイトを処理しますが、このコマンドだけは即時に読み込まれて処理されます。扱いの特殊さゆえか、スーパーマリオワールドではこのコマンドは完全に処理テーブル外で処理されています。

Translated:

Causes a pitch to change smoothly while in use. Starting once xx time has passed since playing, the pitch will shift to zz over the course of yy. To vary a pitch within a single tone, simply repeat the command in succession. You should use a tie to connect notes if the tone is held for a long period of time.

Normally, after one notes appears, the byte(s) for the next note will be read after the duration of the first one has passed. This command will cause it to be read immediately instead. Perhaps because of some sort of special usage, this particular command is dealt with entirely outside the treatment table in SMW. It's pretty tough not knowing much about the system.

Percussion Patch Base ($FA)

xx = Instrument Number

Kirby Super Star has $FA, but it does nothing.

パーカッションの値と鳴らす音の対応を決めます。

Translated:

Determine the value of the percussion sound to respond.

About Extended Versions

拡張に関しては、あまり調べていないこともあって多くは書けません。

  • Super Metroid, Earthbound 等は同種の拡張コマンド4つを持っている(Zelda にもコードはあるようだが、テーブルに書かれていないため使えない)。
  • Intelligent Systems開発のゲームは可変長のコマンドを持っていたりする。ちょっとコンバータ泣かせ。
  • Fire Emblem などは、通常とは異なる方法でのクオンタイズ・ベロシティ指定がある。Lemmingsも同様(規則は異なる)。
  • Marvelous にはADSRを設定するコマンドがあった。
  • 通常、timer0の周期には$10が設定されているが、 Gradius 3 のように$20を設定している場合もある。

Translated:

For expansion, there often can not write very well not look.

  • Super Metroid, Earthbound and has a similar extension of the four commands (Zelda, but also seems to be code, written in the table because it is not useless.)
  • Intelligent Systems is developing the game to have a command or variable length. Converter cry a little.
  • Fire Emblem and the normal velocity has given quantization in different ways. Lemmings similar (different regulations.)
  • Marvelous has had a command to set the ADSR.
  • Hisashi Tooru, timer0 the period has been set to $10, Gradius 3 or $20 if you have set.

Marvelous: Set Instrument with ADSR ($FB)

xx = Voice Number
yy = ADSR(1)
zz = ADSR(2)
  • Overwrites ADSR parameter in instrument table, therefore default ADSR will be changed, perhaps.

テーブルに書かれている楽器xxのADSRを書き換えつつ、音色を設定します。テーブルの内容を書き換えてしまうため、以降の音色指定時のデフォルトADSRも伴って変化すると思われます。

Translated:

Written instrument of ADSR xx table while rewriting, and set the tone. Rewrite the contents of the table because, given the tone of subsequent default is assumed to vary with ADSR too.

Lemmings: Note Parameters ($01-7F)

(When xx <$ 80) xx = Duration Rate. Actual rate seems to be "(byte) ((xx << 1) + (xx >> 1))", weird...
(When yy <$ 80) yy = Velocity Rate. Actual rate = yy << 1.

概念は似ているのですが、クオンタイズとベロシティの情報を別々、直接に設定します。引数の数に違いが生じ得ます。

Translated:

I like the concept, different quantization and velocity information sets directly. Difference in the number of arguments can result.

Fire Emblem: Note Parameters ($01-7F)

(xx < $40 && xx < $80) : lower 6-bits for duration rate (index)
(yy >= $40 && yy < $80) : lower 6-bits for velocity rate (index)

To know how to handle this vcmd more precisely, see nintspc source code.

値が続くとき、$40未満であればクオンタイズを、$40以上であればベロシティを、下位6ビットから設定します。両者を一度に設定することもあります。

では、たとえば $30 $40 $50 と3つ値が続いてしまった場合はどうなるのでしょうか。この答えはちょっと示すのが面倒なので、割愛します。

Translated:

When the last value, the quantization is less than $40, $40 or more, if the velocity, the lower six bits set. You can set both at once.

In, for example, $30 $40 $50 if you've followed the three is what happens. The answer is complicated because of the sorts, beyond the scope.

SMW Specific Notes: http://d.hatena.ne.jp/GOCHA/20070428/smwmusicspec

Translated and expanded upon from http://d.hatena.ne.jp/loveemu/20081208/snes_nintendo_music_spec Some game usage provided by Mattrizzle.