チーム1657
課題名
CP(CM-Song Player)
研究者名
- Shuto Sakamoto
- Seina Takahara
- Miki Toda
使用した機器
- PSoC基盤 1個
- MiniProg 1個
- スピーカー 1個
- ジャンパ線 4本
- シリアル通信ケーブル 1本
内容
指定されたキーボードを押すと、音楽が再生される。収録曲は3曲である。”a”を押すと「ヤマハ音楽教室のCMソング」、”s”を押すと「キューピー3分クッキングのテーマソング」、”d”を押すと「富士サファリパークのキャッチフレーズの音程」が再生される。音楽が再生されると、LCDにそれぞれ「YAMAHA CM Song」「3m Cooking」「Fuji Safari Park」と出力される。
また、”j”を押すと連続再生モードに変更され、”k”を押すと一時停止、”l”を押すと強制終了される。
ソースコード
#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,Dd=217,L=204,Ll=193,M=182,F=172,Ff=162,S=153,Ss=145,R=136,Rr=129,C=121,DD=115,LL=102,MM=91,SS=77;
int TC = 0,n = 0,tmpTC = 1,tmpn = 0,PlayBack = 1,Repeat = 0,count = 1;
void myISR(void)
{
if(n == 1){
Timer16_1_WritePeriod(7777);
TC += 1;
PWM16_1_WritePulseWidth(PW);
if(TC==1) { PWM16_1_WritePeriod(D); UART_CPutString("\r\nヤマハの歌\r\n");}//ド
else if(TC==3) PWM16_1_WritePeriod(L);//レ
else if(TC==5) PWM16_1_WritePeriod(M);//ミ
else if(TC==7) PWM16_1_WritePeriod(F);//ファ
else if(TC==9) PWM16_1_WritePeriod(S);//ソー
else if(TC==13) PWM16_1_WritePeriod(R);//ラ
else if(TC==15) PWM16_1_WritePeriod(F);//ファ
else if(TC==17) PWM16_1_WritePeriod(M);//ミ
else if(TC==19) PWM16_1_WritePeriod(SILENT);
else if(TC==21) PWM16_1_WritePeriod(L);//レ
else if(TC==23) PWM16_1_WritePeriod(SILENT);
else if(TC==25) PWM16_1_WritePeriod(D);//ド
else if(TC==28) PWM16_1_WritePeriod(SILENT);
else if(TC==29) PWM16_1_WritePeriod(S);//ソ
else if(TC==32) PWM16_1_WritePeriod(F);//ファ
else if(TC==33) PWM16_1_WritePeriod(M);//ミ
else if(TC==34) PWM16_1_WritePeriod(SILENT);
else if(TC==35) PWM16_1_WritePeriod(S);//ソ
else if(TC==37) PWM16_1_WritePeriod(F);//ファ
else if(TC==39) PWM16_1_WritePeriod(M);//ミ
else if(TC==41) PWM16_1_WritePeriod(L);//レ
else if(TC==44) PWM16_1_WritePeriod(SILENT);
else if(TC==45) PWM16_1_WritePeriod(S);//ソ
else if(TC==48) PWM16_1_WritePeriod(F);//ファ
else if(TC==49) PWM16_1_WritePeriod(M);//ミ
else if(TC==50) PWM16_1_WritePeriod(SILENT);
else if(TC==51) PWM16_1_WritePeriod(S);//ソ
else if(TC==53) PWM16_1_WritePeriod(F);//ファ
else if(TC==55) PWM16_1_WritePeriod(M);//ミ
else if(TC==57) PWM16_1_WritePeriod(L);//レ
else if(TC==60) PWM16_1_WritePeriod(SILENT);
else if(TC==61) PWM16_1_WritePeriod(D);//ド
else if(TC==63) PWM16_1_WritePeriod(L);//レ
else if(TC==65) PWM16_1_WritePeriod(M);//ミ
else if(TC==67) PWM16_1_WritePeriod(F);//ファ
else if(TC==69) PWM16_1_WritePeriod(S);//ソー
else if(TC==73) PWM16_1_WritePeriod(R);//ラ
else if(TC==75) PWM16_1_WritePeriod(F);//ファ
else if(TC==77) PWM16_1_WritePeriod(M);//ミ
else if(TC==79) PWM16_1_WritePeriod(SILENT);
else if(TC==81) PWM16_1_WritePeriod(L);//レ
else if(TC==83) PWM16_1_WritePeriod(SILENT);
else if(TC==85) PWM16_1_WritePeriod(D);//ド
else if(TC==89) PWM16_1_WritePeriod(SILENT);
else if(TC==90 && Repeat==1) TC = 0;
}
else if(n == 2){
Timer16_1_WritePeriod(3000);
TC += 1;
PWM16_1_WritePulseWidth(PW);
if(TC==1) PWM16_1_WritePeriod(S);//ソ
else if(TC==2) PWM16_1_WritePeriod(SILENT);
else if(TC==3) PWM16_1_WritePeriod(S);//ソ
else if(TC==4) PWM16_1_WritePeriod(SILENT);
else if(TC==5) PWM16_1_WritePeriod(M);//ミー
else if(TC==10) PWM16_1_WritePeriod(SILENT);
else if(TC==11) PWM16_1_WritePeriod(S);//ソー
else if(TC==16) PWM16_1_WritePeriod(SILENT);
else if(TC==17) PWM16_1_WritePeriod(S);//ソーー
else if(TC==25) PWM16_1_WritePeriod(SILENT);
else if(TC==27) PWM16_1_WritePeriod(S);//ソ
else if(TC==28) PWM16_1_WritePeriod(SILENT);
else if(TC==29) PWM16_1_WritePeriod(S);//ソ
else if(TC==30) PWM16_1_WritePeriod(SILENT);
else if(TC==31) PWM16_1_WritePeriod(F);//ファー
else if(TC==36) PWM16_1_WritePeriod(SILENT);
else if(TC==37) PWM16_1_WritePeriod(S);//ソー
else if(TC==42) PWM16_1_WritePeriod(SILENT);
else if(TC==43) PWM16_1_WritePeriod(S);//ソーー
else if(TC==51) PWM16_1_WritePeriod(SILENT);
else if(TC==52) PWM16_1_WritePeriod(S);//ソ
else if(TC==53) PWM16_1_WritePeriod(SILENT);
else if(TC==54) PWM16_1_WritePeriod(S);//ソ
else if(TC==55) PWM16_1_WritePeriod(SILENT);
else if(TC==56) PWM16_1_WritePeriod(M);//ミー
else if(TC==61) PWM16_1_WritePeriod(SILENT);
else if(TC==62) PWM16_1_WritePeriod(S);//ソー
else if(TC==67) PWM16_1_WritePeriod(SILENT);
else if(TC==68) PWM16_1_WritePeriod(C);//シー
else if(TC==73) PWM16_1_WritePeriod(SILENT);
else if(TC==74) PWM16_1_WritePeriod(R);//ラー
else if(TC==79) PWM16_1_WritePeriod(SILENT);
else if(TC==80) PWM16_1_WritePeriod(S);//ソ
else if(TC==82) PWM16_1_WritePeriod(SILENT);
else if(TC==83) PWM16_1_WritePeriod(Ff);//ファ#
else if(TC==85) PWM16_1_WritePeriod(SILENT);
else if(TC==86) PWM16_1_WritePeriod(F);//ファ
else if(TC==88) PWM16_1_WritePeriod(SILENT);
else if(TC==89) PWM16_1_WritePeriod(M);//ミ
else if(TC==91) PWM16_1_WritePeriod(SILENT);
else if(TC==92) PWM16_1_WritePeriod(L);//レー
else if(TC==97) PWM16_1_WritePeriod(SILENT);
else if(TC==100) PWM16_1_WritePeriod(S);//ソ
else if(TC==101) PWM16_1_WritePeriod(SILENT);
else if(TC==102) PWM16_1_WritePeriod(S);//ソ
else if(TC==103) PWM16_1_WritePeriod(SILENT);
else if(TC==104) PWM16_1_WritePeriod(M);//ミー
else if(TC==109) PWM16_1_WritePeriod(SILENT);
else if(TC==110) PWM16_1_WritePeriod(S);//ソー
else if(TC==115) PWM16_1_WritePeriod(SILENT);
else if(TC==116) PWM16_1_WritePeriod(S);//ソーー
else if(TC==124) PWM16_1_WritePeriod(SILENT);
else if(TC==125) PWM16_1_WritePeriod(S);//ソ
else if(TC==126) PWM16_1_WritePeriod(SILENT);
else if(TC==127) PWM16_1_WritePeriod(S);//ソ
else if(TC==128) PWM16_1_WritePeriod(SILENT);
else if(TC==129) PWM16_1_WritePeriod(F);//ファー
else if(TC==134) PWM16_1_WritePeriod(SILENT);
else if(TC==135) PWM16_1_WritePeriod(R);//ラー
else if(TC==140) PWM16_1_WritePeriod(SILENT);
else if(TC==141) PWM16_1_WritePeriod(R);//ラー
else if(TC==146) PWM16_1_WritePeriod(SILENT);
else if(TC==147) PWM16_1_WritePeriod(DD);//ドー
else if(TC==152) PWM16_1_WritePeriod(SILENT);
else if(TC==153) PWM16_1_WritePeriod(MM);//ミーー
else if(TC==163) PWM16_1_WritePeriod(SILENT);
else if(TC==164) PWM16_1_WritePeriod(LL);//レーー
else if(TC==174) PWM16_1_WritePeriod(SILENT);
else if(TC==175) PWM16_1_WritePeriod(DD);//ドーー
else if(TC==185) PWM16_1_WritePeriod(SILENT);
else if(TC==186 && Repeat==1) TC = 0;
}
else if(n == 3){
Timer16_1_WritePeriod(3000);
TC += 1;
PWM16_1_WritePulseWidth(PW);
if(TC==1){ PWM16_1_WritePeriod(Ss);
UART_CPutString("\r\n富士~♪\r\n"); }//フ
else if(TC==5) PWM16_1_WritePeriod(F);//ジー
else if(TC==24) PWM16_1_WritePeriod(SILENT);
else if(TC==25){ PWM16_1_WritePeriod(D);
UART_CPutString("\r\nサファリパ~ク!!\r\n"); }//サ
else if(TC==30) PWM16_1_WritePeriod(L);//ファ
else if(TC==35) PWM16_1_WritePeriod(M);//リ
else if(TC==40) PWM16_1_WritePeriod(S);//パー
else if(TC==55) PWM16_1_WritePeriod(F);//ク
else if(TC==60) PWM16_1_WritePeriod(SILENT);
else if(TC==61 && Repeat==1) TC = 0;
}
else if(n == 6){
PWM16_1_WritePeriod(SILENT);
}
}
void main(void)
{
char *strPtr; LCD_Start();
LCD_PrCString("Ready");
UART_CmdReset();
UART_IntCntl(UART_ENABLE_RX_INT);
Counter8_WritePeriod(155); Counter8_WriteCompareValue(77); Counter8_Start(); UART_Start(UART_PARITY_NONE); M8C_EnableGInt; PWM16_1_Start(); UART_CPutString("\r\n[[ M U S I C P L A Y E R ]]\r\n"); UART_CPutString("\r\na:ヤマハのCM\r\n"); UART_CPutString("\r\ns:3分クッキング\r\n"); UART_CPutString("\r\nd:富士サファリパーク\r\n"); UART_CPutString("\r\nj:リピートON/OFF\r\n"); UART_CPutString("\r\nk:一時停止/再生\r\n"); UART_CPutString("\r\nl:強制終了\r\n"); while(1){ if(UART_bCmdCheck()){ if(strPtr = UART_szGetParam()){ UART_CPutString("Found valid command\r\nCommand =>"); UART_PutString(strPtr); UART_CPutString("<\r\n\r\n"); if(*strPtr=='a'){ LCD_Init(); LCD_PrCString("YAMAHA CM Song "); n = 1; PlayBack = 1; Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(*strPtr=='s') { UART_CPutString("\r\nキューピー3分クッキング~♪:\r\n"); LCD_Init(); LCD_PrCString("3m Cooking "); n = 2; PlayBack = 1; Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(*strPtr=='d') { LCD_Init(); LCD_PrCString("Fuji Safari Park "); n = 3; PlayBack = 1; Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; }
else if(*strPtr=='j'){ count++; if(count%2 == 0){ UART_CPutString("\r\n~リピートON~\r\n"); Repeat = 1; } else { UART_CPutString("\r\nリピートOFF\r\n"); Repeat = 0; } } else if(*strPtr=='k') { if(PlayBack == 1){ UART_CPutString("\r\n~一時停止~\r\n"); PlayBack = 0; tmpTC = TC; tmpn = n; TC = 0; n = 0; PWM16_1_WritePeriod(SILENT); } else { UART_CPutString("\r\n~再生~\r\n"); PlayBack = 1; n = tmpn; TC = tmpTC; } } else if(*strPtr=='l'){ n = 6; Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } } UART_CmdReset(); } }
}
考察
今回参考にしたのはLCDへの表示、割り込み処理による音階の出力、PC制御PWMである。
曲目は多くの人が聞いたことのあるものにし親しみを覚えやすくした。
今回の制作物では単音が出力される仕組みのため、音に厚みが感じられない。ソースに和音を出すメソッドを実装すれば和音を出すこともできたが、1つのスピーカーでは迫力があまりなく、複数のスピーカーを接続したら立体感のある和音を出力できるのではないかと考えられる。
- 最終更新:2016-11-22 15:54:47