前回からの話。どうやってノイズ(正しく言うと疑似乱数)を作るか。
今回はコチラのサイトから簡単そうな(!?)ものを2つ選んでみました。
乱数(ランダムナンバー)の種類と生成方法
で選んだのがこれ、混合合同法と線形帰還シフトレジスタ。前回も書きましたね。
混合合同法と言うのは下の式、
a'=a×p+q
この式に適当な値を入れて計算を繰り返していきます。こんな感じに
a=11,p=121,q=43 ※今回は2ケタ目から4ケタ目だけ使う。
1回目 11×121+43=1334→133=a'
2回目 133×121+43=16136→613=a''
3回目 613×121+43=74216→421=a''' ・・・・・
を繰り返すことで疑似乱数を得ることができます。この考えを元に作ったのがこちらのプログラム
/* Noise.c
*プログラム上で乱数を発生する。
* 乱数の生成は混合合同法を用いる。
* Author:longtail*/
#define F_CPU 1000000UL // 1MHz
#include <util/delay.h> //delay関数を使用する
#include <avr/io.h>
//変数の定義
int a=0x3e; //適当な値にする。
//関数の設定
void InitialHard(void);
int main(void){ //メインプログラム
InitialHard(); //ハードの初期化
while(1){
a=a*13+1; //疑似乱数の発生
a=a>>2;
PORTB=a;
_delay_us(100); //wait
}
}
void InitialHard(void){
//ポートBの設定
DDRB=0xff; //ポートBを出力に設定
PORTB=0; //ポートBに0を出力
}
プログラムは結構短め。でメインのとこはここ
a=a*13+1; //疑似乱数の発生
a=a>>2;
この部分で混合合同法を行っています。1行目でこの式(a'=a×p+q)の計算をし、2行目で下から2ケタ目を省いています。
じゃあ上のケタは?上のケタは勝手にマイコンが勝手に省いてくれます。
なんでかというと、aという変数(数字が入る箱)があります。この箱には変数のタイプによって入る数字が制限されます。今回はint型を使っており、0から65535までの整数しか入りません。それ以上の数字が入るとその数字は無視されます。
とまぁこんな感じで。このおかげで上のケタを削らなくても勝手にやってくれるのです。
早速プログラムを実行、作った疑似乱数を聴いてみると、
「おおっ、ノイズっぽい」
とりあえず、ノイズのような音を出すことができました。なんとなくおもちゃの銃みたいな音。「ガガガガガ」って感じ。
多分、変数aの値などを変えるとまた音の雰囲気が変わると思います。
また、この行、
_delay_us(100); //wait
の数字を変更すると音の高さ(?)が変わります。これは次回に説明できればいいなと思ってます。実はよく分かって無い(´・ω・`)
とりあえず次回につづく
~初めて来られた方へ~
「電子楽器とかいろいろ」はLongtailが電子楽器製作の道のりを綴っています。
「電子楽器を作るぞ!」とか「マイコンを使ってみよう!」と思っている人の参考になるかもしれません。
電子楽器と言っても、現在は音源ICを用いて電子楽器を製作しています。ちょっと前はアナログシンセサイザーを作っていたけどね。そっちも書けば良かった。
コメントやリンクは大歓迎です。コメントはブログの内容に関わるもの(具体的にね)をお願いします。「何かを感じました。」とか他のブログでも書けるものはだめですよ( `・ω・´ )何を感じたんだ、何を
内容が難しいですがたまに描いてる絵のコメントもOKです。気になったら読んでみてください。
「電子楽器とかいろいろ」はLongtailが電子楽器製作の道のりを綴っています。
「電子楽器を作るぞ!」とか「マイコンを使ってみよう!」と思っている人の参考になるかもしれません。
電子楽器と言っても、現在は音源ICを用いて電子楽器を製作しています。ちょっと前はアナログシンセサイザーを作っていたけどね。そっちも書けば良かった。
コメントやリンクは大歓迎です。コメントはブログの内容に関わるもの(具体的にね)をお願いします。「何かを感じました。」とか他のブログでも書けるものはだめですよ( `・ω・´ )何を感じたんだ、何を
内容が難しいですがたまに描いてる絵のコメントもOKです。気になったら読んでみてください。






