チーム1941

課題名

[wherever you are]

研究者名

Shunsuke Fukuyama, Haruka Yoshimura

概要

one ok rockさんのwherever you areを演奏し、LCD板に歌詞を表示させた。コマンド'a'で曲のサビに飛べるようにした。

使用器具

・スピーカー
・PSoc基盤
・ジャンパ線(2本)

ソースコード

#include <m8c.h> // part specific constants and macros
#include<stdlib.h>
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
int PW=125; //Pulse Width
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, d=115;
int TC=0;//time Count

void myISR(void){
TC += 1;
PWM16_1_WritePulseWidth(PW);
if(TC == 2){
LCD_1_PrCString("aishiteruyo");
PWM16_1_WritePeriod(C);
}
else if(TC == 6)
PWM16_1_WritePeriod(R);
else if (TC ==10)
PWM16_1_WritePeriod(SILENT);
else if(TC==11)
PWM16_1_WritePeriod(R);
else if(TC ==15)
PWM16_1_WritePeriod(S);
else if(TC == 19)
PWM16_1_WritePeriod(R);
else if(TC == 22)
PWM16_1_WritePeriod(C);
else if(TC == 26)
PWM16_1_WritePeriod(SILENT);

else if(TC==30){
LCD_1_Position(0,0);
LCD_1_PrCString("futarihahitostuni");
PWM16_1_WritePeriod(S);
}
else if(TC==33)
PWM16_1_WritePeriod(C);
else if(TC==36)
PWM16_1_WritePeriod(R);
else if(TC==37)
PWM16_1_WritePeriod(R);
else if(TC==40)
PWM16_1_WritePeriod(S);
else if(TC==44)
PWM16_1_WritePeriod(d);
else if(TC==46)
PWM16_1_WritePeriod(C);
else if(TC==49)
PWM16_1_WritePeriod(R);
else if(TC==54)
PWM16_1_WritePeriod(C);
else if(TC==59)
PWM16_1_WritePeriod(SILENT);

else if(TC==65){
LCD_1_Position(0,0);
LCD_1_PrCString("tonight tonight  ");
PWM16_1_WritePeriod(S);
}
else if(TC==67)
PWM16_1_WritePeriod(S);
else if(TC==69)
PWM16_1_WritePeriod(S);
else if(TC==71)
PWM16_1_WritePeriod(M);
else if(TC==77)
PWM16_1_WritePeriod(SILENT);
else if(TC==84)
PWM16_1_WritePeriod(R);
else if(TC==83)
PWM16_1_WritePeriod(R);
else if(TC==85)
PWM16_1_WritePeriod(R);
else if(TC==87)
PWM16_1_WritePeriod(D);
else if(TC==93)
PWM16_1_WritePeriod(SILENT);

else if(TC==100){
LCD_1_Position(0,0);
LCD_1_PrCString("I just say     ");
PWM16_1_WritePeriod(M);
}
else if(TC==102)
PWM16_1_WritePeriod(S);
else if(TC==104)
PWM16_1_WritePeriod(M);
else if(TC==106)
PWM16_1_WritePeriod(M);
else if(TC==108)
PWM16_1_WritePeriod(L);
else if(TC==114)
PWM16_1_WritePeriod(SILENT);

else if(TC==120){
LCD_1_Position(0,0);
LCD_1_PrCString("wherever you are");
PWM16_1_WritePeriod(S);
}
else if(TC==122)
PWM16_1_WritePeriod(SILENT);
else if(TC==123)
PWM16_1_WritePeriod(S);
else if(TC==125)
PWM16_1_WritePeriod(SILENT);
else if(TC==126)
PWM16_1_WritePeriod(S);
else if(TC==128)
PWM16_1_WritePeriod(F);
else if(TC==132)
PWM16_1_WritePeriod(S);

else if(TC==138){
LCD_1_Position(0,0);
LCD_1_PrCString("I always make     ");
PWM16_1_WritePeriod(SILENT);
}

else if(TC==141)
PWM16_1_WritePeriod(L);
else if(TC==143)
PWM16_1_WritePeriod(S);
else if(TC==147)
PWM16_1_WritePeriod(L);
else if(TC==149)
PWM16_1_WritePeriod(S);
else if(TC==151){
LCD_1_Position(0,0);
LCD_1_PrCString("you smile        ");
PWM16_1_WritePeriod(R);
}
else if(TC==153)
PWM16_1_WritePeriod(R);
else if(TC==158)
PWM16_1_WritePeriod(SILENT);

else if(TC==160){
LCD_1_Position(0,0);
LCD_1_PrCString("wherever you are");
PWM16_1_WritePeriod(S);
}
else if(TC==162)
PWM16_1_WritePeriod(SILENT);
else if(TC==163)
PWM16_1_WritePeriod(S);
else if(TC==165)
PWM16_1_WritePeriod(SILENT);
else if(TC==166)
PWM16_1_WritePeriod(S);
else if(TC==168)
PWM16_1_WritePeriod(F);
else if(TC==172)
PWM16_1_WritePeriod(S);

else if(TC==178){
LCD_1_Position(0,0);
LCD_1_PrCString("I'm always by      ");
PWM16_1_WritePeriod(SILENT);
}

else if(TC==181)
PWM16_1_WritePeriod(L);
else if(TC==183)
PWM16_1_WritePeriod(S);
else if(TC==187)
PWM16_1_WritePeriod(L);
else if(TC==189)
PWM16_1_WritePeriod(S);
else if(TC==191){
LCD_1_Position(0,0);
LCD_1_PrCString("your side       ");
PWM16_1_WritePeriod(R);
}
else if(TC==193)
PWM16_1_WritePeriod(R);
else if(TC==198)
PWM16_1_WritePeriod(SILENT);

else if(TC==202){
LCD_1_Position(0,0);
LCD_1_PrCString("wherever you say");
PWM16_1_WritePeriod(S);
}
else if(TC==204)
PWM16_1_WritePeriod(SILENT);
else if(TC==205)
PWM16_1_WritePeriod(S);
else if(TC==207)
PWM16_1_WritePeriod(SILENT);
else if(TC==209)
PWM16_1_WritePeriod(S);
else if(TC==211)
PWM16_1_WritePeriod(F);
else if(TC==216)
PWM16_1_WritePeriod(S);

else if(TC==218){
LCD_1_Position(0,0);
LCD_1_PrCString("kimiwo             ");
PWM16_1_WritePeriod(SILENT);
}

else if(TC==219)
PWM16_1_WritePeriod(S);
else if(TC==221)
PWM16_1_WritePeriod(F);
else if(TC==225)
PWM16_1_WritePeriod(S);

else if(TC==228){
LCD_1_Position(0,0);
LCD_1_PrCString("omoukimochi          ");
PWM16_1_WritePeriod(SILENT);
}
else if(TC==230){
PWM16_1_WritePeriod(L);
}
else if(TC==232)
PWM16_1_WritePeriod(S);
else if(TC==235)
PWM16_1_WritePeriod(L);
else if(TC==237)
PWM16_1_WritePeriod(S);
else if(TC==240){
PWM16_1_WritePeriod(R);
}
else if(TC==242)
PWM16_1_WritePeriod(R);
else if(TC==243)
PWM16_1_WritePeriod(S);

else if(TC==248)
PWM16_1_WritePeriod(SILENT);

else if(TC==250){
LCD_1_Position(0,0);
LCD_1_PrCString("I promise you        ");
PWM16_1_WritePeriod(L);
}
else if(TC==251)
PWM16_1_WritePeriod(M);
else if(TC==256)
PWM16_1_WritePeriod(C);
else if(TC==257)
PWM16_1_WritePeriod(C);
else if(TC==261){
LCD_1_Position(0,0);
LCD_1_PrCString("forever right now  ");
PWM16_1_WritePeriod(d);
}
else if(TC==263)
PWM16_1_WritePeriod(C);
else if(TC==265)
PWM16_1_WritePeriod(R);
else if(TC==267)
PWM16_1_WritePeriod(S);
else if(TC==271)
PWM16_1_WritePeriod(R);
else if(TC==273)
PWM16_1_WritePeriod(R);

else if(TC==280)
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();
LCD_1_Start();
LCD_1_Position(0,0);
while(1)
{
if(UART_bCmdCheck()){
     if(strPtr = UART_szGetParam()){
              UART_CPutString("Found valid command\r\nCommand =>");
              UART_PutString(strPtr);
if(*strPtr=='a')
TC=120;
}
UART_CmdReset();
}
}
}

考察

分周する定数を変えることで音階が表現できるので、曲に必要な音を容易に生成することができた。

(今回は初期のクロックを24MHz。
それをVC1で24MHz/4=6MHz。
VC2で、6MHz/4=1500KHz。
VC3で、1500KHz/25=60KHz。
これを任意の定数で分周し、欲しい音程を生成する。)

しかし、曲を表現するためには音程だけでなく、間の取り方も重要であったため、それを調整する過程でも多くの時間を費やした。
特に同じ音が続く場所では、一度、無音を挟んでいるため少しテンポが悪くなってしまっていた。
今後の課題としては滑らかなメロディを目指すべきであると考えられる。

サビまでスキップする機能については改良次第で、様々な部分へ飛ばすことができる(ポーリングを利用)。

歌詞の表示に関しては、音を出すタイミングに合わせてLCDに表示させた。
歌詞がひらがなの部分はローマ字になっているため、更なる改良をするのであれば、ひらがな、漢字を使いたい。

  • 最終更新:2019-10-29 16:31:23

このWIKIを編集するにはパスワード入力が必要です

認証パスワード