//後でコメントを追加する
#include <stdio.h>
#include <math.h>
#include "iodefine.h"
#include "global.h"
#define SIN_MAX 256
#define RHYZM_MAX 26
void playSound(void);
void stopSound(void);
unsigned char ryzhmCnt = 0;
unsigned char nextRyzhmCntFlag = 0;
unsigned char nextMusicIntervalFlag = 0;
unsigned short sinNow = 0;
unsigned char volume = 0x01;
unsigned short musicFreq;
unsigned short musicSpeed = 10;
/* 256 c */
unsigned char sounds[] = {
127,130,133,136,139,142,145,148,
151,154,157,161,164,166,169,172,
175,178,181,184,187,189,192,195,
197,200,202,205,207,210,212,214,
217,219,221,223,225,227,229,231,
232,234,236,237,239,240,242,243,
244,245,246,247,248,249,250,251,
251,252,252,253,253,253,253,253,
253,253,253,253,253,252,252,251,
251,250,249,249,248,247,246,245,
243,242,241,239,238,236,235,233,
231,230,228,226,224,222,220,218,
215,213,211,209,206,204,201,199,
196,193,191,188,185,182,180,177,
174,171,168,165,162,159,156,153,
150,147,144,141,137,134,131,128,
126,123,120,117,113,110,107,104,
101,98,95,92,89,86,83,80,
77,74,72,69,66,63,61,58,
55,53,50,48,45,43,41,39,
36,34,32,30,28,26,24,23,
21,19,18,16,15,13,12,11,
9,8,7,6,5,5,4,3,
3,2,2,1,1,1,1,1,
1,1,1,1,1,2,2,3,
3,4,5,6,7,8,9,10,
11,12,14,15,17,18,20,22,
23,25,27,29,31,33,35,37,
40,42,44,47,49,52,54,57,
59,62,65,67,70,73,76,79,
82,85,88,90,93,97,100,103,
106,109,112,115,118,121,124,127
};
unsigned char soundInterval[] = {
191,//シ
180,//ド
159,//レ
142,//ミ
134,//ファ
120,//ソ
89,//ラ
95,//シ
90//ド
};
unsigned char musicMap[] = {
180, 159, 142, 134, 142, 159, 180, 142, 134, 120, 89, 120, 134, 142, 180, 180, 180, 180, 180,
180, 159, 159, 142, 142, 134, 134, 142, 159, 180
};
unsigned char songs[MUSICNUMBERMAX][100] = {
"ドレミファミレドミファソラソファミドドドドドドレレミミファファミレド",
"ドドレミミソミミレレドミミファソドラドソドドシラソララララソドドレミミソミミレレド",
"ララファレレミファレソラソファミレドララファレレミファレソラソミファ",
"ドミファソドミファソドミファソミドモレミミレドドミソソファミファソミドレド",
"ソファミレミファレドミファソミレミファレミファソミレミファレソファミレミファレド",
"ミソラソミソドドララソミドレミミソラソミソドドララソミレミドレミレソララソラドドシラソソミミソラソミソドドララソミレミド",
"ドレミドミドミミレレミファファミレファミファソミソミソファソララソファラソドレミファソララレミファソラシシミファソラシドドシラファシソドドシラソファミレ"
};
unsigned char rhyzm[RHYZM_MAX] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1, 0
};
/* playSoundState = 1 */
void playSound(void){
//int b = (int)(ceil(1.0f * sinNow /SIN_MAX));
//int a = rhyzm[(int)(5.0 * sinNow /SIN_MAX * RHYZM_MAX)];
//a = rhyzm[a];
DA.DADR0 = sounds[sinNow] * (volume / 4 + volume % 4) * rhyzm[(int)(1.0f * sinNow / SIN_MAX * RHYZM_MAX)];
//displayFlag = 1;
}
/* playSoundState = 0 */
void stopSound(void){
ryzhmCnt = 0;
nextRyzhmCntFlag = 0;
DA.DADR0 = 1023;
CMT.CMSTR0.BIT.STR1 = 0;
CMT1.CMCNT = 0;
sinNow = 0;
}
unsigned char myDiv(unsigned char a, unsigned char b){
unsigned char count=0;
while(count);
}
//Use CMT3・・・・・・
void playMusic(void){
//ドレミファミレドミファソラソファミドドドドドドレレミミファファミレド
static unsigned char ch = 0;
if(getCmt3Count() > musicSpeed){
if(ch < 28) ch++;
else ch = 0;
setCmt3Count(0);
}
CMT1.CMCOR = musicMap[ch] / 2; // / MUSIC_COST;
musicFreq = musicMap[ch];// 仮
playSound();
}
void playMusicX(unsigned char musicNumber){
const unsigned char chf = (unsigned char)strlen(songs[musicNumber]);
static unsigned char ch = 0;
if(getCmt3Count() > musicSpeed){
switch(songs[musicNumber][ch]){
case 'ト':
CMT1.CMCOR = 180 / MUSIC_COST;
musicFreq = 261;
ch++;
break;
case 'レ':
CMT1.CMCOR = 159 / MUSIC_COST;
musicFreq = 294;
break;
case 'ミ':
CMT1.CMCOR = 142 / MUSIC_COST;
musicFreq = 330;
break;
case 'フ':
CMT1.CMCOR = 134 / MUSIC_COST;
musicFreq = 350;
ch++;
break;
case 'ソ':
CMT1.CMCOR = 120 / MUSIC_COST;
musicFreq = 392;
break;
case 'ラ':
CMT1.CMCOR = 89 / MUSIC_COST;
musicFreq = 440;
break;
case 'シ':
CMT1.CMCOR = 95 / MUSIC_COST;
musicFreq = 494;
break;
}
if(ch < chf) ch++;
else ch = 0;
setCmt3Count(0);
}
playSound();
}
unsigned short getMusicFreq(void){
return musicFreq;
}
//if speed value is smaller, music speed is faster.
void setMusicSpeed(unsigned short speed){
if(speed < 1) speed = 1;
musicSpeed = speed;
}
unsigned short getMusicSpeed(void){
return musicSpeed;
}
void setVolume(unsigned char vol){
volume = vol;
}
//コンペアマッチタイマの設定
#include "vect.h"
#include "iodefine.h"
#include "global.h"
/*
「メモ」
96MHz / 512 = 187500 cycle/s
96MHz/8/440/256 ラの音
CMT0.CMCOR = 106;//5860, 46876 - 1;//23438-1;//10000ms //2929-1(1000ms)
「使用目的」
CMT0
CMT1
CMT2
CMT3 時間計測
*/
unsigned char cmt3_count;
unsigned char cmt0_count = 0;
//extern MAIN_STATE main_state;
//extern MODE_STATE mode_state;
extern unsigned char main_state;
extern unsigned char sub_state;
extern unsigned short sinNow;
void initCMT0(void);
void initCMT1(void);
void initCMT2(void);
void initCMT3(void);
void initCMT(void);
void timer10m(unsigned char);
void initCMT(void){
initCMT0();
initCMT1();
initCMT2();
initCMT3();
}
void initCMT0(void){
SYSTEM.PRCR.WORD = 0xA503;
SYSTEM.MSTPCRA.BIT.MSTPA15 = 0;//CMT0,1
SYSTEM.PRCR.WORD = 0xA500;
CMT.CMSTR0.BIT.STR0 = 0;
CMT0.CMCR.BIT.CMIE = 0x01;
CMT0.CMCR.BIT.CKS = 0x01;//8分周・32分周・128分周・512分周
CMT0.CMCNT = 0;
//192MHz/4/512 = 93750 cycles
CMT0.CMCOR = 9375;// 100ms
ICU.IPR[4].BYTE = 0x06;
ICU.IER[3].BIT.IEN4 = 1;
}
unsigned char getCmt0Count(void){
return cmt0_count;
}
void setCmt0Count(unsigned char val){
cmt0_count = val;
}
//100msごとに割り込み
void Excep_CMT0_CMI0(void){
if(main_state == 1){
if(sub_state == 0){
if(cmt0_count < 50){
cmt0_count++;
}else{
CMT.CMSTR0.BIT.STR1 = 0;
cmt0_count = 0;
}
}
}else if(main_state == 2){
S12AD.ADCSR.BIT.ADST = 1;
}
}
void initCMT1(void){
SYSTEM.PRCR.WORD = 0xA503;
SYSTEM.MSTPCRA.BIT.MSTPA15 = 0;//CMT0,1
SYSTEM.PRCR.WORD = 0xA500;
CMT.CMSTR0.BIT.STR1 = 0;
CMT1.CMCR.BIT.CMIE = 0x01;
CMT1.CMCR.BIT.CKS = 0x00;//8分周・32分周・128分周・512分周
CMT1.CMCNT = 0;
//192MHz/2/512 = 187500 cycles
//CMT1.CMCOR = 18750;// 100ms
CMT1.CMCOR = 20000;
ICU.IPR[5].BYTE = 0x03;
ICU.IER[3].BIT.IEN5 = 1;
}
//音周期用 6000000Hz
void Excep_CMT1_CMI1(void){
if(main_state == 1){
if(sinNow < 255) sinNow++;
else sinNow = 0;
if(sub_state == 0){
playSound();
}else if(sub_state == 1){
playMusicX(6);
}
}else if(main_state == 2){
if(sinNow < 255) sinNow++;
else sinNow = 0;
playMusicX(5);
}
}
void initCMT2(void){
SYSTEM.PRCR.WORD = 0xA503;
SYSTEM.MSTPCRA.BIT.MSTPA14 = 0;//CMT0,1
SYSTEM.PRCR.WORD = 0xA500;
CMT.CMSTR1.BIT.STR2 = 0;
CMT2.CMCR.BIT.CMIE = 0x01;
CMT2.CMCR.BIT.CKS = 0x03;//8分周・32分周・128分周・512分周
CMT2.CMCNT = 0;
//192MHz/4/512 = 12000000 cycles/s
//1cycle 83.333ns
//1μs -> 12
CMT2.CMCOR = 18750;// 100ms
ICU.IPR[6].BYTE = 0x06;
ICU.IER[3].BIT.IEN6 = 1;
}
void Excep_CMT2_CMI2(void){
}
void initCMT3(void){
SYSTEM.PRCR.WORD = 0xA503;
SYSTEM.MSTPCRA.BIT.MSTPA14 = 0;//CMT0,1
SYSTEM.PRCR.WORD = 0xA500;
CMT.CMSTR1.BIT.STR3 = 0;
CMT3.CMCR.BIT.CMIE = 0x01;
CMT3.CMCR.BIT.CKS = 0x03;//8分周・32分周・128分周・512分周
CMT3.CMCNT = 0;
//192MHz/2/512 = 187500 cycles
CMT3.CMCOR = 1875;// 10ms
ICU.IPR[7].BYTE = 0x06;
ICU.IER[3].BIT.IEN7 = 1;
}
//10msごとに割込み
void Excep_CMT3_CMI3(void){
cmt3_count++;
}
unsigned char getCmt3Count(void){
return cmt3_count;
}
void setCmt3Count(unsigned char val){
cmt3_count = val;
}
void timer10m(unsigned char time){
CMT3.CMCNT = 0;
cmt3_count = 0;
CMT.CMSTR1.BIT.STR3 = 1;
while(cmt3_count < time);
CMT3.CMCNT = 0;
cmt3_count = 0;
CMT.CMSTR1.BIT.STR3 = 0;
}
#include <stdio.h>
#include <math.h>
#include "iodefine.h"
#include "global.h"
#define SIN_MAX 256
#define RHYZM_MAX 26
void playSound(void);
void stopSound(void);
unsigned char ryzhmCnt = 0;
unsigned char nextRyzhmCntFlag = 0;
unsigned char nextMusicIntervalFlag = 0;
unsigned short sinNow = 0;
unsigned char volume = 0x01;
unsigned short musicFreq;
unsigned short musicSpeed = 10;
/* 256 c */
unsigned char sounds[] = {
127,130,133,136,139,142,145,148,
151,154,157,161,164,166,169,172,
175,178,181,184,187,189,192,195,
197,200,202,205,207,210,212,214,
217,219,221,223,225,227,229,231,
232,234,236,237,239,240,242,243,
244,245,246,247,248,249,250,251,
251,252,252,253,253,253,253,253,
253,253,253,253,253,252,252,251,
251,250,249,249,248,247,246,245,
243,242,241,239,238,236,235,233,
231,230,228,226,224,222,220,218,
215,213,211,209,206,204,201,199,
196,193,191,188,185,182,180,177,
174,171,168,165,162,159,156,153,
150,147,144,141,137,134,131,128,
126,123,120,117,113,110,107,104,
101,98,95,92,89,86,83,80,
77,74,72,69,66,63,61,58,
55,53,50,48,45,43,41,39,
36,34,32,30,28,26,24,23,
21,19,18,16,15,13,12,11,
9,8,7,6,5,5,4,3,
3,2,2,1,1,1,1,1,
1,1,1,1,1,2,2,3,
3,4,5,6,7,8,9,10,
11,12,14,15,17,18,20,22,
23,25,27,29,31,33,35,37,
40,42,44,47,49,52,54,57,
59,62,65,67,70,73,76,79,
82,85,88,90,93,97,100,103,
106,109,112,115,118,121,124,127
};
unsigned char soundInterval[] = {
191,//シ
180,//ド
159,//レ
142,//ミ
134,//ファ
120,//ソ
89,//ラ
95,//シ
90//ド
};
unsigned char musicMap[] = {
180, 159, 142, 134, 142, 159, 180, 142, 134, 120, 89, 120, 134, 142, 180, 180, 180, 180, 180,
180, 159, 159, 142, 142, 134, 134, 142, 159, 180
};
unsigned char songs[MUSICNUMBERMAX][100] = {
"ドレミファミレドミファソラソファミドドドドドドレレミミファファミレド",
"ドドレミミソミミレレドミミファソドラドソドドシラソララララソドドレミミソミミレレド",
"ララファレレミファレソラソファミレドララファレレミファレソラソミファ",
"ドミファソドミファソドミファソミドモレミミレドドミソソファミファソミドレド",
"ソファミレミファレドミファソミレミファレミファソミレミファレソファミレミファレド",
"ミソラソミソドドララソミドレミミソラソミソドドララソミレミドレミレソララソラドドシラソソミミソラソミソドドララソミレミド",
"ドレミドミドミミレレミファファミレファミファソミソミソファソララソファラソドレミファソララレミファソラシシミファソラシドドシラファシソドドシラソファミレ"
};
unsigned char rhyzm[RHYZM_MAX] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1, 0
};
/* playSoundState = 1 */
void playSound(void){
//int b = (int)(ceil(1.0f * sinNow /SIN_MAX));
//int a = rhyzm[(int)(5.0 * sinNow /SIN_MAX * RHYZM_MAX)];
//a = rhyzm[a];
DA.DADR0 = sounds[sinNow] * (volume / 4 + volume % 4) * rhyzm[(int)(1.0f * sinNow / SIN_MAX * RHYZM_MAX)];
//displayFlag = 1;
}
/* playSoundState = 0 */
void stopSound(void){
ryzhmCnt = 0;
nextRyzhmCntFlag = 0;
DA.DADR0 = 1023;
CMT.CMSTR0.BIT.STR1 = 0;
CMT1.CMCNT = 0;
sinNow = 0;
}
unsigned char myDiv(unsigned char a, unsigned char b){
unsigned char count=0;
while(count);
}
//Use CMT3・・・・・・
void playMusic(void){
//ドレミファミレドミファソラソファミドドドドドドレレミミファファミレド
static unsigned char ch = 0;
if(getCmt3Count() > musicSpeed){
if(ch < 28) ch++;
else ch = 0;
setCmt3Count(0);
}
CMT1.CMCOR = musicMap[ch] / 2; // / MUSIC_COST;
musicFreq = musicMap[ch];// 仮
playSound();
}
void playMusicX(unsigned char musicNumber){
const unsigned char chf = (unsigned char)strlen(songs[musicNumber]);
static unsigned char ch = 0;
if(getCmt3Count() > musicSpeed){
switch(songs[musicNumber][ch]){
case 'ト':
CMT1.CMCOR = 180 / MUSIC_COST;
musicFreq = 261;
ch++;
break;
case 'レ':
CMT1.CMCOR = 159 / MUSIC_COST;
musicFreq = 294;
break;
case 'ミ':
CMT1.CMCOR = 142 / MUSIC_COST;
musicFreq = 330;
break;
case 'フ':
CMT1.CMCOR = 134 / MUSIC_COST;
musicFreq = 350;
ch++;
break;
case 'ソ':
CMT1.CMCOR = 120 / MUSIC_COST;
musicFreq = 392;
break;
case 'ラ':
CMT1.CMCOR = 89 / MUSIC_COST;
musicFreq = 440;
break;
case 'シ':
CMT1.CMCOR = 95 / MUSIC_COST;
musicFreq = 494;
break;
}
if(ch < chf) ch++;
else ch = 0;
setCmt3Count(0);
}
playSound();
}
unsigned short getMusicFreq(void){
return musicFreq;
}
//if speed value is smaller, music speed is faster.
void setMusicSpeed(unsigned short speed){
if(speed < 1) speed = 1;
musicSpeed = speed;
}
unsigned short getMusicSpeed(void){
return musicSpeed;
}
void setVolume(unsigned char vol){
volume = vol;
}
//コンペアマッチタイマの設定
#include "vect.h"
#include "iodefine.h"
#include "global.h"
/*
「メモ」
96MHz / 512 = 187500 cycle/s
96MHz/8/440/256 ラの音
CMT0.CMCOR = 106;//5860, 46876 - 1;//23438-1;//10000ms //2929-1(1000ms)
「使用目的」
CMT0
CMT1
CMT2
CMT3 時間計測
*/
unsigned char cmt3_count;
unsigned char cmt0_count = 0;
//extern MAIN_STATE main_state;
//extern MODE_STATE mode_state;
extern unsigned char main_state;
extern unsigned char sub_state;
extern unsigned short sinNow;
void initCMT0(void);
void initCMT1(void);
void initCMT2(void);
void initCMT3(void);
void initCMT(void);
void timer10m(unsigned char);
void initCMT(void){
initCMT0();
initCMT1();
initCMT2();
initCMT3();
}
void initCMT0(void){
SYSTEM.PRCR.WORD = 0xA503;
SYSTEM.MSTPCRA.BIT.MSTPA15 = 0;//CMT0,1
SYSTEM.PRCR.WORD = 0xA500;
CMT.CMSTR0.BIT.STR0 = 0;
CMT0.CMCR.BIT.CMIE = 0x01;
CMT0.CMCR.BIT.CKS = 0x01;//8分周・32分周・128分周・512分周
CMT0.CMCNT = 0;
//192MHz/4/512 = 93750 cycles
CMT0.CMCOR = 9375;// 100ms
ICU.IPR[4].BYTE = 0x06;
ICU.IER[3].BIT.IEN4 = 1;
}
unsigned char getCmt0Count(void){
return cmt0_count;
}
void setCmt0Count(unsigned char val){
cmt0_count = val;
}
//100msごとに割り込み
void Excep_CMT0_CMI0(void){
if(main_state == 1){
if(sub_state == 0){
if(cmt0_count < 50){
cmt0_count++;
}else{
CMT.CMSTR0.BIT.STR1 = 0;
cmt0_count = 0;
}
}
}else if(main_state == 2){
S12AD.ADCSR.BIT.ADST = 1;
}
}
void initCMT1(void){
SYSTEM.PRCR.WORD = 0xA503;
SYSTEM.MSTPCRA.BIT.MSTPA15 = 0;//CMT0,1
SYSTEM.PRCR.WORD = 0xA500;
CMT.CMSTR0.BIT.STR1 = 0;
CMT1.CMCR.BIT.CMIE = 0x01;
CMT1.CMCR.BIT.CKS = 0x00;//8分周・32分周・128分周・512分周
CMT1.CMCNT = 0;
//192MHz/2/512 = 187500 cycles
//CMT1.CMCOR = 18750;// 100ms
CMT1.CMCOR = 20000;
ICU.IPR[5].BYTE = 0x03;
ICU.IER[3].BIT.IEN5 = 1;
}
//音周期用 6000000Hz
void Excep_CMT1_CMI1(void){
if(main_state == 1){
if(sinNow < 255) sinNow++;
else sinNow = 0;
if(sub_state == 0){
playSound();
}else if(sub_state == 1){
playMusicX(6);
}
}else if(main_state == 2){
if(sinNow < 255) sinNow++;
else sinNow = 0;
playMusicX(5);
}
}
void initCMT2(void){
SYSTEM.PRCR.WORD = 0xA503;
SYSTEM.MSTPCRA.BIT.MSTPA14 = 0;//CMT0,1
SYSTEM.PRCR.WORD = 0xA500;
CMT.CMSTR1.BIT.STR2 = 0;
CMT2.CMCR.BIT.CMIE = 0x01;
CMT2.CMCR.BIT.CKS = 0x03;//8分周・32分周・128分周・512分周
CMT2.CMCNT = 0;
//192MHz/4/512 = 12000000 cycles/s
//1cycle 83.333ns
//1μs -> 12
CMT2.CMCOR = 18750;// 100ms
ICU.IPR[6].BYTE = 0x06;
ICU.IER[3].BIT.IEN6 = 1;
}
void Excep_CMT2_CMI2(void){
}
void initCMT3(void){
SYSTEM.PRCR.WORD = 0xA503;
SYSTEM.MSTPCRA.BIT.MSTPA14 = 0;//CMT0,1
SYSTEM.PRCR.WORD = 0xA500;
CMT.CMSTR1.BIT.STR3 = 0;
CMT3.CMCR.BIT.CMIE = 0x01;
CMT3.CMCR.BIT.CKS = 0x03;//8分周・32分周・128分周・512分周
CMT3.CMCNT = 0;
//192MHz/2/512 = 187500 cycles
CMT3.CMCOR = 1875;// 10ms
ICU.IPR[7].BYTE = 0x06;
ICU.IER[3].BIT.IEN7 = 1;
}
//10msごとに割込み
void Excep_CMT3_CMI3(void){
cmt3_count++;
}
unsigned char getCmt3Count(void){
return cmt3_count;
}
void setCmt3Count(unsigned char val){
cmt3_count = val;
}
void timer10m(unsigned char time){
CMT3.CMCNT = 0;
cmt3_count = 0;
CMT.CMSTR1.BIT.STR3 = 1;
while(cmt3_count < time);
CMT3.CMCNT = 0;
cmt3_count = 0;
CMT.CMSTR1.BIT.STR3 = 0;
}
コメント
コメントを投稿