N-SPC Player (also referred to as Kankichi-kun by most developers, SQ & DBOOT by some developers and BMus by American developers) 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 and Battletoads 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.

See the Super Mario World Music Format for more information specific to that engine.

Nintendo programmer Y.K. (Yukio Kaneoka) created a N-SPC player "Kankichi-kun" and decided to let the composers to create instrument samples called the "Tako Sample".

Howard Phillips, who was a producer on Nintendo of America created an Americanized N-SPC player called "BMus"(the 'B' possibly standing for "Berlioz"), which was used by American developers. Some time after, another sequencer named "Wolfgang" was developed. It apparently had support for direct SNES playback, like GEMS allowed for the Genesis.

Several N-SPC players, especially those manufactured by Opus will call it "SQ & DBOOT", based on the ROM text header of the game.

N-SPC Games

NOTE: For a more complete list, see its section on GDRI. Also, some of these games may not use the N-SPC at all.

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
Astérix & Obelix
Battle Commander
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 (JPN)
Clock Tower
Cosmo Gang: The Puzzle
Daze Before Christmas
Donald Duck - Mahou no Boushi
Doraemon
Doraemon 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
Ganbare Goemon
Ginga Eiyuu Densetsu
Gradius 3
GunForce
Hashire Hebereke
Hebereke no Popun
Hyper Zone
Inspector Gadget
Joe & Mac
Ka-Blooey
Kiki Kaikai
Kiki Kaikai 3
Kirby Super Star
Kirby's Dream Course
Kirby's Dream Land 3
Kirby's Kira Kira Kids
Last Bible III
Last Fighter Twin
The Lawnmower Man
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
Mr. Nutz
Newman/Haas IndyCar featuring Nigel Mansell
Nigel Mansell's World Championship Racing
Nintendo Campus Challenge 1992
Nintendo PowerFest '94
NFL Football
O-Chan no Oekaki Logic
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
The Ren & Stimpy Show - Fire Dogs
Revolution X
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
Smash Tennis
The Smurfs
SNES Test Program
Snoopy Conecrt
Soul Blazer
Star Fox
Star Fox 2
Stunt Race FX
Sugoi Hebereke
Super Adventure Island
Super Baseball 2020
Super Bases Loaded
Super Bases Loaded 2
Super Game Boy 0x3019A v1.1
Super Famista
Super Famista 2
Super Famista 3
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 Off-Road: The Baja
Super Punch-Out
Super Scope 6
Super Soukoban
Super Tetris 2 + Bombliss
Super Wagan Land
Super Wagan Land 2
Sutte Hakkun
Tadaima Yusya Bosyutyu Okawari
Tecmo Super Bowl
Tenchi Muyo RPG
Tetris & Dr. Mario
Tetris Attack Beta / Old Version (0xDA Instrument Command)
The Smurfs
Tom & Jerry
Top Gear
The Untouchables
Ushio No Tora
Waku Waku Ski Wonder Shoot
Whirlo
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.

Normally, if the number of repetitions is negative, it is goto, but depending on the game, it seems that around $80, $81 is treated specially. I haven't investigated this area yet.

My nintspc outputs these performance control information at the beginning of the html output.

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:

Basically, it has 27 commands of $E0-$FA. The early engines used in Super Mario World & Pilotwings have a few commands, but they do. Others are based on some standard ones with additional commands or further extensions. By the way, some extended commands were variable length.

Whatever you deal with, you just have to know the basic type of configuration. In the rest of this article, I'll explain the basic types of commands and then touch on some examples of extensions.

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 Main Volume [xx]
$E6 Main 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 Main Volume
$E1 Main 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:

It means the end of performance data. If it is called by a subroutine command, it means the end of the subroutine, otherwise it means the end of the block.

When the end of a block is reached, the other blocks stop playing at the same timing and move to the next block (unless specified repeatedly). 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:

The command byte itself represents the length of the note. It is said that 48 is a quarter note, but you don't have to worry too much about it.

If the following byte (let's say $xy) is less than $80, it will be processed as well. Use $x to specify the length of the sound (quantize), and $y to specify the loudness in stages. Look at the table inside to see what ratios are assigned to the numbers (my nintspc automatically searches for the table position).

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 a note with a pitch. Set the length and strength with $01-$7F.

Tie ($C8)

Rest stops sound, Tie keeps.

Rest ($C9)

Rest stops 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. The SRCN and ADSR information that is actually set for the sound source is stored in an internal table, and the index of that table is specified by this command.

If the SRCN information inside the table is more than $80, set the noise flag to the sound source and set the lower 5 bits to that clock (older versions do not have such a function).

Pan ($E1)

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

Translated:

Set the left and right position of the sound. The range of values is as narrow as 0 to 20 (the actual setting ratio is defined in the internal table). Depending on the version, it depends on whether the large value is left or right. The upper 2 bits are used for phase inversion.

Pan Fade ($E2)

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

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

Translated:

The position of the sound fades from the current value to yy over xx time.

Vibrato On ($E3)

xx = Delay
yy = Rate
zz = Depth

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

Translated:

Enables vibrato (pitch fluctuation / pitch swing). Set zz-sized vibrato at yy speed after xx time.

Vibrato Off ($E4)

Disable vibrato. Specifically set the Vibrato Depth to 0.

Main Volume ($E5)

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

Main Volume Fade ($E6)

xx = Length
yy = Destination

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

Translated:

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

Tempo ($E7)

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

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

Translated:

Specifies the playing speed of the song. I'm not sure about the exact correspondence with bpm, but the value of about 24/60 is written.

Tempo Fade ($E8)

xx = Length
yy = Destination

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

Translated:

The playing speed of the song fades from the current value to yy over xx time.

Global Transpose ($E9)

xx = Semitones (Signed)

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

Translated:

Raises the playing pitch of all channels by xx (negative numbers can be specified).

Per-Voice Transpose ($EA)

xx = Semitones (Signed)

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

Translated:

Raises the playing pitch of a single channel by xx (negative numbers can also be specified).

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:

Enable tremolo (volume fluctuation). Set the tremolo of the size of zz to be applied at the speed of yy after xx time.

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:

Fade the channel volume from the current value to yy over xx time.

Call Subroutine ($EF)

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

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

Translated:

The block $yyxx is played zz + 1 times. Subroutines cannot be nested.

Vibrato Fade ($F0)

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

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

Translated:

After temporarily setting the vibrato depth to 0, it will smoothly return to the original value over xx 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:

Specifies that subsequent sounds will be "higher by zz over yy time after xx time." zz is a semitone unit, and you can 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:

Specifies that subsequent notes will be "played at a pitch that is zz higher than normal, and will return to normal pitch over yy time after xx time." zz is a semitone unit, and you can 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:

Change the pitch slightly. Only positive numbers can be specified, so the pitch cannot be lowered.

Echo VBits / Volume ($F5)

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

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

Translated:

Specifies the channel and volume at which echo is enabled. The value set in the register remains 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)

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

Translated:

Set the echo details. xx and yy are the register values, and zz is the type of FIR filter, which is specified in the range of 0 to 3.

Echo Volume Fade ($F8)

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

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

Translated:

The volume of the echo fades from the current value to the specified value over xx time. Specify the values separately for left and right with yy and zz.

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:

Smoothly changes the pitch of the sound being pronounced. After xx time from play, it will be changed to the zz pitch (absolute designation) over yy time. If you want to raise or lower the sound in the middle of one note, write this command continuously. If the pronunciation time is long, you can write it with Thai.

Normally, after one Note, it waits for the length of the note and then processes the next byte, but only this command is read and processed immediately. Due to its special handling, this command is completely processed outside the processing table in Super Mario World.

Percussion Patch Base ($FA)

xx = Instrument Number

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

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

Translated:

Determines the correspondence between the percussion value and the sound you hear.

About Extended Versions

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

  • Super Metroid, Earthbound 等は同種の拡張コマンド4つを持っている(Zelda にもコードはあるようだが、テーブルに書かれていないため使えない)。
  • Intelligent Systems開発のゲームは可変長のコマンドを持っていたりする。ちょっとコンバータ泣かせ。
  • Fire Emblem などは、通常とは異なる方法でのクオンタイズ・ベロシティ指定がある。
  • Lemmings も同様(規則は異なる)。
  • Marvelous にはADSRを設定するコマンドがあった。
  • Gradius 3のようなコナミの初期のタイトルは、若干改変されたこのサウンドエンジンが用いられている。
  • Hebeereke's Popoonのようなサンソフトの初期のタイトルは、新着エコーコマンドがあった。

Translated:

As for expansion, I can't write much because I haven't researched much.

  • Super Metroid, Earthbound seem to share code with (Zelda, which has four similar extension commands, but it can't be used because it's not written in the table.
  • Games developed by Intelligent Systems may have variable length commands. Makes the converter cry a little. 😢
  • Fire Emblem and others have unusual quantize velocity designations.
  • Lemmings similar to Fire Emblem (different regulations.)
  • Marvelous has a command to set the ADSR.
  • Early titles from Konami, such as Gradius 3, use this slightly modified sound engine.
    • Normal, timer0 the period has been set to $10, Gradius 3 or $20 if you have set.
  • Early titles from Sunsoft, such as Hebeereke's Popoon have new echo commands.
    • These commands are $FCand $FD.

Marvelous: Set Instrument with ADSR ($FB)

Marvelous

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:

Set the tone while rewriting the ADSR of the instrument xx written on the table. Since the contents of the table will be rewritten, it is expected that the default ADSR when specifying the tone color will change.

Lemmings: Note Parameters ($01-7F)

Lemmings

(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:

The concepts are similar, but the quantize and velocity information is set separately and directly. There can be differences in the number of arguments.

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

Fire Emblem

(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 value continues, it sets the quantize if it is less than $40 and the velocity if it is more than $40 from the lower 6 bits. You may want to set both at once.

But what if, for example, $30 $40 $50 and three values follow? This answer is a bit cumbersome to give, so I'll omit it.

Translated and expanded upon from LoveEMU, previously: http://d.hatena.ne.jp/loveemu/20081208/snes_nintendo_music_spec

Some game usage provided by Mattrizzle.

Sunsoft games

(Not present on Benkei Gaiden - Suna no Shou and Xak: The Art of Visual Stage)

$FB enables echo for a channel.
$FC disables echo for a channel.
$FD sets up ADSR.
$FE is a dummy read, having been moved from VCMD $FB.

Albert Odyssey 2 and Hissatsu Pachinko Collection 4 have a different function for VCMD $FE. Namely, it appears to be a de-facto global song volume VCMD (on top of the classic Main Volume VCMD already in use).

Info provided by KungFuFurby.

Metal Combat: Falcon's Revenge

Note Parameters ($01-7F) First byte is the length of a quarter note, like normal. It is followed by an optional Velocity if the next byte is between $40 and $7f, or by an optional Duration value if the value is between $00 and $3f. The optional Duration byte can also be followed by an optional Velocity value if the following byte is between $00 and $7f.

Percussion ($CA-$D5)

Change Instrument ($D6) Followed by one byte, which specifies the instrument to use for this channel. This value does not use the Load Instruments table below.

Tempo ($DD) Followed by one byte.

Call Subroutine ($E5) Followed by 2 byte address of first event of subroutine, and 1 byte repeat count.

Load Instruments ($FA) Followed by 1 byte instrument count, and 4 bytes per instrument.

Find Instrument ($FB) Followed by 1 byte index into instrument list previously loaded by ($FA).

The remaining events are currently unknown, but have the following number of additional bytes:

  • 0 bytes: $DA, $E2, $E9, $EC, $F1-F4
  • 1 byte: $D7, $DB, $DF, $E0, $E3, $E6, $EA, $F0, $F5-F8
  • 2 bytes: $D8, $DC, $DE, $E4, $FC, $FD
  • 3 bytes: $D9, $E1, $E7, $E8, $EB, $ED, $EE, $EF

Vortex

The initial block of data loaded to the APU (code, tables, instruments, samples, etc.) is uncompressed, and loaded normally using the built-in loader routine on the SPC firmware. However, all of the songs in the game are stored on the rom in compressed format, and must first be decompressed using routines that are executed on the SuperFX chip. (The decompression routine is identical to the one used by Star Fox to decompress background images and tiles). The decompressed song data is stored in shared RAM by the decompression routine, and then the CPU copies this data from RAM to the APU using a custom loader. (The custom loader is similar to the built in loader routine, except that it does not jump to the final address sent by the CPU. Instead, it copies this address to internal RAM as a pointer to the beginning of the loaded song.)

The decompressed song data appears to have a similar layout (song, sequence, channel, subroutine, etc.) as other N-SPC formats, but uses a custom set of VCMDs.

  • $00 Stop
  • $01-7F Parameters: 1 byte standard parameter layout with optional second byte for duration and velocity.
  • $80-BF Note
  • $C8 Tie
  • $C9 Rest
  • $CE Instrument: 1 byte
  • $D5 Tempo: 1 byte
  • $D8 Transpose: 1 byte (signed) channel transpose
  • $DB Volume: 1 byte
  • $DD Call Subroutine: Followed by 2 byte address of first event of subroutine, and 1 byte repeat count.
  • $DF Pitch Slide From: 3 bytes, see above.
  • $E0 Pitch Slide To: 3 bytes, see above.
  • $E1 Pitch Slide Off

The remaining events are currently unknown, but have the following number of additional bytes:

  • 0 bytes: $C5, $D2, $E4, $EA-EC, $F0
  • 1 byte: $C0, $CF, $D3, $D7, $D9, $DA, $DE, $E2, $E8, $E9, $ED-EF
  • 2 bytes: $D0, $D4, $D6, $DC
  • 3 bytes: $D1, $E3, $E5-E7