チーム2136
課題名
ピッタシンガーもどき
研究者名
Mio Yagihashi
Mio Yamamoto
概要
某バラエティ番組のピッタシンガーを模したゲームである。
キーボードからコマンドを入力をするとそのコマンドに対応した曲が流れる。コマンドkを入力すると曲が止まる。押したタイミングによって成功か失敗かが表示される。押すタイミングは曲のサビが終了したタイミングである。曲とコマンドの対応は次の通りである。
a:恋/星野源
s:Love so sweet/嵐
d:Happiness/嵐
k:stop
また、キーボードから違うコマンドが入力された場合は"Found invalid command"と出力され、再び入力を求められる。
止めるときのコツ:先にコマンドkを入力しておき、サビが終了だと思うタイミングでEnterキーのみを押すと成功しやすい。
成功すると"Safe!"と表示され、失敗すると"OUT"と表示される。成功基準は曲のサビ終了のタイミングから前後4クロック以内かである。
使用機器
PSoC基盤
PSoC MiniProg
スピーカー
ジャンパー線 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; // Pulse Width
int SILENT=0, OR=273, ORS=257, OC=243, D=229, DS=216, L=204, LS=193, M=182, F=172, FS=162, S=153, SS=144, R=136, RS=128, C=121, DO=115;
int TC=0; //Time Count
int n = 5;
int pre_n = 0;
int stop = 0;
int time = 0;
void myISR(void)
{
if (n==0){
PWM16_1_WritePeriod(SILENT);
}
else if (n==1){
TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);
if(TC == 1)
PWM16_1_WritePeriod(DS);
else if(TC == 2)
PWM16_1_WritePeriod(M);
else if (TC == 3)
PWM16_1_WritePeriod(DS);
else if(TC == 4)
PWM16_1_WritePeriod(M);
else if(TC == 5)
PWM16_1_WritePeriod(FS);
else if (TC == 7)
PWM16_1_WritePeriod(M);
else if(TC == 8)
PWM16_1_WritePeriod(DS);
else if(TC == 9)
PWM16_1_WritePeriod(OR);
else if (TC == 11)
PWM16_1_WritePeriod(OC);
else if (TC == 13)
PWM16_1_WritePeriod(DS);
else if (TC == 15)
PWM16_1_WritePeriod(SILENT);
else if (TC == 17)
PWM16_1_WritePeriod(DS);
else if(TC == 18)
PWM16_1_WritePeriod(M);
else if (TC == 19)
PWM16_1_WritePeriod(DS);
else if (TC == 20)
PWM16_1_WritePeriod(R);
else if (TC == 21)
PWM16_1_WritePeriod(SS);
else if (TC == 23)
PWM16_1_WritePeriod(FS);
else if (TC == 24)
PWM16_1_WritePeriod(M);
else if (TC == 25)
PWM16_1_WritePeriod(FS);
else if (TC == 27)
PWM16_1_WritePeriod(M);
else if (TC == 29)
PWM16_1_WritePeriod(OR);
else if (TC == 31)
PWM16_1_WritePeriod(OC);
else if (TC == 33)
PWM16_1_WritePeriod(DS);
else if(TC == 34)
PWM16_1_WritePeriod(M);
else if (TC == 35)
PWM16_1_WritePeriod(DS);
else if(TC == 36)
PWM16_1_WritePeriod(M);
else if(TC == 37)
PWM16_1_WritePeriod(FS);
else if (TC == 39)
PWM16_1_WritePeriod(M);
else if(TC == 40)
PWM16_1_WritePeriod(DS);
else if(TC == 41)
PWM16_1_WritePeriod(OR);
else if (TC == 43)
PWM16_1_WritePeriod(OC);
else if (TC == 45)
PWM16_1_WritePeriod(DS);
else if (TC == 47)
PWM16_1_WritePeriod(SILENT);
else if (TC == 48)
PWM16_1_WritePeriod(OR);
else if (TC == 51)
PWM16_1_WritePeriod(OC);
else if (TC == 53)
PWM16_1_WritePeriod(DS);
else if (TC == 55)
PWM16_1_WritePeriod(OR);
else if (TC == 56)
PWM16_1_WritePeriod(FS);
else if (TC == 58)
PWM16_1_WritePeriod(M);
else if (TC == 59)
PWM16_1_WritePeriod(M);
else if (TC == 60)
PWM16_1_WritePeriod(FS);
else if (TC == 61)
PWM16_1_WritePeriod(M);
else if (TC == 63)
PWM16_1_WritePeriod(SILENT);
else if (TC == 65)
PWM16_1_WritePeriod(DS);
else if(TC == 66)
PWM16_1_WritePeriod(M);
else if (TC == 67)
PWM16_1_WritePeriod(DS);
else if(TC == 68)
PWM16_1_WritePeriod(M);
else if(TC == 69)
PWM16_1_WritePeriod(FS);
else if (TC == 71)
PWM16_1_WritePeriod(M);
else if(TC == 72)
PWM16_1_WritePeriod(DS);
else if(TC == 73)
PWM16_1_WritePeriod(OR);
else if (TC == 75)
PWM16_1_WritePeriod(OC);
else if (TC == 77)
PWM16_1_WritePeriod(DS);
else if (TC >= 79)
PWM16_1_WritePeriod(SILENT);
}
else if (n == 2) {
TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);
if(TC == 1)
PWM16_1_WritePeriod(M);
else if (TC == 3)
PWM16_1_WritePeriod(L);
else if (TC == 4)
PWM16_1_WritePeriod(L);
else if (TC == 5)
PWM16_1_WritePeriod(D);
else if (TC == 6)
PWM16_1_WritePeriod(D);
else if (TC == 7)
PWM16_1_WritePeriod(SILENT);
else if (TC == 8)
PWM16_1_WritePeriod(S);
else if (TC == 9)
PWM16_1_WritePeriod(D);
else if (TC == 10)
PWM16_1_WritePeriod(SILENT);
else if (TC == 11)
PWM16_1_WritePeriod(S);
else if (TC == 12)
PWM16_1_WritePeriod(SILENT);
else if (TC == 13)
PWM16_1_WritePeriod(S);
else if (TC == 15)
PWM16_1_WritePeriod(F);
else if (TC == 16)
PWM16_1_WritePeriod(M);
else if (TC == 17)
PWM16_1_WritePeriod(F);
else if (TC == 18)
PWM16_1_WritePeriod(M);
else if (TC == 20)
PWM16_1_WritePeriod(L);
else if (TC == 21)
PWM16_1_WritePeriod(D);
else if (TC == 22)
PWM16_1_WritePeriod(D);
else if (TC == 23)
PWM16_1_WritePeriod(SILENT);
else if (TC == 24)
PWM16_1_WritePeriod(S);
else if (TC == 25)
PWM16_1_WritePeriod(D);
else if (TC == 26)
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(R);
else if (TC == 31)
PWM16_1_WritePeriod(M);
else if (TC == 32)
PWM16_1_WritePeriod(L);
else if (TC == 33)
PWM16_1_WritePeriod(M);
else if (TC == 34)
PWM16_1_WritePeriod(M);
else if (TC == 36)
PWM16_1_WritePeriod(L);
else if (TC == 37)
PWM16_1_WritePeriod(D);
else if (TC == 38)
PWM16_1_WritePeriod(SILENT);
else if (TC == 39)
PWM16_1_WritePeriod(OR);
else if (TC == 40)
PWM16_1_WritePeriod(OC);
else if (TC == 41)
PWM16_1_WritePeriod(D);
else if (TC == 43)
PWM16_1_WritePeriod(OR);
else if (TC == 44)
PWM16_1_WritePeriod(OC);
else if (TC == 45)
PWM16_1_WritePeriod(D);
else if (TC == 47)
PWM16_1_WritePeriod(L);
else if (TC == 48)
PWM16_1_WritePeriod(M);
else if (TC == 49)
PWM16_1_WritePeriod(D);
else if (TC == 50)
PWM16_1_WritePeriod(SILENT);
else if (TC == 51)
PWM16_1_WritePeriod(M);
else if (TC == 53)
PWM16_1_WritePeriod(M);
else if (TC == 54)
PWM16_1_WritePeriod(F);
else if (TC == 56)
PWM16_1_WritePeriod(M);
else if (TC == 57)
PWM16_1_WritePeriod(L);
else if (TC == 59)
PWM16_1_WritePeriod(D);
else if (TC == 60)
PWM16_1_WritePeriod(D);
else if (TC == 61)
PWM16_1_WritePeriod(M);
else if (TC == 63)
PWM16_1_WritePeriod(F);
else if (TC == 64)
PWM16_1_WritePeriod(M);
else if (TC == 65)
PWM16_1_WritePeriod(M);
else if (TC == 66)
PWM16_1_WritePeriod(L);
else if (TC >= 68)
PWM16_1_WritePeriod(SILENT);
}
else if (n == 3) {
TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);
if(TC == 1)
PWM16_1_WritePeriod(F);
else if (TC == 3)
PWM16_1_WritePeriod(FS);
else if (TC == 5)
PWM16_1_WritePeriod(F);
else if (TC == 7)
PWM16_1_WritePeriod(LS);
else if (TC == 9)
PWM16_1_WritePeriod(DS);
else if (TC == 15)
PWM16_1_WritePeriod(SILENT);
else if(TC == 17)
PWM16_1_WritePeriod(F);
else if (TC == 19)
PWM16_1_WritePeriod(FS);
else if (TC == 21)
PWM16_1_WritePeriod(F);
else if (TC == 23)
PWM16_1_WritePeriod(LS);
else if (TC == 25)
PWM16_1_WritePeriod(DS);
else if (TC == 31)
PWM16_1_WritePeriod(SILENT);
else if(TC == 33)
PWM16_1_WritePeriod(F);
else if (TC == 35)
PWM16_1_WritePeriod(FS);
else if (TC == 37)
PWM16_1_WritePeriod(F);
else if (TC == 39)
PWM16_1_WritePeriod(LS);
else if (TC == 41)
PWM16_1_WritePeriod(DS);
else if (TC == 47)
PWM16_1_WritePeriod(DS);
else if (TC == 49)
PWM16_1_WritePeriod(D);
else if (TC == 51)
PWM16_1_WritePeriod(F);
else if (TC == 53)
PWM16_1_WritePeriod(FS);
else if (TC == 55)
PWM16_1_WritePeriod(F);
else if (TC == 61)
PWM16_1_WritePeriod(SILENT);
else if (TC == 65)
PWM16_1_WritePeriod(F);
else if (TC == 67)
PWM16_1_WritePeriod(FS);
else if (TC == 69)
PWM16_1_WritePeriod(F);
else if (TC == 71)
PWM16_1_WritePeriod(LS);
else if (TC == 73)
PWM16_1_WritePeriod(DS);
else if (TC == 77)
PWM16_1_WritePeriod(SS);
else if (TC == 81)
PWM16_1_WritePeriod(DS);
else if (TC == 85)
PWM16_1_WritePeriod(SS);
else if (TC == 89)
PWM16_1_WritePeriod(RS);
else if (TC == 91)
PWM16_1_WritePeriod(SS);
else if (TC == 93)
PWM16_1_WritePeriod(F);
else if (TC == 94)
PWM16_1_WritePeriod(LS);
else if (TC == 96)
PWM16_1_WritePeriod(DS);
else if (TC == 99)
PWM16_1_WritePeriod(SILENT);
else if (TC == 101)
PWM16_1_WritePeriod(DS);
else if (TC == 103)
PWM16_1_WritePeriod(D);
else if (TC == 105)
PWM16_1_WritePeriod(DS);
else if (TC == 109)
PWM16_1_WritePeriod(ORS);
else if (TC == 113)
PWM16_1_WritePeriod(DS);
else if (TC == 115)
PWM16_1_WritePeriod(F);
else if (TC == 117)
PWM16_1_WritePeriod(LS);
else if (TC == 119)
PWM16_1_WritePeriod(DS);
else if (TC == 121)
PWM16_1_WritePeriod(LS);
else if (TC == 125)
PWM16_1_WritePeriod(SILENT);
else if(TC == 129)
PWM16_1_WritePeriod(F);
else if (TC == 131)
PWM16_1_WritePeriod(FS);
else if (TC == 133)
PWM16_1_WritePeriod(SS);
else if (TC == 135)
PWM16_1_WritePeriod(DS);
else if (TC == 137)
PWM16_1_WritePeriod(DS);
else if (TC >= 143)
PWM16_1_WritePeriod(SILENT);
}
}
void main(void) {
char*strPtr;
UART_CmdReset(); // Initialize receiver/cmd buffer
UART_IntCntl(UART_ENABLE_RX_INT); // Enable RX interrupts
Counter8_WritePeriod(155); // Set up baud rate generator
Counter8_WriteCompareValue(77);
Counter8_Start(); // Turn on baud rate generator
UART_Start(UART_PARITY_NONE); // Enable UART
M8C_EnableGInt;
PWM16_1_Start();
Timer16_1_EnableInt();
Timer16_1_Start();
UART_CPutString("\r\nWhich music do you want to play?\r\n");
UART_CPutString("\r\na:Koi - Gen Hoshino ");
UART_CPutString("\r\ns:Love so sweet - Arashi");
UART_CPutString("\r\nd:Happiness - Arashi");
UART_CPutString("\r\nk:stop\r\n");
while(1){
if(UART_bCmdCheck()){
if((strPtr = UART_szGetParam())&&(*strPtr == 'a'| |*strPtr == 's'| |*strPtr == 'd'| |*strPtr =='k')){
UART_CPutString("\r\n"); UART_PutString(strPtr); if (*strPtr == 'k'){ pre_n = n; n = 0; stop = TC; if ((stop >= time - 4) && (stop <= time + 4)) { UART_CPutString("\r\nSafe!\n"); } else { UART_CPutString("\r\nOUT\n"); } } else if(*strPtr == 'a'){ TC=0; n=1; UART_CPutString("\r\nKoi is playing\n"); time = 144; } else if(*strPtr == 's'){ TC=-2; n=2; UART_CPutString("\r\nLove so sweet is playing\n"); time = 132; } else if(*strPtr == 'd'){ TC=0; n=3; UART_CPutString("\r\nHappiness is playing\n"); time = 256; } }
else {
n=10; UART_CPutString("\r\nFound invalid command\r\nWhat do you want to do?"); UART_CPutString("\n"); TC=0;
}
UART_CmdReset();
}
}
}
考察
曲をよりよく演奏するためにシャープやフラットの音階を追加した。
同じ音階の音が連続する際、間にSILENTを挟むとタイミングがずれてしまうため、音を切らなかった。より良いものにするためにはクロックの速さを速くすると間にSILENTを挟むことができより良い音階が出力できると考える。
今回はメロディーを出力するだけであったが、歌詞をメロディーと同時に出力したり、メロディーが止まると同時に残りの歌詞をすべて表示できたりすると本家に近づくとともに成功しやすくなる。そのため、それらの機能を追加できるとより良いものが完成できると思う。
今回は8分音符をタイマーの1クロックとしているため、16分音符を含む曲の演奏が不可能であった。タイマーの1クロックを工夫し、16分音符を演奏できるようにするとより多くの曲を演奏できるものになると考える。
成功したときに"Safe!"の表示だけでなく祝福の曲が流れるとより成功した喜びが感じられると思う。
参考文献:
timer_pwm2
pwm_uart_2
チーム2043
- 最終更新:2021-07-13 17:53:49