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
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
Clock Tower
Daze Before Christmas
Donald Duck - Mahou no Boushi
Doreamon 2
Doukyuusei 2
Dragon Ball Z - RPG
Dragon Ball Z - Super Butouden
Dragon Ball Z - Super Butouden 2
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
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
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)



; 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...


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



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 に使われている初期のエンジンは少しコマンドが少ないですが、内容は対応します。その他、いくらか標準のものをベースにコマンド追加、あるいはそれ以上の拡張をしているものがあります。ちなみに、拡張コマンドの中には可変長のものもありました。



$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.




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)

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.




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



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.




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)



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?)



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

Vibrato On ($E3)

xx = Delay
yy = Rate
zz = Depth



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



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)



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



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

Global Transpose ($E9)

xx = Semitones (Signed)



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

Per-Voice Transpose ($EA)

xx = Semitones (Signed)



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.



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)



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



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

Vibrato Fade ($F0)

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



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.



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.



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.



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))



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)



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




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.



Determine the value of the percussion sound to respond.

About Extended Versions


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


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.
  • Normal, 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.



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.



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.


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


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 LoveEMU, previously: http://d.hatena.ne.jp/loveemu/20081208/snes_nintendo_music_spec Some game usage provided by Mattrizzle.