チーム1569
課題名
簡易型君が代演奏器
研究者名
Ryo Miyashita
Yuki Watabe
使用器具
・ジャンパ線
・PSoC基盤
・MINIPROG
・スピーカー
概要
今回作成した簡易型君が代演奏器はピアノが弾けない人でも歌詞(ローマ字)を入力するだけで君が代を簡単に演奏する事が出来るというものである。
最初の歌詞であるkiを入力すると演奏が始まる。正常に入力できると次の歌詞がディスプレイ上に表示される。これを繰り返して行くと君が代が演奏できる。
しかし、同じ文字は認識できないため重複している文字には文字の後ろに数字を表記してある。
仮に間違えるとディスプレイ上にはmissと表示され、音は変化しない。正しい入力が行われると次の音が出力される仕組みとなっている。
もし、間違えた単語がわからなくなってしまったり、予期せぬ音が出てしまった際はresetボタンで最初に戻る事が出来る。
プログラムの設計上、リズムをPSoC上では取れないためリズムは人間側が取ることになっている。
ソースとブロック図
#include <m8c.h> #include "PSoCAPI.h" int PW=125; int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, LL=102;
void main(void) { char * strPtr; char str1[] = "ki"; char str2[] = "mi"; char str3[] = "ga"; char str4[] = "a"; char str5[] = "yo"; char str6[] = "o"; char str7[] = "ha"; char str8[] = "ti"; char str9[] = "yo1"; char str10[] = "ni"; char str11[] = "i"; char str12[] = "i1"; char str13[] = "ya"; char str14[] = "ti1"; char str15[] = "yo2"; char str16[] = "ni1"; char str17[] = "sa"; char str18[] = "za"; char str19[] = "re"; char str20[] = "i2"; char str21[] = "si"; char str22[] = "no"; char str23[] = "i3"; char str24[] = "wa"; char str25[] = "o1"; char str26[] = "to"; char str27[] = "na"; char str28[] = "ri"; char str29[] = "te"; char str30[] = "ko"; char str31[] = "ke"; char str32[] = "no1"; char str33[] = "mu"; char str34[] = "u"; char str35[] = "su"; char str36[] = "u1"; char str37[] = "ma"; char str38[] = "a1"; char str39[] = "a2"; char str40[] = "de"; char str41[] = "end"; 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\nPSoC Synthesizer V1.1\r\n"); LCD_1_Start(); LCD_1_PrCString("Press ki!!");
while(1) { if(UART_bCmdCheck()) { if(strPtr = UART_szGetParam()) { UART_CPutString("Found valid command\r\nCommand =>"); UART_CPutString("<\r\nParamaters:\r\n"); LCD_1_Start(); LCD_1_PrCString("miss!!");
if (strcmp(strPtr,str1)==0){ PWM16_1_WritePeriod(L); LCD_1_Start(); LCD_1_PrCString("mi"); } if (strcmp(strPtr,str2)==0){ PWM16_1_WritePeriod(D); LCD_1_Start(); LCD_1_PrCString("ga"); } if (strcmp(strPtr,str3)==0){ PWM16_1_WritePeriod(L); LCD_1_Start(); LCD_1_PrCString("a"); } if (strcmp(strPtr,str4)==0){ PWM16_1_WritePeriod(M); LCD_1_Start(); LCD_1_PrCString("yo"); } if (strcmp(strPtr,str5)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("o"); } if (strcmp(strPtr,str6)==0){ PWM16_1_WritePeriod(M); LCD_1_Start(); LCD_1_PrCString("ha"); } if (strcmp(strPtr,str7)==0){ PWM16_1_WritePeriod(L); LCD_1_Start(); LCD_1_PrCString("ti"); } if (strcmp(strPtr,str8)==0){ PWM16_1_WritePeriod(M); LCD_1_Start(); LCD_1_PrCString("yo1"); } if (strcmp(strPtr,str9)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("ni"); } if (strcmp(strPtr,str10)==0){ PWM16_1_WritePeriod(R); LCD_1_Start(); LCD_1_PrCString("i"); } if (strcmp(strPtr,str11)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("i1"); } if (strcmp(strPtr,str12)==0){ PWM16_1_WritePeriod(R); LCD_1_Start(); LCD_1_PrCString("ya"); } if (strcmp(strPtr,str13)==0){ PWM16_1_WritePeriod(LL); LCD_1_Start(); LCD_1_PrCString("ti1"); } if (strcmp(strPtr,str14)==0){ PWM16_1_WritePeriod(C); LCD_1_Start(); LCD_1_PrCString("yo2"); } if (strcmp(strPtr,str15)==0){ PWM16_1_WritePeriod(R); LCD_1_Start(); LCD_1_PrCString("ni1"); } if (strcmp(strPtr,str16)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("sa"); } if (strcmp(strPtr,str17)==0){ PWM16_1_WritePeriod(M); LCD_1_Start(); LCD_1_PrCString("za"); } if (strcmp(strPtr,str18)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("re"); } if (strcmp(strPtr,str19)==0){ PWM16_1_WritePeriod(R); LCD_1_Start(); LCD_1_PrCString("i2"); } if (strcmp(strPtr,str20)==0){ PWM16_1_WritePeriod(LL); LCD_1_Start(); LCD_1_PrCString("si"); } if (strcmp(strPtr,str21)==0){ PWM16_1_WritePeriod(DD); LCD_1_Start(); LCD_1_PrCString("no"); } if (strcmp(strPtr,str22)==0){ PWM16_1_WritePeriod(LL); LCD_1_Start(); LCD_1_PrCString("i3"); } if (strcmp(strPtr,str23)==0){ PWM16_1_WritePeriod(M); LCD_1_Start(); LCD_1_PrCString("wa"); } if (strcmp(strPtr,str24)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("o1"); } if (strcmp(strPtr,str25)==0){ PWM16_1_WritePeriod(R); LCD_1_Start(); LCD_1_PrCString("to"); } if (strcmp(strPtr,str26)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("na"); } if (strcmp(strPtr,str27)==0){ PWM16_1_WritePeriod(M); LCD_1_Start(); LCD_1_PrCString("ri"); } if (strcmp(strPtr,str28)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("te"); } if (strcmp(strPtr,str29)==0){ PWM16_1_WritePeriod(L); LCD_1_Start(); LCD_1_PrCString("ko"); } if (strcmp(strPtr,str30)==0){ PWM16_1_WritePeriod(R); LCD_1_Start(); LCD_1_PrCString("ke"); } if (strcmp(strPtr,str31)==0){ PWM16_1_WritePeriod(DD); LCD_1_Start(); LCD_1_PrCString("no1"); } if (strcmp(strPtr,str32)==0){ PWM16_1_WritePeriod(LL); LCD_1_Start(); LCD_1_PrCString("mu"); } if (strcmp(strPtr,str33)==0){ PWM16_1_WritePeriod(DD); LCD_1_Start(); LCD_1_PrCString("u"); } if (strcmp(strPtr,str34)==0){ PWM16_1_WritePeriod(LL); LCD_1_Start(); LCD_1_PrCString("su"); } if (strcmp(strPtr,str35)==0){ PWM16_1_WritePeriod(R); LCD_1_Start(); LCD_1_PrCString("u1"); } if (strcmp(strPtr,str36)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("ma"); } if (strcmp(strPtr,str37)==0){ PWM16_1_WritePeriod(R); LCD_1_Start(); LCD_1_PrCString("a1"); } if (strcmp(strPtr,str38)==0){ PWM16_1_WritePeriod(S); LCD_1_Start(); LCD_1_PrCString("a2"); } if (strcmp(strPtr,str39)==0){ PWM16_1_WritePeriod(M); LCD_1_Start(); LCD_1_PrCString("de"); } if (strcmp(strPtr,str40)==0){ PWM16_1_WritePeriod(L); LCD_1_Start(); LCD_1_PrCString("end"); } if (strcmp(strPtr,str41)==0){ PWM16_1_WritePeriod(SILENT); LCD_1_Start(); LCD_1_PrCString("Thank you!!"); } } UART_CmdReset(); }
}
}
考察
strPtrはローマ字を一文字しか検知できないため前プログラムは単語としての認識が出来なかった。
単語として判断してもらうにはC言語で以前習ったstrcmpを用いればできると考えた。
入力された文字列と指定してある単語が同じであれば音および単語の出力がされるようにし、それを繰り返す。
これを映像を含めて応用すれば寿司打などのタイピングゲームも実現が可能であると考えた。
- 最終更新:2015-12-22 15:55:21