SP1は、スピーカーを用いて音を鳴らすプログラムである。この場を用いて、作成して下さった先輩に感謝。
タイマVを用いてパルス波を発生させ、GRAの値を変えて周波数を変化させることにより、音程を変化させる。
#define LEDCR IO.PCR8
#define LED IO.PDR8.BYTE
#define SWCR IO.PCR1
#define SW IO.PDR1.BYTE
#define SPCR IO.PCR7
#define SP IO.PDR7.BIT.B6
#include <3694.h>
void io_Init();
void timerv_init();
void menu_main();
void wait(unsigned long);
void all_emit();
void all_flash();
void up_count();
void down_count();
void music0();
void music1();
void soundTest();
void oto(char m,int x);
long z=300000; //基準となる4分音符の長さ(←可変)
int main(){
io_Init();
while(1){
menu_main();
}
return 0;
}
void wait(unsigned long n){
while(n--);
}
void io_Init(){
LEDCR=0xff; //LED
SWCR=0x00; //Switch
SPCR=0x40; //Speaker
}
void menu_main(){
unsigned int m=1;
while(SW&0x40){
LED=~m;
if(!(SW&0x10)){
if(m<6){
m++;
wait(100000);
}
}
if(!(SW&0x20)){
if(m>1){
m--;
wait(100000);
}
}
}
while(!(SW&0x40)){}
wait(30000);
switch(m){
case 1: all_emit();
case 2: all_flash();
case 3: up_count();
case 4: down_count();
case 5: music0();
case 6: music1();
default: soundTest();
}
wait(60000);
}
void all_emit(){
while(SW&0x40){
LED=0x00;
}
}
void all_flash(){
while(SW&0x40){
LED=0x00;
wait(40000);
LED=0xff;
wait(40000);
}
}
void up_count(){
unsigned int n=0;
while(n<0xff){
LED=~n;
wait(40000);
n++;
}
}
void down_count(){
unsigned int n=0xff;
while(n>0){
LED=~n;
wait(40000);
n--;
}
}
void timerv_init(){
TV.TCRV0.BYTE|=0x08; //コンペアマッチAでカウンタクリア
TV.TCSRV.BYTE|=0x13; //トグル出力
}
void music0(){
timerv_init();
while(1){ //この動作を無限に繰り返す
/*---------説明-------------
oto('音の高さ',音の長さ)
音の高さ 必ずクオーテーション(')で囲むこと!
c=ド,d=レ,e=ミ,f=ファ,g=ソ,a=ラ,b=シ,j=ド(オクターブ上)
音の長さ
4分音符を基準に。
注、休符は'k'
--------------------------*/
//以下、楽譜(どんどんいじって自分の曲を演奏させてください)
//tic=0;
int g[44][2]={ //ここで、全部で何音か記述しとかないとダメみたい
{'c',8},{'d',8},{'e',8},{'f',8},
{'e',8},{'d',8},{'c',8},{'k',8},
{'e',8},{'f',8},{'g',8},{'a',8},
{'g',8},{'f',8},{'e',8},{'k',8},
{'c',8}, {'k',8},
{'c',8}, {'k',8},
{'c',8}, {'k',8},
{'c',8}, {'k',8},
{'c',16}, {'k',32},
{'c',16}, {'k',32},
{'d',16}, {'k',32},
{'d',16}, {'k',32},
{'e',16}, {'k',32},
{'e',16}, {'k',32},
{'f',16}, {'k',32},
{'f',16}, {'k',32},
{'e',4},{'d',4},{'c',4},{'k',8}
};
int o;
for(o=0;o<44;o++){
oto(g[o][0],g[o][1]);
}
DI; //割り込み終了
}
}
void music1(){
timerv_init();
while(1){ //この動作を無限に繰り返す
int g[78][2]={ //ここで、全部で何音か記述しとかないとダメみたい
{'f',8},{'k',16},{'f',16},{'k',32},{'f',8},{'k',16},
{'f',16},{'k',32},{'f',8},{'k',16},{'f',16},{'k',32},
{'f',8},{'k',16},{'f',16},{'k',32}, //16
{'g',8},{'k',16},{'f',16},{'k',32},{'e',8},{'k',16},
{'d',16},{'k',32},{'c',4},{'k',4}, //10
{'f',8},{'k',16},{'f',16},{'k',32},{'f',4},{'k',16}, //6
{'f',8},{'k',16},{'f',16},{'k',32},{'f',4},{'k',16}, //6
{'a',8},{'k',16},{'f',16},{'k',32},{'g',8},{'k',16},
{'e',16},{'k',32}, {'f',4},{'k',16}, //10
{'f',8},{'k',16},{'f',16},{'k',32}, {'d',2},{'k',16}, //6
{'f',8},{'k',16},{'f',16},{'k',32}, {'c',2},{'k',8}, //6
{'c',8},{'k',16},{'d',16},{'k',32},{'d',8},{'k',16},
{'d',16},{'k',32}, {'d',8},{'k',16},{'d',16},{'k',16},
{'e',8},{'k',16},{'f',16},{'k',32},{'g',2},{'k',1}, //18
};
int o;
for(o=0;o<78;o++){
oto(g[o][0],g[o][1]);
}
DI; //割り込み終了
}
}
void oto(char m,int x){ //音関数(音の高さ,音の長さ)
switch(m){
case 'c': TV.TCORA=149; LED=~0x01;break;
case 'd': TV.TCORA=133; LED=~0x02;break;
case 'e': TV.TCORA=119; LED=~0x04;break;
case 'f': TV.TCORA=112; LED=~0x08;break;
case 'g': TV.TCORA=100; LED=~0x10;break;
case 'a': TV.TCORA=89; LED=~0x20;break;
case 'b': TV.TCORA=79; LED=~0x40;break;
case 'j': TV.TCORA=75; LED=~0x80;break;
case 'k': LED=~0x00;break;
}
if(m!='k'){ //休符以外の処理
EI; //割り込み許可
TV.TCRV0.BYTE|=0x03; //カウンタスタート周期Φ/64
}
unsigned long temp;
temp=z*4/x; //基準音から音の長さを決める
while(temp>0)temp--; //wait文。音の長さを決めてる
TV.TCRV0.BYTE&=~0x03; //カウンタストップ
DI; //割り込み終了
}
void soundTest(){
while(1){
SP=1;
wait(200);
SP=0;
wait(200);
}
}
・プログラムの解説
要望があったら作成予定
最終更新:2008年04月29日 00:54