ゆとりがNSDを組み込んだNESファイルを作る

ゆとりがNSDを組み込んだNESファイルを作ります。作るだけ(コンパイルするだけ)です。

最近突然キャラソンの多いジャンルにハマり、突然耳コピ欲が湧いてきたが、音感がゴミクソで普通の耳コピだと微妙なのでファミコンアレンジやFM音源(OPN)アレンジでお茶を濁しているという、打ち込みテクニック至上主義でアニソンのファミコンアレンジするゆとり死すべきと主張するおじさんらに卑下の目で見られそうなゆとりです。

(とはいってもほぼ公開はしてない)

 

その際、紆余曲折(*1)あってファミコン音源ドライバをppmckからNSDに乗り換えたのですが、実際にファミコンのプログラムとして組み込むことができるそうなので、思いつきでやってみようと思ったゆとりです。

(*1)マクロ定義できるバージョンが見つからない

あせん…ぶら?しー?ってレヴェルのド底辺ソースコピペマンITドカタは、ド底辺ITドカタの意地を見せられるのか!?

やってみる(準備)

テレレッテッテッテテ テレレッテッテッテテ テレレーレーレーレーレーレーテッテッテッ

顰蹙3分クッキング

用意すべき材料はこちら

めいく…こまんど…?

makeコマンドすら知らないド底辺ですがとりあえずこれ(https://trap.jp/post/32/)を参考にCygwinをインストールします。

NSDとcc65は適当な場所(日本語の入ってないパス)に置いときます。ド底辺は後で中身をめちゃくちゃにするので編集用と保存用に分けとくといいかもしれません。

 

コンパイルする

アセンブリバージョンを使うので正しくはアセンブルかもしれません。

まずはNSDの「sample\ca65」フォルダ内のソースをコンパイルすることを目指します。

Cygwinはよくわからないが、とりあえず起動するとコンソールっぽい画面が出るので「sample\ca65」フォルダまでcdコマンドで移動します。cdコマンドは使えるんですね。

そこまできたら「make」と打ち込んでエンターを押します。

勝手に「makefile」の内容を実行するようです。(実はcc65の方で少し試してからやっている)

当然そのままだと文句を言われます。理論に基づかないド底辺ITドカタの野性的勘でなんとか解決していきます。

 

エラーその1

make: *** ターゲットが指定されておらず, makefile も見つかりません. 中止.

うるせーあんだろうがよ「MAKEFILE」が!!

しかし「MAKEFILE」であって「makefile」ではないから怒られるようです。理不尽さに打ちひしがれながら「MAKEFILE」ファイルを「makefile」ファイルにリネームします。

 

エラーその2

[Assemble] : crt0.s
/bin/sh: ca65: コマンドが見つかりません

なんとかmakeコマンド自体は通るようになったようです。エラーが「errlog.txt」に吐き出されるようになりました。上記はその「errlog.txt」の内容です。

ca65はアセンブラのことなので、「ca65.exe」のある場所にパスを通してみます。ぷろぐらみんぐをべんきょうしよう!ってなったとき位の、コンパイラの場所を環境変数Pathに登録するあれです。

 

エラーその3

[Assemble] : crt0.s
[Assemble] : main.s
[Compile] : testmus.mml
/bin/sh: nsc: コマンドが見つかりません

一難去ってまた一難

nscはmmlの方のコンパイラなのでエラーその2と同様に「nsc.exe」の場所にパスを通します。

はい次…

 

エラーその4

[Assemble] : crt0.s
[Assemble] : main.s
[Assemble] : testmus.s
[Link] : test.nes
ld65.exe: Error: Input file `….lib\nsd.lib’ not found

はいはい…フーン…なるほどね…(分かってない)

「nsd.lib」が見つからないと言われてるようです。

ここで唐突にさっきのCygwinのインストールのページを引き合いに出すのですが、そのページによるとmakefileの中のパスを「\」ではなく「/」で書くと記述されています。

そこでmakefileをテキストエディタで開き以下のように書き換えてみます。

#=============================================================================
# NES Sound Driver Libraly
# Make file
# A.Waranabe (S.W.)
#=============================================================================

TOOL_PASS =
INC_PASS = ..\..\include\\
LIB_PASS = ..\..\lib\\

#=============================================================================
# NES Sound Driver Libraly
# Make file
# A.Waranabe (S.W.)
#=============================================================================

TOOL_PASS =
INC_PASS = ../../include\\
LIB_PASS = ../../lib\\

この状態でmakeしてみると…

やった!とうとうnesファイルができたぞ!!

喜び勇んでエミュレータにnesファイルを放り込むと「ド~レ~ミ~ファ~ソ~ラ~シ~ド~~~~~~~」と音が鳴ります。

 

どうせなら曲を差し替えたい

これでは流石に味気ないのでどうせなら曲くらいは差し替えてみましょう。

ここまで曲データに関してはなんの説明もしてないのですが(他のデータについても何も言及してないが)、「testmus.mml」というファイルが曲が記述されているファイルの大元です。

ファミコンプログラムのコンパイル云々より、そもそもファミコン用の曲を作るというのが目的なので、そっちの方は多少理解がありますが詳しい説明は割愛します。(ちなみに、わざわざこんなことをしなくてもNSDで曲データ自体を作ってファミコン音楽用のプレーヤーで聴くことができる)

testmus.mmlの中を好きな曲に書き換えます。これはもうMML記述の問題なので割愛です。

元々の「testmus.mml」が以下。

#title “Test”

#Label “_Test_” //C言語から extern 宣言するので、シンボル先頭には’_’を付ける。

#Segment “MUSDATA”

#bgm 1

#offsetPCM $C000 //⊿PCMの配置アドレス。ld65.exeのコンフィグで設定したアドレスと合わせる。

DPCM{
b1, “../dmc/bd.dmc”,14,0,64
c2, “../dmc/bd.dmc”,15,0,64
d2, “../dmc/sd.dmc”,15,0,64
e2, “../dmc/sd.dmc”,14,0,64

f2, “../dmc/tom.dmc”,10,0,64
g2, “../dmc/tom.dmc”,11,0,64
a2, “../dmc/tom.dmc”,12,0,64
b2, “../dmc/tom.dmc”,13,0,64
c3, “../dmc/tom.dmc”,14,0,64
d3, “../dmc/tom.dmc”,15,0,64
}

Envelop( 0){15 L 12 R 10 8 7 6 D0 5 D1 4 D2 3 D3 L 2 }

Envelop(100){ 0 D36 L 1 2 3 2 1 0 -1 -2 -3 -2 -1 }

Envelop(300){ 3 2 L 0 }

Sub(0){ l4o4u8. E@300 Em100 Ev0 cdefgab > c1,2. }

BGM(0){
TR1 v12 S0
TR2 v8 r-8. S0
TR5 o2l16 [2 c8f+f+ d8f+f+ c8f+f+ d8f+f+ ] `c+1
}

サンプルのくせに何デルタピーシーエムなんか使ってんだよ!!

と思ってその部分を消すとまた怒られるので、とりあえず渋々それを残しつつステキな曲のしょっぱい耳コピに変えてしまいます。

はい。

#title “Test”

#Label “_Test_” //C言語から extern 宣言するので、シンボル先頭には’_’を付ける。

#Segment “MUSDATA”

#bgm 1

#offsetPCM $C000 //⊿PCMの配置アドレス。ld65.exeのコンフィグで設定したアドレスと合わせる。

DPCM{
b1, “../dmc/bd.dmc”,14,0,64
c2, “../dmc/bd.dmc”,15,0,64
d2, “../dmc/sd.dmc”,15,0,64
e2, “../dmc/sd.dmc”,14,0,64

f2, “../dmc/tom.dmc”,10,0,64
g2, “../dmc/tom.dmc”,11,0,64
a2, “../dmc/tom.dmc”,12,0,64
b2, “../dmc/tom.dmc”,13,0,64
c3, “../dmc/tom.dmc”,14,0,64
d3, “../dmc/tom.dmc”,15,0,64
}

//————————————–
// エンベロープ定義
//————————————–
#OffsetEv 0
#OffsetEm 10000
#OffsetEn 20000
#OffsetE@ 30000

// TODO: ここにエンベロープを記述してください。

//音量エンベロープ
E( 0){ 8 10 13 15 L 12 R 10 8 7 6 D0 5 D1 4 D2 3 D3 L 2 } //デフォルト
E( 1){ 15 15 14 13 12 11 9 7 6 L 5 R 5 D1 4 D2 3 D3 L 2 } //Piano Type
E( 2){ 13 12 11 10 8 6 4 2 1 L 8 7 6 4 2 0 } //エコー
E( 3){ 4 6 8 10 12 11 10 L 8 R 8 7 6 D0 5 D1 4 D2 3 D3 L 2 } //小さめ
E( 8){ 6 8 9 10 13 15 L 12 R 10 8 7 6 D0 5 D1 4 D2 3 D3 L 2 } //柳生比呂士

E( 100){ 15 13 12 9 7 6 5 4 3 2 1 1 L 0 } //Snare Drum
E( 101){ 12 10 8 6 3 L 0 } //Hi-Hat close
E( 102){ 15 12 10 8 6 4 L 0} //Hi-Hat open
E( 103){ 10 11 12 13 14 (15,0,255) L 0 } //Cymbal

E( 104){ (2,15,200) } //ゴゴゴゴゴ
E( 105){ 15 10 5 1 L 0} //バスドラム

//音程エンベロープ
E(10000){ 0 D15 L 1 2 3 2 1 0 -1 -2 -3 -2 -1 } //LFO
E(10001){-5-4 -3 -2 -1 0 D10 L 0 0 -1 -1 -2 -3 -3 -2 -1 -1 0 0 1 1 2 3 3 2 1 1 } //デフォルト

E(10003){-5-4 -3 -2 -1 0 1 D3 (0,-10,20) L -10 } //下がるやつ
E(10008){-5-4 -3 -2 -1 0 1 D15 1 D2 0 D2 -1 D2 -2 D2 -3 D2 -2 -1 L -1 -1 -2 -2 -1 -1 0 0 1 1 2 2 0 0} //柳生比呂士

//音色エンベロープ
E(30000){ 3 2 L 0 }

$yagyu { Em8 Ev8 D-1 @2 }
$nioh { Em1 Ev0 D1 @1 }

//————————————–
// 太鼓定義
//————————————–
$bd {Ev105 @1 o5d16} //バスドラム
$sd {Ev100 @0 o5f16} //スネアドラム
$hc {Ev101 @1 o6d-16} //ハイハットクローズ
$ho {Ev102 @0 o5b16} //ハイハットオープン

$gogogo { o5 @1 Ev104 d } //ドコドコドコ

//————————————–
// 共通サブルーチン定義
//————————————–
//サブルーチンを定義します。
//サブルーチンを使用しない場合は、削除して構いません。

// TODO: ここに4分音符の分割数を記述してください。
// 設定値は、サブルーチンを呼ぶBGM側の数値と合わせてください。

//————————————–
// BGM No.0
//————————————–

// TODO: ここに4分音符の分割数を記述してください。
// 何度でも記述可能で、BGM毎に設定できます。
#timebase 24

//BGMの記述ブロックです。
BGM(0){

 

・・・・・(以下略)

「DPCM{}」の後すべてお好きな曲データで書き換えます。

NSDのMML書くのもこれが初めてなのでテンプレートがほぼ残ってます。ハズカピィ

そしてワクワクしながら「make」すると…

・・・

「ド~レ~ミ~ファ~ソ~ラ~シ~ド~~~~~~~」

・・・

なんでやねん!!

結論から言うとmakeする際にmmlのコンパイルはしてくれないようです。(nscコマンドがありませんとか文句言ってくるからてっきりしてくれるのかと思った)

もう面倒くさいので同じフォルダにnsc.exeとbinを全部持ってきて(脳筋)今度はコマンドプロンプトからmmlのコンパイルをします。アセンブリ用のコンパイルは「-a」オプションをつけて行います。(ca65フォルダでコマンドプロンプトを開いて「nsc -a testmus(mmlファイル名)」)

そうすると「testmus.s」ファイルができます。これが実際にnesファイルに組み込まれる曲データになります。

そこからさらにまたmakeしてできたnesファイルをエミュレータにぶちこむと…

・・・

「なみのし~ぶき~ひ~か~って~ うみか~ぜ~が~まだ~」

・・・

おお…!自分で作った曲データがnesファイルに組み込まれている…!

 

 

 

…はい。本当にそれだけです。

本当は画面とかつけてみたかったんですが、それはまた別のアレなんでもうギブアップです。

ちょっと試しましたがド底辺ITドカタの非理論的野性的勘がこいつはもう無理そうだと告げています。

もしかしたらやるかもしれませんが、まあ・・・無理だと思います・・・。

誰か・・・後を・・・たの・・・む・・・・・・・・

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です