課題名
外出自粛カラオケ
研究者名
2-14-040 名越 裕貴
2-14-041 西村 匡弘
概要
PWM_UART_2のラボを参考に、シリアルケーブルで接続しているPCからの入力に応じて4種類の曲が流れるようにした。また、メロディーに沿ってパネルに歌詞が表示され、カラオケのように歌うことができる機能を追加した。流すことのできる曲と、メロディーライン部分のソースコードの参考元は以下の通りである。
楽曲 |
参考元 |
Amazing Grace |
自作 |
カエルの歌 |
チーム1347 |
きらきら星 |
チーム2017 |
London Bridge is falling down |
自作 |
ソースコード参考元チーム2049
使用器具
・PSoC基盤
・USB-Serial変換ケーブル
・スピーカー
・PSoCMiniProg
・ジャンパー2本
配線及びソースコード
配線
Global Resources
PWM16_1
Timer16_1
Counter8
UART
ソースコード
#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, c=243, D=217, L=193, M=182, F=162, S=145, Ra=136, R=129,C=121;
int DD=108, LL=96,MM=91,FF=81,SS=72,RRa=68,RR=64,CC=61;
int TC=-4; //Time Count
int choicesong = 0;//1 -> Amazing Grace ; 2 -> きらきら星 ; 3 -> カエルの歌 4 -> London Bridge is falling down
void myISR(void){
TC += 1;
if (choicesong == 1){//Amazing Grace
Amazing Grace
if (TC == -3){
LCD_1_Position(0,0);
LCD_1_PrCString("Amazing grace ");
LCD_1_Position(1,0);
LCD_1_PrCString("how sweet ");}
else if (TC==0)
PWM16_1_WritePeriod(S);
else if (TC == 4)
PWM16_1_WritePeriod(DD);
else if (TC == 8)
PWM16_1_WritePeriod(MM);
else if (TC == 23)
PWM16_1_WritePeriod(SILENT);
else if (TC == 24)
PWM16_1_WritePeriod(MM);
else if (TC == 28)
PWM16_1_WritePeriod(LL);
else if (TC == 30)
PWM16_1_WritePeriod(DD);
else if (TC == 32)
PWM16_1_WritePeriod(MM);
else if (TC == 47)
PWM16_1_WritePeriod(SILENT);
else if (TC == 48){
PWM16_1_WritePeriod(MM);
LCD_1_Position(0,0);
LCD_1_PrCString("how sweet ");
LCD_1_Position(1,0);
LCD_1_PrCString("the sound ");}
else if (TC == 52)
PWM16_1_WritePeriod(LL);
else if (TC == 56)
PWM16_1_WritePeriod(DD);
else if (TC == 72){
PWM16_1_WritePeriod(Ra);
LCD_1_Position(0,0);
LCD_1_PrCString("the sound ");
LCD_1_Position(1,0);
LCD_1_PrCString("That saved ");}
else if (TC == 80)
PWM16_1_WritePeriod(S);
else if (TC == 95)
PWM16_1_WritePeriod(SILENT);
else if (TC == 96){
PWM16_1_WritePeriod(S);
LCD_1_Position(0,0);
LCD_1_PrCString("That saved ");
LCD_1_Position(1,0);
LCD_1_PrCString("a wretch like me");}
else if (TC == 100)
PWM16_1_WritePeriod(DD);
else if (TC == 103)
PWM16_1_WritePeriod(SILENT);
else if (TC == 104)
PWM16_1_WritePeriod(DD);
else if (TC == 120){
PWM16_1_WritePeriod(MM);
LCD_1_Position(0,0);
LCD_1_PrCString("a wretch like me");
LCD_1_Position(1,0);
LCD_1_PrCString(" ");}
else if (TC == 124)
PWM16_1_WritePeriod(LL);
else if (TC == 126)
PWM16_1_WritePeriod(DD);
else if (TC == 128)
PWM16_1_WritePeriod(MM);
else if (TC == 144)
PWM16_1_WritePeriod(LL);
else if (TC == 148)
PWM16_1_WritePeriod(MM);
else if (TC == 152)
PWM16_1_WritePeriod(SS);
else if (TC == 188){
LCD_1_Position(0,0);
LCD_1_PrCString("I once was lost,");
LCD_1_Position(1,0);
LCD_1_PrCString("but now, ");}
else if (TC == 191)
PWM16_1_WritePeriod(SILENT);
else if (TC == 192)
PWM16_1_WritePeriod(MM);
else if (TC == 196)
PWM16_1_WritePeriod(SS);
else if (TC == 199)
PWM16_1_WritePeriod(SILENT);
else if (TC == 200)
PWM16_1_WritePeriod(SS);
else if (TC == 217)
PWM16_1_WritePeriod(MM);
else if (TC == 219)
PWM16_1_WritePeriod(LL);
else if (TC == 221)
PWM16_1_WritePeriod(DD);
else if (TC == 223)
PWM16_1_WritePeriod(MM);
else if (TC == 239)
PWM16_1_WritePeriod(SILENT);
else if (TC == 240){
PWM16_1_WritePeriod(MM);
LCD_1_Position(0,0);
LCD_1_PrCString("but now, ");
LCD_1_Position(1,0);
LCD_1_PrCString("I'm found ");}
else if (TC == 244)
PWM16_1_WritePeriod(LL);
else if (TC == 248)
PWM16_1_WritePeriod(DD);
else if (TC == 266){
PWM16_1_WritePeriod(Ra);
LCD_1_Position(0,0);
LCD_1_PrCString("I'm found ");
LCD_1_Position(1,0);
LCD_1_PrCString("Was blind, ");}
else if (TC == 272)
PWM16_1_WritePeriod(S);
else if (TC == 287)
PWM16_1_WritePeriod(SILENT);
else if (TC == 288){
PWM16_1_WritePeriod(S);
LCD_1_Position(0,0);
LCD_1_PrCString("Was blind, ");
LCD_1_Position(1,0);
LCD_1_PrCString("but now I see. ");}
else if (TC == 292)
PWM16_1_WritePeriod(DD);
else if (TC == 295)
PWM16_1_WritePeriod(SILENT);
else if (TC == 296)
PWM16_1_WritePeriod(DD);
else if (TC == 312){
PWM16_1_WritePeriod(MM);
LCD_1_Position(0,0);
LCD_1_PrCString("but now I see. ");
LCD_1_Position(1,0);
LCD_1_PrCString(" ");}
else if (TC == 316)
PWM16_1_WritePeriod(LL);
else if (TC == 318)
PWM16_1_WritePeriod(DD);
else if (TC == 320)
PWM16_1_WritePeriod(MM);
else if (TC == 336)
PWM16_1_WritePeriod(LL);
else if (TC == 344)
PWM16_1_WritePeriod(DD);
else if (TC == 376){
PWM16_1_WritePeriod(SILENT);
LCD_1_Position(0,0);
LCD_1_PrCString(" ");}
}
else if (choicesong == 2){//キラキラ星
きらきら星
if (TC==-3){
LCD_1_Position(0,0);
LCD_1_PrCString("kirakirahikaru");
LCD_1_Position(1,0);
LCD_1_PrCString("osoranohosiyo ");
}
if(TC == 1)
PWM16_1_WritePeriod(D);
else if(TC == 3)
PWM16_1_WritePeriod(SILENT);
else if(TC == 4)
PWM16_1_WritePeriod(D);
else if(TC == 6)
PWM16_1_WritePeriod(SILENT);
else if(TC == 7)
PWM16_1_WritePeriod(S);
else if(TC == 9)
PWM16_1_WritePeriod(SILENT);
else if(TC == 10)
PWM16_1_WritePeriod(S);
else if(TC == 12)
PWM16_1_WritePeriod(SILENT);
else if(TC == 13)
PWM16_1_WritePeriod(R);
else if(TC == 15)
PWM16_1_WritePeriod(SILENT);
else if(TC == 16)
PWM16_1_WritePeriod(R);
else if(TC == 18)
PWM16_1_WritePeriod(SILENT);
else if(TC == 19)
PWM16_1_WritePeriod(S);
else if(TC == 24)
PWM16_1_WritePeriod(SILENT);
else if(TC == 25){
PWM16_1_WritePeriod(F);
LCD_1_Position(0,0);
LCD_1_PrCString("osoranohosiyo ");
LCD_1_Position(1,0);
LCD_1_PrCString("mabatakisiteha");
}
else if(TC == 27)
PWM16_1_WritePeriod(SILENT);
else if(TC == 28)
PWM16_1_WritePeriod(F);
else if(TC == 30)
PWM16_1_WritePeriod(SILENT);
else if(TC == 31)
PWM16_1_WritePeriod(M);
else if(TC == 33)
PWM16_1_WritePeriod(SILENT);
else if(TC == 34)
PWM16_1_WritePeriod(M);
else if(TC == 36)
PWM16_1_WritePeriod(SILENT);
else if(TC == 37)
PWM16_1_WritePeriod(L);
else if(TC == 39)
PWM16_1_WritePeriod(SILENT);
else if(TC == 40)
PWM16_1_WritePeriod(L);
else if(TC == 42)
PWM16_1_WritePeriod(SILENT);
else if(TC == 43)
PWM16_1_WritePeriod(D);
else if(TC == 48)
PWM16_1_WritePeriod(SILENT);
else if(TC == 49){
PWM16_1_WritePeriod(S);
LCD_1_Position(0,0);
LCD_1_PrCString("mabatakisiteha");
LCD_1_Position(1,0);
LCD_1_PrCString("minnawomiteru ");
}
else if(TC == 51){
PWM16_1_WritePeriod(SILENT);
}
else if(TC == 52)
PWM16_1_WritePeriod(S);
else if(TC == 54)
PWM16_1_WritePeriod(SILENT);
else if(TC == 55)
PWM16_1_WritePeriod(F);
else if(TC == 57)
PWM16_1_WritePeriod(SILENT);
else if(TC == 58)
PWM16_1_WritePeriod(F);
else if(TC == 60)
PWM16_1_WritePeriod(SILENT);
else if(TC == 61)
PWM16_1_WritePeriod(M);
else if(TC == 63)
PWM16_1_WritePeriod(SILENT);
else if(TC == 64)
PWM16_1_WritePeriod(M);
else if(TC == 66)
PWM16_1_WritePeriod(SILENT);
else if(TC == 67)
PWM16_1_WritePeriod(L);
else if(TC == 72)
PWM16_1_WritePeriod(SILENT);
else if(TC == 73){
PWM16_1_WritePeriod(S);
LCD_1_Position(0,0);
LCD_1_PrCString("minnawomiteru ");
LCD_1_Position(1,0);
LCD_1_PrCString("kirakirahikaru");
}
else if(TC == 75)
PWM16_1_WritePeriod(SILENT);
else if(TC == 76)
PWM16_1_WritePeriod(S);
else if(TC == 78)
PWM16_1_WritePeriod(SILENT);
else if(TC == 79)
PWM16_1_WritePeriod(F);
else if(TC == 81)
PWM16_1_WritePeriod(SILENT);
else if(TC == 82)
PWM16_1_WritePeriod(F);
else if(TC == 84)
PWM16_1_WritePeriod(SILENT);
else if(TC == 85)
PWM16_1_WritePeriod(M);
else if(TC == 87)
PWM16_1_WritePeriod(SILENT);
else if(TC == 88)
PWM16_1_WritePeriod(M);
else if(TC == 90)
PWM16_1_WritePeriod(SILENT);
else if(TC == 91)
PWM16_1_WritePeriod(L);
else if(TC == 96)
PWM16_1_WritePeriod(SILENT);
else if(TC == 97){
PWM16_1_WritePeriod(D);
LCD_1_Position(0,0);
LCD_1_PrCString("kirakirahikaru");
LCD_1_Position(1,0);
LCD_1_PrCString("osoranohosiyo ");
}
else if(TC == 99)
PWM16_1_WritePeriod(SILENT);
else if(TC == 100)
PWM16_1_WritePeriod(D);
else if(TC == 102)
PWM16_1_WritePeriod(SILENT);
else if(TC == 103)
PWM16_1_WritePeriod(S);
else if(TC == 105)
PWM16_1_WritePeriod(SILENT);
else if(TC == 106)
PWM16_1_WritePeriod(S);
else if(TC == 108)
PWM16_1_WritePeriod(SILENT);
else if(TC == 109)
PWM16_1_WritePeriod(R);
else if(TC == 111)
PWM16_1_WritePeriod(SILENT);
else if(TC == 112)
PWM16_1_WritePeriod(R);
else if(TC == 114)
PWM16_1_WritePeriod(SILENT);
else if(TC == 115)
PWM16_1_WritePeriod(S);
else if(TC == 120)
PWM16_1_WritePeriod(SILENT);
else if(TC == 121){
PWM16_1_WritePeriod(F);
LCD_1_Position(0,0);
LCD_1_PrCString("osoranohosiyo ");
LCD_1_Position(1,0);
LCD_1_PrCString(" ");
}
else if(TC == 123)
PWM16_1_WritePeriod(SILENT);
else if(TC == 124)
PWM16_1_WritePeriod(F);
else if(TC == 126)
PWM16_1_WritePeriod(SILENT);
else if(TC == 127)
PWM16_1_WritePeriod(M);
else if(TC == 129)
PWM16_1_WritePeriod(SILENT);
else if(TC == 130)
PWM16_1_WritePeriod(M);
else if(TC == 132)
PWM16_1_WritePeriod(SILENT);
else if(TC == 133)
PWM16_1_WritePeriod(L);
else if(TC == 135)
PWM16_1_WritePeriod(SILENT);
else if(TC == 136)
PWM16_1_WritePeriod(L);
else if(TC == 138)
PWM16_1_WritePeriod(SILENT);
else if(TC == 139)
PWM16_1_WritePeriod(D);
else if(TC == 144){
PWM16_1_WritePeriod(SILENT);
LCD_1_Position(0,0);
LCD_1_PrCString(" ");}
}
else if (choicesong == 3){//カエルの歌
カエルの歌
if (TC==-3){
LCD_1_Position(0,0);
LCD_1_PrCString("kaerunoutaga ");
LCD_1_Position(1,0);
LCD_1_PrCString("kikoetekuruyo ");}
else if (TC == 0)
PWM16_1_WritePeriod(D);
else if(TC == 4)
PWM16_1_WritePeriod(L);
else if (TC == 8)
PWM16_1_WritePeriod(M);
else if(TC == 12)
PWM16_1_WritePeriod(F);
else if(TC == 16)
PWM16_1_WritePeriod(M);
else if (TC == 20)
PWM16_1_WritePeriod(L);
else if(TC == 24)
PWM16_1_WritePeriod(D);
else if(TC == 28){
PWM16_1_WritePeriod(SILENT);
LCD_1_Position(0,0);
LCD_1_PrCString("kikoetekuruyo ");
LCD_1_Position(1,0);
LCD_1_PrCString("gua ");}
else if(TC == 32)
PWM16_1_WritePeriod(M);
else if(TC == 36)
PWM16_1_WritePeriod(F);
else if(TC == 40)
PWM16_1_WritePeriod(S);
else if(TC == 44)
PWM16_1_WritePeriod(R);
else if(TC == 48)
PWM16_1_WritePeriod(S);
else if(TC == 52)
PWM16_1_WritePeriod(F);
else if(TC == 56)
PWM16_1_WritePeriod(M);
else if(TC == 60){
PWM16_1_WritePeriod(SILENT);
LCD_1_Position(0,0);
LCD_1_PrCString("gua ");
LCD_1_Position(1,0);
LCD_1_PrCString("gua ");}
else if(TC == 64){
PWM16_1_WritePeriod(D);
LCD_1_Position(0,0);
LCD_1_PrCString("gua ");
LCD_1_Position(1,0);
LCD_1_PrCString("gua ");}
else if(TC == 68)
PWM16_1_WritePeriod(SILENT);
else if(TC == 72){
PWM16_1_WritePeriod(D);
LCD_1_Position(0,0);
LCD_1_PrCString("gua ");
LCD_1_Position(1,0);
LCD_1_PrCString("gua ");}
else if(TC == 76)
PWM16_1_WritePeriod(SILENT);
else if(TC == 80){
PWM16_1_WritePeriod(D);
LCD_1_Position(0,0);
LCD_1_PrCString("gua ");
LCD_1_Position(1,0);
LCD_1_PrCString("gerogerogerogero");}
else if(TC == 84)
PWM16_1_WritePeriod(SILENT);
else if(TC == 88)
PWM16_1_WritePeriod(D);
else if(TC == 92){
PWM16_1_WritePeriod(SILENT);
LCD_1_Position(0,0);
LCD_1_PrCString("gerogerogerogero");
LCD_1_Position(1,0);
LCD_1_PrCString("gua gua gua ");}
else if(TC == 96)
PWM16_1_WritePeriod(D);
else if(TC == 100)
PWM16_1_WritePeriod(L);
else if (TC == 104)
PWM16_1_WritePeriod(M);
else if(TC == 108){
PWM16_1_WritePeriod(F);
LCD_1_Position(0,0);
LCD_1_PrCString("gua gua gua ");
LCD_1_Position(1,0);
LCD_1_PrCString(" ");}
else if(TC == 112)
PWM16_1_WritePeriod(M);
else if (TC == 116)
PWM16_1_WritePeriod(L);
else if(TC == 120)
PWM16_1_WritePeriod(D);
else if(TC == 124){
PWM16_1_WritePeriod(SILENT);
LCD_1_Position(0,0);
LCD_1_PrCString(" ");}
}
else if (choicesong == 4){//London Bridge is falling down
London Bridge is falling down
if (TC==-3){
LCD_1_Position(0,0);
LCD_1_PrCString("London Bridge is");
LCD_1_Position(1,0);
LCD_1_PrCString("falling down, ");}
else if (TC == 0)
PWM16_1_WritePeriod(S);
else if(TC == 2)
PWM16_1_WritePeriod(L);
else if (TC == 4)
PWM16_1_WritePeriod(S);
else if(TC == 6){
PWM16_1_WritePeriod(F);
LCD_1_Position(0,0);
LCD_1_PrCString("Falling down, ");
LCD_1_Position(1,0);
LCD_1_PrCString("Falling down, ");}
else if(TC == 8)
PWM16_1_WritePeriod(M);
else if (TC == 10)
PWM16_1_WritePeriod(F);
else if(TC == 12)
PWM16_1_WritePeriod(S);
else if(TC == 14){
LCD_1_Position(0,0);
LCD_1_PrCString("Falling down, ");
LCD_1_Position(1,0);
LCD_1_PrCString("Falling down, ");}
else if(TC == 16)
PWM16_1_WritePeriod(L);
else if(TC == 18)
PWM16_1_WritePeriod(M);
else if(TC == 20)
PWM16_1_WritePeriod(F);
else if(TC == 22){
LCD_1_Position(0,0);
LCD_1_PrCString("Falling down, ");
LCD_1_Position(1,0);
LCD_1_PrCString("London Bridge is");}
else if(TC == 24)
PWM16_1_WritePeriod(M);
else if(TC == 26)
PWM16_1_WritePeriod(F);
else if(TC == 28)
PWM16_1_WritePeriod(S);
else if(TC == 31){
PWM16_1_WritePeriod(SILENT);
LCD_1_Position(0,0);
LCD_1_PrCString("London Bridge is");
LCD_1_Position(1,0);
LCD_1_PrCString("falling down, ");}
else if(TC == 32)
PWM16_1_WritePeriod(S);
else if(TC == 34)
PWM16_1_WritePeriod(L);
else if(TC == 36)
PWM16_1_WritePeriod(S);
else if(TC == 38)
PWM16_1_WritePeriod(F);
else if(TC == 40){
PWM16_1_WritePeriod(M);
LCD_1_Position(0,0);
LCD_1_PrCString("falling down, ");
LCD_1_Position(1,0);
LCD_1_PrCString("My fair lady. ");}
else if(TC == 42)
PWM16_1_WritePeriod(F);
else if(TC == 44)
PWM16_1_WritePeriod(S);
else if(TC == 46){
LCD_1_Position(0,0);
LCD_1_PrCString("My fair lady. ");
LCD_1_Position(1,0);
LCD_1_PrCString(" ");}
else if(TC == 48)
PWM16_1_WritePeriod(L);
else if (TC == 52)
PWM16_1_WritePeriod(S);
else if(TC == 56)
PWM16_1_WritePeriod(M);
else if (TC == 58)
PWM16_1_WritePeriod(D);
else if(TC == 60){
PWM16_1_WritePeriod(SILENT);
LCD_1_Position(0,0);
LCD_1_PrCString(" ");}
}
}
void main(void)
{
char * strPtr; // Parameter pointer
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 ; // Turn on interrupts
UART_CPutString("\r\n鳴らしたい曲の番号を入力してください \r\n");
UART_CPutString("\r\n1 -> Amazing Grace \r\n");
UART_CPutString("\r\n2 -> きらきら星 \r\n");
UART_CPutString("\r\n3 -> カエルの歌 \r\n");
UART_CPutString("\r\n4 -> London Bridge is falling down \r\n");
PWM16_1_Start();
Timer16_1_EnableInt();
Timer16_1_Start();
PWM16_1_WritePulseWidth(PW);
LCD_1_Start();
while (1){
if(UART_bCmdCheck()) {
// Wait for command
if(strPtr = UART_szGetParam()) {
// More than delimiter?
UART_PutString(strPtr); // Print out command
UART_CPutString("\r\n曲を変えたい場合はその番号を入力してください\r\n");
if (*strPtr == '1'){
S=153; Ra=136;
DD=115; LL=102; MM=91;SS=77;
choicesong = 1;
TC = -4;
}
else if (*strPtr == '2'){
D=229; L=204; M=182; F=172; S=153; R=136;
choicesong = 2;
TC = -4;
}
else if (*strPtr == '3'){
D=229; L=204; M=182; F=172; S=153; R=136; C=121; DD=115;
choicesong = 3;
TC = -4;
}
else if (*strPtr == '4'){
D=229; L=204; M=182; F=172; S=153; R=136; C=121; DD=115;
choicesong = 4;
TC = -4;
}
}
UART_CmdReset();
}
}
}
考察
今回自作した曲はそれぞれテンポの違う曲だが、割込みの頻度を変えることで工夫することが出来る。
歌詞の表示方法として実際のカラオケのように、歌う部分を先に表示させて実際に歌いやすくしている。
また歌った部分は必要ないので消して、歌う部分が上にくる仕様にしている。
曲はさらに追加することが可能なので、実際に追加するとソースコードが莫大であり、曲によってテンポが違うので、現実的ではないが、本物のようなカラオケが出来るようになると考えられる。