SP1

「SP1」の編集履歴(バックアップ)一覧はこちら

SP1」(2008/04/29 (火) 00:54:05) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

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); } } &bold(){・プログラムの解説} 要望があったら作成予定
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); } } &bold(){・プログラムの解説} 要望があったら作成予定

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。