tone 関数は、もう飽きた。 矩形波 しか出ないもん。 世の中には いろんな波形があるのに!あるのに! の ため の 人 た き に飽 数 関 e ton デジタルシンセ入門 じゃあ 使ってない8ビットタイマーと アナログ出力を使ってみましょうか? SD カードから mp3 を読んで 音を出すんじゃないんだ…… 基本原理 波形データを配列として用意 タイマー割り込み時に 1. 配列の要素を取り出し、アナログ端子に出力 2. 配列の読みだし位置を移動 1と2を繰り返せば、波形データに基づいた音が出る! このタイミングをとるのに空いてるタイマーを 使用する。 波形データを配列として用意 //timer TMR0 setup SYSTEM.PRCR.BIT.PRC1=1; /*レジスタ書き込み許可*/ SYSTEM.MSTPCRA.BIT.MSTPA5=0;/*TMR0ストップ解除*/ SYSTEM.PRCR.BIT.PRC1=0; /*レジスタ書き込み禁止*/ TMR0.TCR.BYTE =0b01001000;//COMP A MATCH TMR0.TCCR.BYTE =0b00001011;//PCLK/32 TMR0.TCORA=33;//11kHz-(136-1) 44.1khz-(34-1) /*割り込み許可*/ ICU.IER[0x15].BIT.IEN2 = 1;//TMR0 CMIA0 ICU.IPR[170].BIT.IPR = 7;//TMR0 //DAC setup SYSTEM.PRCR.BIT.PRC1=1; /*レジスタ書き込み許可*/ SYSTEM.MSTPCRA.BIT.MSTPA19=0;/*DACストップ解除*/ SYSTEM.PRCR.BIT.PRC1=0; /*レジスタ書き込み禁止*/ MPC.PWPR.BIT.B0WI=0;/*プロテクト解除*/ MPC.PWPR.BIT.PFSWE=1; MPC.P05PFS.BIT.ASEL=1;/*P05(IO53)analog*/ MPC.PWPR.BIT.B0WI=0;/*プロテクト再設定*/ MPC.PWPR.BIT.PFSWE=0; MPC.PWPR.BIT.B0WI=1; PORT0.PDR.BIT.B5=0; PORT0.PMR.BIT.B5=0; DA.DACR.BYTE =0b10011111; //DA.DAADSCR is default. 音程を変えるには? ↓ 周波数を変える! 周波数は音階が1オクターブ上がると 2倍になる。 f = f0 × 2(i/12) f :周波数 f0:基準周波数(ピアノの鍵盤の真ん中のラの周波数) i : 音階 (-48 ∼ 39) その周波数 f で音を出すには、タイマ割り込み時にどれだ け配列の読み取り位置を移動させればいいか? 周波数が f ということは、1秒間に波がf個ある。 配列の要素数がn個の場合、 1秒間に f×n個の要素があることになる。 タイマ割り込みの間の時間には、(f×n)÷fs 個の要素が入る。 よって、タイマ割り込みのときに、 配列の読み取り位置を (f×n)÷fs だけ動かせばいい。 f×n (f×n)÷fs void UserTMR0InterruptFunction(void) { } if(note_on==1){ P = P + dP[note_No]; output = WaveTable[P]; }else{ dp=0; } DA.DADR1=WTSG_output;
© Copyright 2024 ExpyDoc