qSPC

トップ | MMLリファレンス
v2.3.2 ダウンロード(Win32) Source code on GitHub

2020-05-18 更新 Ver 2.3.2(Public 1)
実行ファイルはリビルド後にWindows Defenderでチェックしています。

概要

スーパーファミコンの音源(SPC700/S-DSP)用のMMLコンパイラ・ドライバです。まだ低機能ですが、他のソフトを組み合わせるなどの複雑な作業が不要で、SPCファイルおよびROMイメージを簡単に出力できます。また、独自のドライバを使用しているので、市販のゲームをハックしたSPCと違い安心して商用利用が可能です。

ライセンスはMMLコンパイラがGPL、ドライバとプレイヤーROMが2条項BSDになっています。

MMLコンパイラの利用方法

もっとも単純な使い方は以下のような形です。ROMイメージ(.smc)とSPCファイル(.spc)が出力されます。qspcc.exeにパスを通しておいて、MMLを別のフォルダに置き、そこをカレントにして作業することをお勧めします。

qspcc mymusic.mml

4曲までまとめてコンパイルし、1つのROMに収録しアルバムを作成することができます。この場合でもSPCファイルは曲の数だけ個別に出力されます。

qspcc mymusic1.mml mymusic2.mml mymusic3.mml mymusic4.mml

ROMのみ、SPCのみ出力したい場合はそれぞれ -rom および -spc オプションを指定します。

qspcc -rom mymusic.mml
qspcc -spc mymusic.mml

全ての曲が同じ音色セットを共有している場合に限り、-q でクイックロードモードを指定できます。2回目以降の演奏でシーケンスのみを転送するため、プレイヤー上で曲の切り替えが速くなります。SPCファイルには影響ありません。
本来は、ゲームにドライバを組み込む時のための機能です。

qspcc -q mymusic1.mml mymusic2.mml mymusic3.mml mymusic4.mml

qSPCにはサウンドドライバとプレイヤーROMのソースコードが付属しています。MMLコンパイラはデータ配置の情報を毎回これらのソースコードから取得しており、つまりソースコードが設定ファイルを兼ねています。これらのファイルやフォルダを移動・削除しないでください。

効果音の埋め込み

-eオプションを指定すると、最初のMMLをBGM用として、2番目以降を効果音として埋め込むことができます。1トラックごとに1つの効果音で、15個(0番~14番)まで埋め込み可能です。(実際には、埋め込むこと自体は16個以上でもできますがドライバに番号を指示できません)
効果音も@命令で音色を切り替えられますが、音色セットはBGMと同じものを使用する必要があります。

qspcc -e bgm.mml effects.mml

暫定仕様(変わるかもしれません)
効果音のテンポはドライバ中でT=192で固定になっています(用途を考え少し早めに設定してあります)
現在のドライバはチャンネル6/7(0から開始なので7/8番目)を使用して効果音を再生します。

出力ファイルの利用方法

SPCファイル(*.spc)は、スーパーファミコン用ソフトの音楽を単体で抜き出すためのファイル形式です。kbMedia Playerなどで再生可能です。

ROMイメージ(*.smc)は、スーパーファミコンのエミュレータまたは実機で実行できる形式です。下の画像のような、選曲機能付きのプレイヤーが自動的に埋め込まれます。
screenshot
効果音を埋め込んでいる場合は0番と1番をそれぞれL、Rボタンでテストできます。

固定ポイント付きデータの作成方法

クイックロードでは古いBRRデータを残したままスコアデータ部のみを転送することでロード時間を短縮しますが、転送範囲をBRR領域の一部まで拡大することで、ロード時間を抑えながら、各曲で固有の音色を使うことができます。ただし、通常のクイックロードよりは多少時間がかかるようになります。

BRRの部分転送を実現するためには、BRRデータを各曲で入れ替える部分と全曲共通の部分に分ける必要があります。また、全曲共通の部分については、各曲の間で開始位置を揃えておく必要があります。この、共通部分の開始位置を固定ポイント(fix point)と呼びます。

固定ポイントに対応したデータの作成方法は以下の通りです。

  1. 音色定義のうち、共通部分で最初のBRRを使う音色に「fix」という項目を加え、BRR領域先頭からのオフセットを記述します。
  2. 入れ替え用BRRを使う音色は「fix」を記述した音色より前に記述し、BRRの合計サイズが固定ポイントを超えないようにします。
  3. 以上の記述を、全ての音色セットのmanifest.jsonで行います。固定ポイントは同じ値にしておく必要があります。
  4. MMLを記述します。通常のクイックロードでは全曲同じ音色セットを指定する必要がありましたが、固定ポイントを設定した場合は、それらの中から自由に指定できます。
  5. -q オプションを付けてコンパイルします。全曲同じ音色セットの場合は通常のクイックロード、違う場合は固定ポイント対応に切り替わります。

以下の例ではBRR領域の先頭から9216バイト目を固定ポイントとしています。

{
	"base-frequency": 500,
	"origin-octave": 0,

	"1": {
		"brr": "01-pipes.brr",
		"adsr": [15, 3, 6, 14]
	},

	"2": {
		"brr": "02-steelpan.brr",
		"adsr": [15, 4, 7, 18]
	},
 ↑ここまでのBRRサイズが固定ポイント(9216Bytes)を超えてはいけません↑
	"3": {
		"fix": 9216, ←固定ポイント
		"brr": "03-pad.brr",
		"adsr": [13, 7, 5, 12]
	},

	"4": {
		"brr": "04-kick.brr",
		"adsr": [15, 7, 7, 10]
	},
:
:

Instruments(音色セット)の作成方法

BRR形式のサンプリングデータ(一式)とmanifest.jsonというJSON形式の設定ファイルをフォルダに格納し、このフォルダをひとつの音色セットとします。MMLの中ではフォルダ名を指定します。
サンプリングデータのBRRファイルは、C700から出力したものを推奨します。BRRのファイル形式は規格化されていないので、他のツールから出力したものが使えるとは限りません。

以下にmanifest.jsonのサンプルを示します。

{
	"base-frequency": 500, ←サンプリングデータの元の周波数
	"origin-octave": 0, ←周波数テーブルの最低オクターブ

	"0": { ←MML中の@命令で指定するインデックス
		"brr": "00-pizzicato.brr", ←BRRファイルの名前
		"adsr": [15, 7, 7, 15] ←ADSR
	},

	"1": {
		"brr": "01-strings.brr",
		"adsr": [12, 7, 7, 4]
	}
}

※JSONの仕様上、整数のインデックスもダブルクオートで括る(文字列扱いにする)必要があります。注意してください。値の方には必要ありません。

「周波数テーブルの最低オクターブ」には、周波数テーブルをどのオクターブから作成するか指定します。0を指定するとA0=27.5Hz、1を指定するとA0=55Hzとなります。(ある楽器だけ高い音域を出したい、等の場合はサンプリングデータ側で対応してください)
ADSRは[Attack time, Decay time, Sustain level, Release time]の順です。
ADSRの指定値はSPC700が内部に持っているテーブルのエントリを指定します。実際の値との対応は下の表を参照してください。

指定する値→ 0 1 2 3 4 5 6 7 8 91011 12131415 16171819 20212223 24252627 28293031
Attack(ms) 4,100 2,500 1,500 1,000 640 380 260 160 96 64 40 24 16 10 6 0 エラー
Decay(ms) 1,200 740 440 290 180 110 74 37 エラー
Sustain lv. 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8 エラー
Release (ms) 38,000 28,000 24,000 19,000 14,000 12,000 9,400 7,100 5,900 4,700 3,500 2,900 2,400 1,800 1,500 1,200 880 750 590 440 370 290 220 180 150 110 92 74 55 37 18