チーム1869
課題名
Mini SE player
研究者名
Yuta Arauchi
Takahiro Kawano
Suzuyo Ohara
概要
ディスプレイに表示された曲を選択すると...
なんと!おなじみのSEが再生されます!
さらに!!一時停止やリピート機能も搭載!
使用機器
PSoC基盤 1個
MiniProg 1個
スピーカー 1個
ジャンパ線 4本
シリアル通信ケーブル 1本
仕様
a:お風呂の呼び出し音
s:ドラクエのレベルアップ音
d: LINEの着信音
f:チャイム
j:リピート再生(ON/OFF)
k:一時停止・再生
l:強制終了
キーを押すと対応したSEが流れたり、機能が使用できます。
ソースコード
#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,FF=86,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(SILENT);}
else if(TC==3) PWM16_1_WritePeriod(S);
else if(TC==5) PWM16_1_WritePeriod(F);
else if(TC==7) PWM16_1_WritePeriod(M);
else if(TC==11) PWM16_1_WritePeriod(S);
else if(TC==13) PWM16_1_WritePeriod(DD);
else if(TC==15) PWM16_1_WritePeriod(C);
else if(TC==19) PWM16_1_WritePeriod(S);
else if(TC==21) PWM16_1_WritePeriod(LL);
else if(TC==23) PWM16_1_WritePeriod(DD);
else if(TC==27) PWM16_1_WritePeriod(MM);
else if(TC==35) PWM16_1_WritePeriod(DD);
else if(TC==37) PWM16_1_WritePeriod(C);
else if(TC==39) PWM16_1_WritePeriod(R);
else if(TC==43) PWM16_1_WritePeriod(FF);
else if(TC==45) PWM16_1_WritePeriod(LL);
else if(TC==47) PWM16_1_WritePeriod(DD);
else if(TC==51) PWM16_1_WritePeriod(C);
else if(TC==55) PWM16_1_WritePeriod(DD);
else if(TC==57) PWM16_1_WritePeriod(S);
else if(TC==59) PWM16_1_WritePeriod(S);
else if(TC==61) PWM16_1_WritePeriod(F);
else if(TC==63) PWM16_1_WritePeriod(M);
else if(TC==71) PWM16_1_WritePeriod(SILENT);
else if(TC==72) UART_CPutString("\r\nお風呂が沸きました\r\n");
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(F);UART_CPutString("\r\nレベルアップ!!\r\n");}
else if(TC==2) PWM16_1_WritePeriod(SILENT);
else if(TC==3) PWM16_1_WritePeriod(F);
else if(TC==4) PWM16_1_WritePeriod(SILENT);
else if(TC==5) PWM16_1_WritePeriod(F);
else if(TC==6) PWM16_1_WritePeriod(SILENT);
else if(TC==7) PWM16_1_WritePeriod(F);
else if(TC==9) PWM16_1_WritePeriod(SILENT);
else if(TC==13) PWM16_1_WritePeriod(Ll);
else if(TC==15) PWM16_1_WritePeriod(SILENT);
else if(TC==19) PWM16_1_WritePeriod(S);
else if(TC==21) PWM16_1_WritePeriod(SILENT);
else if(TC==25) PWM16_1_WritePeriod(F);
else if(TC==32) PWM16_1_WritePeriod(SILENT);
else if(TC==50 && Repeat==1) TC = 0;
}
else if(n == 3){
Timer16_1_WritePeriod(3000);
TC += 1;
PWM16_1_WritePulseWidth(PW);
if(TC==1) {PWM16_1_WritePeriod(F);UART_CPutString("\r\n~♪♪\r\n");}
else if(TC==4) PWM16_1_WritePeriod(SILENT);
else if(TC==5) PWM16_1_WritePeriod(S);
else if(TC==8) PWM16_1_WritePeriod(SILENT);
else if(TC==9) PWM16_1_WritePeriod(DD);
else if(TC==12) PWM16_1_WritePeriod(SILENT);
else if(TC==13) PWM16_1_WritePeriod(F);
else if(TC==16) PWM16_1_WritePeriod(SILENT);
else if(TC==17) PWM16_1_WritePeriod(S);
else if(TC==20) PWM16_1_WritePeriod(SILENT);
else if(TC==21) PWM16_1_WritePeriod(C);
else if(TC==24) PWM16_1_WritePeriod(SILENT);
else if(TC==25) PWM16_1_WritePeriod(S);
else if(TC==28) PWM16_1_WritePeriod(SILENT);
else if(TC==29) PWM16_1_WritePeriod(R);
else if(TC==32) PWM16_1_WritePeriod(SILENT);
else if(TC==33) PWM16_1_WritePeriod(LL);
else if(TC==36) PWM16_1_WritePeriod(SILENT);
else if(TC==37) PWM16_1_WritePeriod(F);
else if(TC==40) PWM16_1_WritePeriod(SILENT);
else if(TC==41) PWM16_1_WritePeriod(S);
else if(TC==44) PWM16_1_WritePeriod(SILENT);
else if(TC==45) PWM16_1_WritePeriod(M);
else if(TC==46) PWM16_1_WritePeriod(S);
else if(TC==47) PWM16_1_WritePeriod(DD);
else if(TC==50) PWM16_1_WritePeriod(SILENT);
else if(TC==70) TC = 0;
}
else if(n == 4){
Timer16_1_WritePeriod(3000);
TC += 1;
PWM16_1_WritePulseWidth(PW);
if(TC==1) {PWM16_1_WritePeriod(R);UART_CPutString("\r\nはい、席について~\r\n");}
else if(TC==9) PWM16_1_WritePeriod(F);
else if(TC==17) PWM16_1_WritePeriod(S);
else if(TC==25) PWM16_1_WritePeriod(D);
else if(TC==41) PWM16_1_WritePeriod(SILENT);
else if(TC==49) PWM16_1_WritePeriod(D);
else if(TC==57) PWM16_1_WritePeriod(S);
else if(TC==65) PWM16_1_WritePeriod(R);
else if(TC==73) PWM16_1_WritePeriod(F);
else if(TC==89) PWM16_1_WritePeriod(SILENT);
else if(TC==90 && 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[[ S E P L A Y E R ]]\r\n"); UART_CPutString("\r\na:お風呂\r\n"); UART_CPutString("\r\ns:レベルアップ\r\n"); UART_CPutString("\r\nd:LINE 着信音\r\n"); UART_CPutString("\r\nf:チャイム\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("OFURO WAITAYO!"); n = 1; PlayBack = 1; Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(*strPtr=='s') { LCD_Init(); LCD_PrCString("Dragon Quest Lv"); n = 2; PlayBack = 1; Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(*strPtr=='d') { LCD_Init(); LCD_PrCString("LINE telephone"); n = 3; PlayBack = 1; Timer16_1_EnableInt(); Timer16_1_Start(); TC = 0; } else if(*strPtr=='f') { LCD_Init(); LCD_PrCString("Chime"); n = 4; 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である。
曲目は多くの人が聞いたことのあるものにし親しみを覚えやすくした。
曲選択のときいちいちEnterを押さないと動作しないのは面倒である。それを改善するためには、外部スイッチを用いて対応したボタンを押すだけで動作するような仕様にすれば良いと考えられる。これは割り込みを駆使しなければならなかったので、実現には至らなかった。
VRによる電圧変化を用いれば、スピーカーの音量を上げたり下げたりが可能になったと考えられる。
- 最終更新:2019-01-08 14:29:02