SPC

「SPC」の編集履歴(バックアップ)一覧に戻る

SPC - (2017/11/22 (水) 11:11:48) のソース

#contents

*概要
SPCは他の様々な音源エミュレーション関連音楽ファイル(Rip、ログ等)とは異なる独特の概念で成り立っています。これはSPC700と呼ばれる、SFC/SNESの音源部の作りに由来します。
SPC700はPSG、OPM/OPN/OPL等のFM音源、MSM6295等のPCM音源のような単なる「音源」(SPC700の場合は同時発音数8音のPCM音源)に加えて、音源をコントロールするCPU(シーケンサ)と専用のメモリを一纏めにしたようなチップです。このメモリに音源ドライバ(プログラム)、曲データ、波形データ(楽器音、効果音等)の一切が置かれ、SPC700内部で完結した形でサウンド処理が行われます。
このSPC700の持つメモリをファイルに書き出したものがSPCファイルの実体です。

SPC700はSFC/SNESのメインCPUである65816から上で挙げたようなものを事前に渡され、その後は曲の演奏開始や効果音の発音を命令されることによって音を鳴らしますが、中には演奏がSPC700だけで完結せず、演奏中に65816とのやりとりが必要になるケースがあります(ゲームに合わせた動的な楽曲の進行、テンポが65816側からコントロールされるケース、波形データの随時書き換えによる擬似的な大容量化(あるいはストリーム的な演奏)等)。このようなケースに対応すべく拡張規格として策定されたのがScript700です。

黒羽製作所の[[特殊なSPCについて>http://www.kurohane.net/spc/]]も参照のこと
ちょっと情報が古いですが[[SPC'z PAGE>http://skoi.web.fc2.com/music/spc/]]などもどうぞ。

*作成
SPC作成手順は「録音」に似て、特に難しい事はありません。曲が演奏開始される瞬間/直前にSPCを書き出す(手動で行う)のが一般的です。
作成自体は実行から即時に完了し、「演奏時間ぶん待つ」必要もありません。

自作SPC関係は[[【XMSNES】スーパーファミコン音源で音楽データ制作【SPC】>http://anago.2ch.net/test/read.cgi/dtm/1183196236/]]あたりに詳細あり

**用意するもの
・SNESエミュレータ(Snes9x、Zsnesなど。おすすめは[[snes9x-rr>http://code.google.com/p/snes9x-rr/]]や[[bsnes-plus>https://project.satellaview.org/downloads.htm]] [[最新ベータ>http://www.emucr.com/search/label/bsnes-plus?&max-results=12]])
・ROMファイル
・ID666タグ編集ツール(ID6666、KBM付属STEなど)

**作成手順例
Snes9xpp
・エミュ起動、ROM読込み、メニューからファイル→SPC吸出し

ZSNESW
・エミュ起動、ROM読込み、F1でメニュー呼び出し→SAVE SPC DATA

bsnes-plus
・エミュ起動、ROM読込み、メニューのTool→Capture SPC Dump (ショートカット設定可能)

・作成したSPCファイルの曲名、演奏時間をタグ編集ツールで設定。

**注意点
タイトルによっては曲の頭が切れ易いので、ステートセーブや、エミュのPAUSE機能を使ってうまく録音しましょう。
snes9x-rrだとフレームアドバンス機能やオーチサーチ機能、bsnes-plusならデバッグツールも完備

**Script700
上記のとおり、一部特殊なSPCにはScript700を使わないと演奏できないものもあります。
また、強制的に効果音が被ってしまうSPCなどはパートマスクする事で効果音のみ消したりも出来ます。
ただパートマスク程度であれば逆アセンブラやデバッガでサウンド番号切り替えルーチン等を調べ
該当データを書き換えて除去したいサウンドを元から鳴らさないようにしたほうが良いと思われます。

*再生
基本的に左メニューにある各プレイヤーに対応プラグインが用意されています。
そのほか[[黒猫SPC>http://kurohane.net/seisanbutu.html]]、[[SNES SPC700 Player>https://dgrfactory.jp/spcplay/index.html]]などがあります。
[[SPCTool>https://www.smwcentral.net/?p=section&a=details&id=4600]]やSNES SPC700 Player+[[spcmem>https://github.com/gocha/spcmem/]]などでメモリビューアなども可能です。

*SPCタグの仕様
[[SPC Format>http://www.alpha-ii.com/Info/SPCFormat.txt]]を参照。

**XID6で1/1000単位の再生時間を書き込む
これをやらないと2ループ目以降の終わり際に
1秒前後フェード開始位置がズレてしまうのでなるべく書き込むことをお勧めします。

現状1/1000書き込み対応ツールは(おそらく)前述の「SPCTool」しかない。
それ以外ではバイナリエディタで16進数による直接編集が必要。
以下直接編集の解説。

ファイル末尾の
-イントロ
--30 04 04 00
-ループ
--31 04 04 00
-終了
--32 04 04 00
-フェード
--33 04 04 00
-ループ回数
--35 00
と続く部分からの4byte(ループのみ1byte)が各項目に対応。
書き込んでいない項目の場合は存在しないので先に黒猫SPC等で書き込むか自分で項目を伸ばす必要がある。

バイナリデータはリトルエンディアンで読み込まれる。
秒数は1byteごとに
-1byte目 (かける単位はサンプル数、64で0.001秒)
 x1h = * 1
  x8h = 0.0005?
 1xh = * 16
  4xh = 0.001、8xh = 0.002、Cxh = 0.003
-2byte目 (以降かける単位はすべて0.001秒 = サンプル数)
 x1h = * 4 = 256
 1xh = * 64 = 4096
-3byte目
 x1h = * 1024 = 65536
 1xh = * 16384 = 1048576
-4byte目
 x1h = * 65536 = 4194304 (4:22.144)
 1xh = * 1048576 = 67108864 (69:54.304)
と計算される。
例えば「1時間23分45秒678」と書き込みたい場合は
「80 13 24 13」となる。

黒猫SPCなどで秒の桁までを書き込んだ場合は値が再計算され別の値になる可能性がある。また小数点以下は消されてしまうので注意。

目的の時間通りに書き込んだかは
XID6タグに対応した以降のプラグインバージョンの[[KbMedia Player]]を使って「ドキュメント」タブに表示されるほうで確認する。

**再生時間の計測方法
時間計測は主にUploaderにあるUgetab氏作成の「SPC_Timer_Ugetab_Update」を使用。パスはspc。

ただ、このツールでも正確に測れないこともある。
この場合
-曲をwavファイル出力して[[SoundEngine Free>http://soundengine.jp/software/soundengine/]]などの編集ソフトで波形を比較
-経過フレーム数が表示可能なエミュレータ&br()(BizHawk、lsnes、上記のsnes9x-rrなど)&br()を使用し実際に目的の曲を再生し&br()フレームアドバンスなどを駆使しながらフレーム数を計算
などで計測する必要がある。
フレーム数からの秒数換算は[[こちら>http://nekomimya.blog28.fc2.com/blog-entry-470.html]]を使用する。