マイコンで簡易シンセサイザー

 2011-06-30
某所より引き合いがあり、おもしろそうなので作ってみた物。

78k0sを使い、タイマーの方形波出力で音階を出力してみるというシロモノ。
 
DSC_0068.jpgすでに出来上がりのブツ。
・ダイソーのヘッドホンから強奪したスピーカ
・スピーカ出力段のトランジスタ2SA1015
・出力Trのベース電流制限用に抵抗(3K)と音量調節用の半固定抵抗(1K)
・マイコンreset端子pullup用の抵抗(1K)
・電源ラインのパスコン(0.1uF)
・電源確認用にLEDと電流制限用抵抗(10K)
・そして78k0s/KA1+
やろうと思えば、reset端子pullup抵抗・スピーカ・78k0s以外は無くても良いんだけど格好良いのでいろいろ載せてあります。


DSC_0069.jpg接続用のピンヘッダは誤接続防止のために折損加工済み。やっとかないと不安。。。


DSC_0070.jpgラの音階を出力させて周波数を確認しているところ。秋月テスタで440Hzを確認!


DSC_0071.jpgこっそり持っていたチューナでも確認。だいたいあってる。



マイコンの動作は以下。(エッセンスのみ。適当に省略してます。)

const unsigned short FREQ[] = {
0x77DD>>1, /* do */
0x6A8A>>1, /* re */
0x5EB1>>1, /* mi */
0x59DF>>1, /* fa */
0x4FE6>>1, /* so */
0x4704>>1, /* ra */
0x3F20>>1, /* si */
0x3BEB>>1 /* do */
};


void main(){
unsigned char OLD_STATUS=0x0;
WDT_Restart();

while (1) {
OLD_STATUS=INT_TMH(OLD_STATUS);
}

}


unsigned char INT_TMH(unsigned char OLD_STAT){
unsigned char STATUS = P4 & 0xf;
unsigned char FREQ_i = (STATUS)>>1;
unsigned char FREQ_en= (STATUS)&0x1;

if( OLD_STAT != STATUS ){
if( FREQ_en ){
TM00_Stop(); /* Timer stop */
TM00_ChangeTimerCondition( &FREQ[FREQ_i] , 1 );/* Timer Freqency Setting */
TM00_Start();/* Timer start */
}else{
TOE00=0x0; /* Timer output disable */
}
}
WDT_Restart(); /* WDT clear */
return(STATUS);
}


P4_0,1,2,3で状態を定義します。P4_0が発音イネーブル(FREQ_en)で、残りが音階選択(FREQ_i)用です。
本当はwhileループではなくて別のタイマ割り込みで関数を呼び出そうと思っていたけど、面倒になってwhileループに放り込んでいます。ちゃんと動いてるのでオッケー!どうせたいしたことやってないし。



うーむ、プログラムコード貼るときは見にくいなこのブログ。何とかしたいと思いつつ、コード貼るなんて滅多にないので対応は後回しに…。
 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/45-5b130b24
≪ トップページへこのページの先頭へ  ≫