チーム1456
課題名
二部合唱
研究者名
Satoshi Kanai
Ayaka Kariyama
概要
2つのスピーカーを使用し、二部合唱の形で「栄光の架け橋」を演奏した。
また、歌詞が英文字としてLCD上に出力されるものとする。
使用機材
・PSoC基板
・ジャンパ線 - 2本
・スピーカー - 2個
ブロック図
ソースコード
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
int PW = 125;
int SILENT=0, D=229, L=204, M=182, F=172,Fs=162, S=153, Ss=145, R=136, Rs=129, C=121, DD=115, DDs=109, LLs=97, MM=91, FFs=82, SSs=73, RR=68;
double TC=0;
void myISR(void){
TC+=0.25; PWM16_1_WritePulseWidth(PW); PWM16_2_WritePulseWidth(PW); if(TC==1){ PWM16_1_WritePeriod(Ss); LCD_1_PrCString("i"); } else if(TC==3){ PWM16_1_WritePeriod(SSs); LCD_1_PrCString("ku"); } else if(TC==7){ PWM16_1_WritePeriod(FFs); LCD_1_PrCString("tsumo"); } else if(TC==9){ PWM16_1_WritePeriod(MM); } else if(TC==10.75){ PWM16_1_WritePeriod(SILENT); } else if(TC==11){ PWM16_1_WritePeriod(MM); PWM16_2_WritePeriod(DDs); LCD_1_PrCString("no"); } else if(TC==16.75) PWM16_2_WritePeriod(SILENT); else if(TC==17){ PWM16_1_WritePeriod(R); LCD_1_Position(1,0); LCD_1_PrCString("hi"); } else if(TC==19){ PWM16_1_WritePeriod(FFs); PWM16_2_WritePeriod(LLs); LCD_1_PrCString("bi"); } else if(TC==20){ PWM16_2_WritePeriod(FFs); LCD_1_PrCString("wo"); } else if(TC==20.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==21){ PWM16_1_WritePeriod(FFs); } else if(TC==23){ PWM16_1_WritePeriod(MM); PWM16_2_WritePeriod(MM); LCD_1_PrCString("ko"); } else if(TC==24){ PWM16_1_WritePeriod(FFs); LCD_1_PrCString("e"); } else if(TC==25) PWM16_2_WritePeriod(FFs); else if(TC==26){ PWM16_1_WritePeriod(SSs); PWM16_2_WritePeriod(MM); LCD_1_PrCString("te"); } else if(TC==32.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==33){ PWM16_1_WritePeriod(Ss); LCD_1_Control(0x01); LCD_1_PrCString("ta"); } else if(TC==35){ PWM16_1_WritePeriod(SSs); PWM16_2_WritePeriod(MM); LCD_1_PrCString("do"); } else if(TC==37.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==38){ PWM16_1_WritePeriod(SSs); PWM16_2_WritePeriod(MM); LCD_1_PrCString("ri"); } else if(TC==39){ PWM16_1_WritePeriod(FFs); PWM16_2_WritePeriod(LLs); LCD_1_PrCString("tsu"); } else if(TC==41){ PWM16_1_WritePeriod(MM); PWM16_2_WritePeriod(DDs); LCD_1_PrCString("i"); } else if(TC==42.75) PWM16_1_WritePeriod(SILENT); else if(TC==43){ PWM16_1_WritePeriod(MM); PWM16_2_WritePeriod(DDs); LCD_1_PrCString("ta"); } else if(TC==49){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(MM); LCD_1_Position(1,0); LCD_1_PrCString("i"); } else if(TC==51){ PWM16_2_WritePeriod(LLs); LCD_1_PrCString("ma"); } else if(TC==53){ PWM16_2_WritePeriod(DDs); LCD_1_PrCString("ga"); } else if(TC==54){ PWM16_2_WritePeriod(C); LCD_1_PrCString("a"); } else if(TC==55){ PWM16_1_WritePeriod(DDs); PWM16_2_WritePeriod(DDs); } else if(TC==56.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==57){ PWM16_1_WritePeriod(DDs); LCD_1_PrCString("ru"); } else if(TC==58){ PWM16_1_WritePeriod(C); } else if(TC==59) PWM16_2_WritePeriod(C); else if(TC==63){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==65){ PWM16_2_WritePeriod(SILENT); PWM16_1_WritePeriod(Ss); LCD_1_Control(0x01); LCD_1_PrCString("da"); } else if(TC==67){ PWM16_1_WritePeriod(SSs); PWM16_2_WritePeriod(DD); LCD_1_PrCString("ka"); } else if(TC==69.75) PWM16_1_WritePeriod(SILENT); else if(TC==70){ PWM16_1_WritePeriod(SSs); LCD_1_PrCString("ra"); } else if(TC==71){ PWM16_2_WritePeriod(SILENT); PWM16_1_WritePeriod(FFs); LCD_1_PrCString("mo"); } else if(TC==73) PWM16_1_WritePeriod(MM); else if(TC==74.75) PWM16_1_WritePeriod(SILENT); else if(TC==75){ PWM16_1_WritePeriod(MM); PWM16_2_WritePeriod(DDs); LCD_1_PrCString("u"); } else if(TC==80.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==81){ PWM16_2_WritePeriod(DDs); LCD_1_Position(1,0); LCD_1_PrCString("ma"); } else if(TC==82){ PWM16_2_WritePeriod(MM); LCD_1_PrCString("yo"); } else if(TC==83){ PWM16_1_WritePeriod(LLs); PWM16_2_WritePeriod(FFs); LCD_1_PrCString("wa"); } else if(TC==84.75) PWM16_2_WritePeriod(SILENT); else if(TC==85){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(FFs); LCD_1_PrCString("zu"); } else if(TC==85.75) PWM16_2_WritePeriod(SILENT); else if(TC==86){ PWM16_2_WritePeriod(FFs); LCD_1_PrCString("ni"); } else if(TC==88){ PWM16_2_WritePeriod(R); LCD_1_Control(0x01); LCD_1_PrCString("su"); } else if(TC==88.75) PWM16_2_WritePeriod(SILENT); else if(TC==89){ PWM16_1_WritePeriod(R); PWM16_2_WritePeriod(R); } else if(TC==91){ PWM16_1_WritePeriod(SSs); PWM16_2_WritePeriod(MM); LCD_1_PrCString("su"); } else if(TC==93){ PWM16_1_WritePeriod(FFs); LCD_1_PrCString("me"); } else if(TC==93.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==94){ PWM16_1_WritePeriod(FFs); PWM16_2_WritePeriod(FFs); LCD_1_PrCString("ba"); } else if(TC==97){ PWM16_1_WritePeriod(SSs); PWM16_2_WritePeriod(MM); LCD_1_PrCString("i"); } else if(TC==97.75){ PWM16_2_WritePeriod(SILENT); } else if(TC==98){ PWM16_2_WritePeriod(MM); LCD_1_PrCString("i"); } else if(TC==99){ PWM16_1_WritePeriod(MM); } else if(TC==101){ PWM16_1_WritePeriod(DDs); PWM16_2_WritePeriod(DDs); LCD_1_Position(1,0); LCD_1_PrCString("e"); } else if(TC==103){ PWM16_1_WritePeriod(LLs); PWM16_2_WritePeriod(C); LCD_1_PrCString("i"); } else if(TC==105){ PWM16_1_WritePeriod(MM); PWM16_2_WritePeriod(MM); LCD_1_PrCString("ko"); } else if(TC==107){ PWM16_1_WritePeriod(R); PWM16_2_WritePeriod(RR); LCD_1_PrCString("u"); } else if(TC==108.75){ PWM16_2_WritePeriod(SILENT); } else if(TC==109){ PWM16_2_WritePeriod(RR); LCD_1_PrCString("no"); } else if(TC==112.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==113){ PWM16_1_WritePeriod(R); LCD_1_Control(0x01); LCD_1_PrCString("ka"); } else if(TC==114.75){ PWM16_1_WritePeriod(SILENT); } else if(TC==115){ PWM16_1_WritePeriod(RR); PWM16_2_WritePeriod(LLs); LCD_1_PrCString("ke"); } else if(TC==117){ PWM16_1_WritePeriod(SSs); LCD_1_PrCString("ha"); } else if(TC==119){ PWM16_1_WritePeriod(FFs); LCD_1_PrCString("shi"); } else if(TC==121){ PWM16_1_WritePeriod(MM); LCD_1_PrCString("e"); } else if(TC==122.75){ PWM16_1_WritePeriod(SILENT); } else if(TC==123){ PWM16_1_WritePeriod(SSs); PWM16_2_WritePeriod(C); LCD_1_PrCString("to"); } else if(TC==132){ PWM16_1_WritePeriod(Rs); PWM16_2_WritePeriod(Fs); } else if(TC==136){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==138){ PWM16_1_WritePeriod(DDs); LCD_1_Control(0x01); LCD_1_PrCString("ki"); } else if(TC==139){ PWM16_1_WritePeriod(MM); LCD_1_PrCString("mi"); } else if(TC==140){ PWM16_1_WritePeriod(RR); PWM16_2_WritePeriod(DDs); LCD_1_PrCString("no"); } else if(TC==144.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==145){ PWM16_2_WritePeriod(DDs); LCD_1_PrCString(" ko"); } else if(TC==145.75){ PWM16_2_WritePeriod(SILENT); } else if(TC==146){ PWM16_2_WritePeriod(DDs); LCD_1_PrCString("ko"); } else if(TC==146.75){ PWM16_2_WritePeriod(SILENT); } else if(TC==147){ PWM16_2_WritePeriod(DDs); LCD_1_PrCString("ro"); } else if(TC==147.75){ PWM16_2_WritePeriod(SILENT); } else if(TC==148){ PWM16_1_WritePeriod(RR); PWM16_2_WritePeriod(DDs); LCD_1_PrCString("he"); } else if(TC==152.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==153){ PWM16_2_WritePeriod(DDs); LCD_1_Position(1,0); LCD_1_PrCString("tsu"); } else if(TC==153.75){ PWM16_2_WritePeriod(SILENT); } else if(TC==154){ PWM16_2_WritePeriod(DDs); LCD_1_PrCString("zu"); } else if(TC==155){ PWM16_1_WritePeriod(RR); PWM16_2_WritePeriod(LLs); LCD_1_PrCString("ku"); } else if(TC==158){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==160){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(R); LCD_1_Control(0x01); LCD_1_PrCString("ka"); } else if(TC==162){ PWM16_1_WritePeriod(RR); PWM16_2_WritePeriod(DDs); LCD_1_PrCString("ke"); } else if(TC==164){ PWM16_1_WritePeriod(SSs); PWM16_2_WritePeriod(C); LCD_1_PrCString("ha"); } else if(TC==166){ PWM16_1_WritePeriod(FFs); PWM16_2_WritePeriod(R); LCD_1_PrCString("shi"); } else if(TC==168){ PWM16_1_WritePeriod(MM); PWM16_2_WritePeriod(Ss); LCD_1_PrCString("e"); } else if(TC==169.75){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } else if(TC==170){ PWM16_1_WritePeriod(MM); PWM16_2_WritePeriod(Ss); LCD_1_PrCString("to"); } else if(TC==180){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); LCD_1_Control(0x01); LCD_1_PrCString("fin"); }
}
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. M8C_EnableGInt; PWM16_1_Start(); PWM16_2_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); Timer16_2_EnableInt(); Timer16_2_Start(); LCD_1_Start(); while(1) {};
}
考察
「栄光の架け橋」はmid2G(ソ)~hihiA(ラ)まで音階を必要とするため、
音階周波数とPWMクロック計算用スプレッドシートを参考にしながら、hiC(ド)より高い音階を作成した。
また、参考にしていたtimer_pwm2のクロック設定では早すぎたため、
Timerモジュールのクロックを調整し、割り込み回数を計るTC1つ分を16分音符1つと同等とした。つまり、TC2つ分で8分音符、TC4つ分で4分音符となる。
if文を用いてTCの値を指定することで音の長さを調節し、PWM16_1_WritePeriodを用いて音階を指定し演奏を実現した。
文字の表示については、歌詞を順にLCDに表示させようとしたが16文字目以降が表示されなかったため
歌詞の区切りごとに改行し、2行埋まった場合は初期化することで再度表示させることにした。
二部に限らず三部、四部の合唱を実現してみたかったが、PSoCが容量不足であることと、時間が足りなかったことからできなかった。
- 最終更新:2014-11-18 16:28:55