ファミコン三角波
ファミコン三角波について調べてみました。
普通のシンセサイザーが出す三角波はこんな波形です。

ところがファミコンの音源は解像度が荒いので、これに16段階のギザギザがつきます。
ファミコンの絵がカクカクしたドット絵なのと一緒ですね。
これが、ファミコンサウンド独特の“味”になっています。
と、ここまでは知ってたんですが…。
普通のシンセサイザーが出す三角波はこんな波形です。

ところがファミコンの音源は解像度が荒いので、これに16段階のギザギザがつきます。
ファミコンの絵がカクカクしたドット絵なのと一緒ですね。
これが、ファミコンサウンド独特の“味”になっています。
と、ここまでは知ってたんですが…。
16段階って言われても、波形の上半分だけで16段階なのか、全体で16段階なのかが分かりません。
調査のために KbMediaPlayer で再生した nsfファイルの波形を見てみました。

おお。全体で16段階ですね。
一応、VirtuaNES で再生した場合も見ておきましょう。

なんだこれ。
とりあえず全体で16段階ということは分かったんですが、実機も無いのでどっちの波形が正しいのかよくわかりません。
まあ後者が正しいと言われても困るのですが…。
困って更に調べてたらこんなページが見つかりました。
めちゃめちゃ詳しい!
これによると pAPU(ファミコンの音源)は
F E D C B A 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 A B C D E F
という波形を出力するそうです。
0とFのところでは同じ高さの波が連続する特徴があるみたいですね。
よく見たらKbMediaPlayerの波形もそうなってます。一応 VirtuaNESのほうもそんな雰囲気は感じますね…。
どうやらKbMediaPlayerの波形を信じてよさそうです。
FlMMLの更新はファミコンノイズも付けてからにしようと思うので少々お待ちくださいませ。
(指摘されているバグも直したい・・・)
調査のために KbMediaPlayer で再生した nsfファイルの波形を見てみました。

おお。全体で16段階ですね。
一応、VirtuaNES で再生した場合も見ておきましょう。

なんだこれ。
とりあえず全体で16段階ということは分かったんですが、実機も無いのでどっちの波形が正しいのかよくわかりません。
まあ後者が正しいと言われても困るのですが…。
困って更に調べてたらこんなページが見つかりました。
めちゃめちゃ詳しい!
これによると pAPU(ファミコンの音源)は
F E D C B A 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 A B C D E F
という波形を出力するそうです。
0とFのところでは同じ高さの波が連続する特徴があるみたいですね。
よく見たらKbMediaPlayerの波形もそうなってます。一応 VirtuaNESのほうもそんな雰囲気は感じますね…。
どうやらKbMediaPlayerの波形を信じてよさそうです。
FlMMLの更新はファミコンノイズも付けてからにしようと思うので少々お待ちくださいませ。
(指摘されているバグも直したい・・・)


VirtuaNESの波形は、DCオフセットフィルタが効いているからひずんでいるだけで、やってることは同じです。
ちなみに、ファミコンの短周期ノイズは、長周期ノイズを鳴らすたびに音が変わってくる仕様です。
波形をテーブルに入れただけでは駄目だったりするので、ファミコンの短周期ノイズを実装する場合は注意です。
GBノイズは常に同じ音ですが。
投稿: OffGao | 2008.12.18 23:56
DCオフセットフィルタですか。ちょっと知らない言葉だったので調べてみます。ありがとうございます!
GBノイズはノートオンのタイミングでフェーズをリセットする。
FCノイズはリセットしない。
だけかと思ってたんですが、そういうわけでもないんですかね?
ノイズは奥がふかそうですねぇ。とりあえず三角波だけでも先にリリースしちゃったほうがいい気がしてきました。
投稿: おー | 2008.12.19 00:48
今最新のソースを見てきましたが、FCノイズに関しては、この実装でOKです。
FC三角波、音小さいような…?
---------
一応、GBサウンドについての資料:
ttp://www.devrs.com/gb/files/hosted/GBSOUND.txt (英語)
投稿: OffGao | 2008.12.22 00:23
クリスマスまでにファミコン音源を実装してクリスマスソングを作りたかったんですが・・・間に合わず(;;)
@nでノイズ周波数を設定するのも面倒なので、他のMMLを参考に、o0c ~ o1d#までに割り当てようかな~と思ってます。
三角波は、ご指摘のとおり、音が小さかったので修正しました。ありがとうございました。
投稿: おー | 2008.12.25 02:02
ひっそりと・・・@5FCパルス波@6FC三角波@7FCノイズ@8FCショートノイズを追加してみたんですが、あってますかねぇ、これ。
http://svn.coderepos.org/share/lang/actionscript/flmml/trunk/src/flmml.swf
というかコミットしないほうがよかったかな。大丈夫かな・・・?
投稿: おー | 2008.12.29 02:40
95%大丈夫です。
@5@6は、問題なく動いています。
@7@8のFCノイズは、周波数が正しく指定されていることを確認しました。
短周期ノイズが、長周期ノイズを鳴らすたびに音が変わってこないようですが…。
投稿: OffGao | 2008.12.29 04:58
確認ありがとうございます!
早い&細かいチェックでとても助かります。
そういえば長周期ノイズを鳴らすことによっても音が変わらないといけないんでしたね・・・chiptuneは奥が深い(;;)
修正します。
投稿: おー | 2008.12.29 23:38
結構細かいところですが、実際そうなるので…お願いします。
ノイズパターンはテーブルに入れずに、サンプリング毎に生成させたほうがいい気がします。
(若干重くなりそうだが、仕方ない)
レジスタは共有すればOK。
---------
GBノイズ周波数テーブルを作ってきました。
0x000002, 0x000004, 0x000008, 0x00000c,
0x000010, 0x000014, 0x000018, 0x00001c,
0x000020, 0x000028, 0x000030, 0x000038,
0x000040, 0x000050, 0x000060, 0x000070,
0x000080, 0x0000a0, 0x0000c0, 0x0000e0,
0x000100, 0x000140, 0x000180, 0x0001c0,
0x000200, 0x000280, 0x000300, 0x000380,
0x000400, 0x000500, 0x000600, 0x000700,
0x000800, 0x000a00, 0x000c00, 0x000e00,
0x001000, 0x001400, 0x001800, 0x001c00,
0x002000, 0x002800, 0x003000, 0x003800,
0x004000, 0x005000, 0x006000, 0x007000,
0x008000, 0x00a000, 0x00c000, 0x00e000,
0x010000, 0x014000, 0x018000, 0x01c000,
0x020000, 0x028000, 0x030000, 0x038000,
0x040000, 0x050000, 0x060000, 0x070000,
計算方法: 1048576(Hz) / テーブルの値
投稿: OffGao | 2008.12.30 00:46
毎度ありがとうございます!! GBノイズも順次入れていきたいです。
先ほど修正した(つもり)のものをコミットしました。
今年中にうまくいってるといいなぁ…。
(明日は更新できないです・・・)
投稿: おー | 2008.12.31 01:51
ありがとうございます。 FCノイズ、全然問題なく完璧になりました。
-------
おきのどくですが、バグが1つ…
LFOの波形を正弦波以外にした時、1度目の指定でwidthの値が無視されてしまいます。(2度目以降は正常動作)
widthの値をいろいろ変更しても、出てくる音はプーヤンの太鼓でした。
サンプル:
T135@e1,0,20,20,0q16 o5
@l600,1000,1 /:c8c8/:8c32:/:/ c8c8c16c8c16c8c8/:8c32:/
/:c8c8/:8c32:/:/ c8c8c16c8c16/:4c16:/c4
投稿: OffGao | 2008.12.31 13:32
おきのどくですが ぼうけんのしょは きえてしまいました
と言われて以来の衝撃!
毎度毎度検証ありがとうございます。
つい今しがたコミットしたのでバグを修正できているのではないかと思います。
今度こそ2008年最後のコミットになります。
よいお年を~~!
投稿: おー | 2008.12.31 18:12
確認しました。OKです。
いよいよ新年…よいお年を!
投稿: OffGao | 2008.12.31 18:33
…いや、LFOの波形スタート位置がずれるバグがありました。
これは書き方が特殊ですが、どうなんでしょう。
@6q16 @e1,0,0,128,0
/:128 @l0 c8& @l500,50,-1 c8r8 :/;
投稿: OffGao | 2008.12.31 18:53
あけましておめでとうございます。
本年もよろしくお願いいたします。
これは・・・なるほど。
ちょっと迷ったんですが、LFOを設定したタイミングで波形スタート位置をリセットするよう変更してみました。これで困ることがないようでしたらこの仕様でいきたいと思います。
投稿: おー | 2009.01.01 18:53
あけましておめでとうございます。
OKです。今のところ、特に困るところはありません。
ためしに、バルーンファイトのゲームオーバー曲を耳コピしたところ、問題なく高再現度で出来ました。
---------
あとはGBノイズですね。
ノイズ+フィルタでドラム音を作る際、GBノイズだと必ず同じ音が出せる利点があるので結構欲しいところ。
投稿: OffGao | 2009.01.02 13:29
ありがとうございます!
GBノイズは以前サンプルを組んでもらっていますので、テーブルで実現しようかと思います。
@9を(一応)DPCM用に予約。
@10をGB波形メモリ音源用に予約しておいて
@11がGBロングノイズ
@12がGBショートノイズでOKですかね。
GBのパルス波も12.5%、25%、50%、75%みたいなんで、FCパルス波と一緒ですよね。
投稿: おー | 2009.01.03 01:30
さっき風呂入る前に急いで作ったバージョンがこちらに。
http://homepage3.nifty.com/sketch/flash/flmml210.swf
@11 GBロングノイズ
@12 GBショートノイズ
を入れてみましたが自分でもほとんど試してませんので全然自信なしです。
あとで自己検証してみます。
投稿: おー | 2009.01.03 02:53
ありがとうございます。
GBノイズ、問題無しです。
周波数指定・ノイズパターンともにちゃんと実装されていることを確認しました。
投稿: OffGao | 2009.01.03 16:01
わーい、ありがとうございます!
コミットしてみました。
しばらく放置しちゃってるドキュメントのほうも整備しなきゃ・・・。
投稿: おー | 2009.01.04 01:45