tone 関数は、もう飽きた。 - Gadget Renesas

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;