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
; 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
)
- Lower-5bit for pan value (0-20), higher-2bit is used for phase reverse switch.
- Some versions (ie Super Mario World, F-Zero and Super Mario World 2 - Yoshi's Island) treat larger value as left, some versions not (ie Super Mario All-Stars and Kirby Super Star).
音の左右位置を設定します。値の範囲は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)
エコーの詳細を設定します。xx
とyy
はレジスタの値そのまま、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
時間かけて現在の値から指定した値へとフェード。yy
とzz
で左右別々に値を指定。
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.
- Normal, timer0 the period has been set to
- Early titles from Sunsoft, such as Hebeereke's Popoon have new echo commands.
- These commands are
$FC
and$FD
.
- These commands are
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:
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
)
(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
)
(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