unsigned int code NoteReload[] = { //中音1-7 和高音1-7 对应的定时器重载值
65536 - (11059200/12) / (523*2), //中音1
65536 - (11059200/12) / (587*2), //2
65536 - (11059200/12) / (659*2), //3
65536 - (11059200/12) / (698*2), //4
65536 - (11059200/12) / (784*2), //5
65536 - (11059200/12) / (880*2), //6
65536 - (11059200/12) / (988*2), //7
65536 - (11059200/12) / (1047*2), //高音1
65536 - (11059200/12) / (1175*2), //2
65536 - (11059200/12) / (1319*2), //3
65536 - (11059200/12) / (1397*2), //4
65536 - (11059200/12) / (1568*2), //5
65536 - (11059200/12) / (1760*2), //6
65536 - (11059200/12) / (1976*2), //7
};
1=Do,2=Re,...以此類推
然後11059200代表fosc,即晶振頻率,12為1T定時模式,12T定時模式則不用除12,而523,587,...等等的,則為音頻頻率
還要再多乘以2的原因是,因為我們一個周期是需要高低各佔比50%的,所以頻率倒數就是週期,相對來說我們頻率要多一倍去產生高低電位
就是週期的一半就是高/低電位,這樣剛好50%佔空比
再以剛剛的範例來講
以中音區的「do」為例,此時該方波信號的頻率是523Hz,那麼高電平持續時間等於956us
T/2=1/523/2=956us,驗證OK
決定完音階以後,剩下就是該響多久,也就是節拍(Tempo)了,兩隻老虎是(1/4)拍代表以四分之一音符當作1拍,一小節有1拍,其實要有些樂理概念比較容易懂
但四分之一音符要多久,這就依照使用者定義了,音符只是相對的時間長短,假設400ms為四分之一音符時間,二分之一音符就是800ms,
又假設200ms為四分之一音符時間,二分之一音符時間就為400ms,所以原來給您的範例程式碼就是歌曲上的相對節拍了
//两只老虎节拍表,4 表示一拍,1 就是 1/4 拍,8 就是 2 拍
unsigned char code TwoTigerBeat[] = {
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8,
3,1, 3,1, 4, 4, 3,1, 3,1, 4, 4, 4, 4, 8, 4, 4, 8,
};
有了音調+節拍就完成一首歌曲了