最近、PSGとかノイズジェネレータとかチップチューン
とか調べ物してたり、色々ネットの情報をさまよって
いると、いしかわきょーすけさんの日記に時々登場する
YMCKが気になってしまって、「ファミリーミュージック」
を入手。届いてた。
BGMとして掛けてみる。イイ。もっとゲームゲーム
した感じなのかと思ったら、ピチカートファイブとか
の雰囲気にちょっと似てる印象。他のアルバムも
聞いてみたくなったな。
で、ここ数日頭にこびりついて離れないノイズ
ジェネレータ。ちょっと手を動かしてみる。
http://beatnic.jp/takedanote/vol20/
まずは武田さんのタケダノヲトのページにあるソース
を拝見し、ザックリ理解してみる。
ノイズジェネレータの処理方法の微妙なところが
わかった。
PWMとかで乱数を出力(いわゆるホワイトノイズ)
するのとはちょっと違って、0か1を擬似乱数
(線形帰還シフトレジスタ方式)でランダムな
順序で出力する(いわゆる二値出力)ってことみたい。
周波数がマチマチな矩形波がノイズに聴こえるって
ことなのかな?
で、線形帰還シフトレジスタ方式ってのが、
http://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0
こんな風に適当なビット幅のレジスタを用意して
おいて、途中から2ビットとか4ビットとか抜き出し、
xorを取ってローテートシフトさせて行けばいいと。
で、そのときのシフト処理する周期を変化させると
ノイズの平均周波数ってやつが変化させられるみたい。
以前作ったArduino簡易MIDI音源のスケッチを改造して、
最大頻度20000回/秒でこの処理をサクッと書いて
動かしてみることにする。
wikipediaに書かれている計算処理そのものを計算式
に書いてみる。(乱数発生処理関数だけ抜き出し)
武田さんのタケダノヲトのページにあるプログラムとは
似ても似つかない、計算式すら原型を留めない
代物。
しかも武田さんのおよそ60000回/秒と比べると
スペック的には相当低いものしか出来ないだろうと
思いつつ…
int random_num() {
static int seed = 12345; //random seed
int random_value;
// random_value = (seed>>1) + (bitRead(seed, 16) xor bitRead(seed, 13) xor 1)*0x8000;
random_value = (seed>>1) + (bitRead(seed, 13) xor bitRead(seed, 4) xor 1)*0x8000;
seed = random_value;
return seed;
}
こんな感じに。
タイマ割り込み回数と可変抵抗からの読み込み値を
比較して、抵抗値に似つかわしい経過時間が経ったら、
この戻り値のLSBを取り出して、デジタル出力ピンに
出力するだけ。
で、無事音が出た。想定どおりの音が出た!
可変抵抗をグリグリするとちゃんとノイズの音が
高くなったり低くなったり。ちょっとウレシイ。
プチタイムトリップして、いまオイラの目の前には
あのチェルシーキーボードがクッキリ見えている。
実は、コメントアウトしてある方の計算式は、
http://d4.princess.ne.jp/msx/psg/
例のこちらのサイトで解析・VHDL化されていた計算
の式をそのままパクッて見たところ、オイラおばか
なことに、int型(16ビット幅)変数なのに
17ビット目(ビット16)を参照してることに気付かず、
ノイズではない微妙な音色で鳴って困った。内緒。
xorに使うビットを他の適当なところに変更して、
それっぽく書き換えてみるとようやく鳴った。
数学的にこれが本当に最長の計算周期になって
居るかどうかは全然わかんないけど、耳で聞いて
見たところとりあえず「ザーーーー」とか
「ジューーーー」とか「ゴーーーー」ってノイズ
に聴こえるのでとりあえずヨシとする。
とりあえずここまで。今度、オシロをあててみて
周期を変えながらFFT掛けてみよう。
ノイズジェネレータだけなんとかなれば、あとは
オイラ謹製パチモノMIDI音源のスケッチと合わせても
いいし、Cかアセンブラでガリガリ書いてTINY2313用
のPSGエミュレータにもっていってもいいな。
まぁ、あとでちゃんと纏め直したいと思います。
http://www.kohgakusha.co.jp/books/detail/978-4-7775-1678-0
見本が手元に届いた。まずは気になっている部分を
ザックリ確認。とりあえずokっぽい感じ。
本当は宿題持ち帰ってきてるんだけど、こっちを
細かくチェックするほうを優先しないといかんかな。
ノイズ出して遊んでる場合じゃないよな。
(追記)
http://nekosan0.bake-neko.net/connection2_noise_gen.html
ページ追加しました。