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

ところがファミコンの音源は解像度が荒いので、これに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の更新はファミコンノイズも付けてからにしようと思うので少々お待ちくださいませ。
(指摘されているバグも直したい・・・)
« FlMML - Flash 10対応(Vistaも音が途切れない!) | トップページ | FlMML - バッファリング・ファミコン音源・ゲームボーイ ノイズ »
「FlMML」カテゴリの記事
- FlMMLリポジトリの引越し(2011.02.05)
- FlMML - リングモジュレーターとSync(2009.07.26)
- MML対応Twitterクライアント(2009.07.24)
- FlMML - DPCM変換ツール(2009.05.17)
- FlMML - ファミコンDPCM(2009.05.16)
コメント
この記事へのコメントは終了しました。
« FlMML - Flash 10対応(Vistaも音が途切れない!) | トップページ | 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
最近ピコカキコの存在を知って打ち込み始めさせていただいております。
すっごく楽しませてもらっています(^^)。感謝感謝です。
(1)
http://dic.nicovideo.jp/b/a/fc%E9%9F%B3%E6%BA%90/31-#55
FCのバルーントリップの曲を打ち込んでみたのですが、
三角波のパート、キーオンの立ち上がりの時のプチノイズが
かなり目立つのですが、キーオンの時に波形の位相が
リセットされないからなのでしょうか・・?
キーオフ時、休符を置いてからのキーオンでプチノイズが
発生している印象なのですが、プチノイズを退治できないものでしょうか?
(2)
#OCTAVE REVERSE
と同様に、相対音量のカッコの指定も逆指定できるようになりませんでしょうか?
打ち込みの時、音量の上げ下げで泣きそうになっています。
投稿: LDrive | 2010.07.01 00:54
楽しんでもらえてるようでこちらとしても嬉しい限りです。
FC音源についてはこちらのページに信じられないくらい詳しく書いてあるんですが、キーオン時に波形位置がリセットされないのが正しい挙動らしいので、プチノイズは発生しやすいですよね。きっと。
手軽な回避方法としては波形メモリ音源で代用してしまうという手を思いつきましたが、ピコ師の皆さんならもっと正攻法を知っているかもしれません。
http://dic.nicovideo.jp/a/fc音源
投稿: | 2010.07.05 00:15
ベロシティリバースは簡単に実装できると思うんですが、ちょっと今忙しくて&ブランクがありすぎてすぐに対応できそうにありません。
ニコニコ大百科のピコカキコのページとかで要望出してたら誰かが実装してくれるかも。。。他力本願すぎてごめんなさいf^_^;)
投稿: おー | 2010.07.05 00:20
お返事ありがとうございます。(^^)
ピコカキコ投稿がやっと5件になりました!
位相リセットされないのが正しい仕様なんですね。。
他のエミュ音源などではあまりプチプチ聞こえないようだったので、
単純に考えてしまったのですが、何か秘密がありそうですね。。^^;
三角波のプチノイズは他のピコ師さんのMMLを拝見したら
GB波形メモリ音源で代用する方法が結構メジャーな方法みたいでした。
ただ、これでも q16 @q0 で音符を並べるときは音程変更時にプチプチ
してしまうので、どうしてもというときだけ @q1 などのようにして回避しよう
と思います。
ただ、@6 の存在がちょっと勿体ない&さみしいかも…
ベロシティーリバースその他については、flmmlのwiki
http://www21.atwiki.jp/flmml/pages/13.html
の要望欄でもつぶやいてみました。
まずはこれで、大人しくしようと思います。^^;
投稿: LDrive | 2010.07.12 17:23
ものすごい今更感ですが#VELOCITY REVERSEを追加してみました。
って、もう見てないですよね、ここ…。
投稿: おー | 2010.09.26 23:15
返信遅くなりました。。(汗;
#VELOCITY REVERSE、相対デチューン、テンポ小数点以下2位まで受け付け、ありがとうございます!
この3つは大変うれしいです!
相対音量は格段に書きやすくなりますし、あきらめていたテンポずれも救われます。
相対デチューンは、最近FM音源もののMMLを書いていますが、音色で定義するデチューンに加えてMMLトラックでさらにかけるデチューンの部分に応用できそうなので、利用させていただきたいと思います^^
ご対応ありがとうございます^^
投稿: LDrive | 2010.11.11 01:31
相対デチューンを誤解してました。。^^;
1セント単位の相対指定だとばかり。。
半音(100セント)単位だったんですね^^
投稿: LDrive | 2010.11.11 23:03
FlMML(ピコカキコ)で私が投稿した一覧をここで紹介しています。
http://dic.nicovideo.jp/u/10580957
早速 #VELOCITY REVERSE が重宝しています!
一覧は随時更新していますので、もしよかったらご利用ください^^
投稿: LDrive | 2010.11.16 01:56
おわー。ものすごい放置しまくりですみません(><)
ブログを2ヶ月近く見てなかったのか…申し訳ないです。
相対デチューンも対応したほうがイイですかね?
投稿: おー | 2011.01.02 23:50
1セント単位の相対デチューンの用途はFM変調時のデチューンと
MML上のユニゾン用デチューンとのすみわけを容易にしたい目的
でした。
2月にaloeさんがコミットされているFMモジュールが気になります。。
これがピコカキコでも使えるようになって、内容OKの場合、相対デチューンや
フィードバック変調、キースケールに関して解決してしまうかもしれないですー。。
早くピコカキコで使ってみたいです(^^)
(FMモジュールを使ったMML記述書式の発表もお待ちしています^^)
投稿: LDrive | 2011.04.06 01:51
また2ヶ月も放置してしまいましたが(^^;
その間に大百科でもFMモジュール使えるようになりましたね!
投稿: おー | 2011.06.14 23:54