チーム2115

研究者名

Takumi Irie
Tatuya Utumi


概要

YOASOBIの”群青”を演奏し、それに対応してLCDに歌詞を表示させる。

また、キーボード入力によって曲の再生、停止、リピートをできるようにした。
キーボードは
p:再生
s:停止
r:リピート
に割り当てた。


<参考文献>
・チーム205B
・チーム2048
(上の動画の音程とリズムを参考にした)

使用器具

PSoC基盤  1個
MiniProg  1個
ジャンパ線 2本
スピーカー 1台

ソース

#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;
int d=462, l=408, m=364, f=343, s=308, r=273, rs=258, c=243;
int D=229, DS=217, L=204, LS=193, M=182, F=172, FS=162, S=153, SS=145, R=136, RS=129, C=121;
int DD=115, DDS=109, LL=103, LLS=97;
int TC=0; //Time Count
void myISR(void)
{
TC = TC + 1;
PWM16_1_WritePulseWidth(PW);
if(TC == 1){
PWM16_1_WritePeriod(L);//a
LCD_Position(0,0);
LCD_PrCString("ah");
}
else if(TC == 8){
PWM16_1_WritePeriod(D);//itumonoyoni
LCD_Position(0,3);
LCD_PrCString("i");
}
else if(TC == 10){
PWM16_1_WritePeriod(L);
LCD_Position(0,4);
LCD_PrCString("tu");
}
else if (TC == 12){
PWM16_1_WritePeriod(S);
LCD_Position(0,6);
LCD_PrCString("mo");
}
else if(TC == 14){
PWM16_1_WritePeriod(R);
LCD_Position(0,8);
LCD_PrCString("no");
}
else if(TC == 16){
PWM16_1_WritePeriod(RS);
LCD_Position(0,10);
LCD_PrCString("yo");
}
else if(TC == 18){
PWM16_1_WritePeriod(R);
LCD_Position(0,12);
LCD_PrCString("ni");
}

else if (TC == 25){//sugiruhibini
PWM16_1_WritePeriod(RS);
LCD_Position(1,0);
LCD_PrCString("su");
}
else if(TC == 27){
PWM16_1_WritePeriod(R);
LCD_Position(1,2);
LCD_PrCString("gi");
}
else if(TC == 29){
PWM16_1_WritePeriod(F);
LCD_Position(1,4);
LCD_PrCString("ru");
}
else if(TC == 31){
PWM16_1_WritePeriod(L);
LCD_Position(1,6);
LCD_PrCString("hi");
}
else if(TC == 33){
PWM16_1_WritePeriod(D);
LCD_Position(1,8);
LCD_PrCString("bi");
}
else if(TC == 35){
PWM16_1_WritePeriod(L);
LCD_Position(1,10);
LCD_PrCString("ni");
}

else if(TC == 38){//clear
LCD_Position(0,0);
LCD_PrCString(" ");
LCD_Position(1,0);
LCD_PrCString(" ");
}

else if (TC == 42){
PWM16_1_WritePeriod(D);//akubigaderu
LCD_Position(0,0);
LCD_PrCString("a");
}
else if(TC == 44){
PWM16_1_WritePeriod(L);
LCD_Position(0,1);
LCD_PrCString("ku");
}
else if(TC == 46){
PWM16_1_WritePeriod(S);
LCD_Position(0,3);
LCD_PrCString("bi");
}
else if (TC == 48){
PWM16_1_WritePeriod(F);
LCD_Position(0,5);
LCD_PrCString("ga");
}
else if(TC == 50){
PWM16_1_WritePeriod(L);
LCD_Position(0,7);
LCD_PrCString("de");
}
else if(TC == 52){
PWM16_1_WritePeriod(rs);
LCD_Position(0,9);
LCD_PrCString("ru");
}

else if(TC == 60){
PWM16_1_WritePeriod(s);//sanzameku
LCD_Position(1,0);
LCD_PrCString("sa");
}
else if(TC == 62){
PWM16_1_WritePeriod(r);
LCD_Position(1,2);
LCD_PrCString("n");
}
else if(TC == 65){
PWM16_1_WritePeriod(rs);
LCD_Position(1,3);
LCD_PrCString("za");
}
else if(TC == 67){
PWM16_1_WritePeriod(D);
LCD_Position(1,5);
LCD_PrCString("me");
}
else if(TC == 69){
PWM16_1_WritePeriod(L);
LCD_Position(1,7);
LCD_PrCString("ku");
}

else if(TC == 72){//clear
LCD_Position(0,0);
LCD_PrCString(" ");
LCD_Position(1,0);
LCD_PrCString(" ");
}

else if(TC == 75){
PWM16_1_WritePeriod(D);//yoru
LCD_Position(0,0);
LCD_PrCString("yo");
}
else if(TC == 77){
PWM16_1_WritePeriod(L);
LCD_Position(0,2);
LCD_PrCString("ru");
}

else if(TC == 81){
PWM16_1_WritePeriod(S);//koe
LCD_Position(0,4);
LCD_PrCString("ko");
}
else if(TC == 83){
PWM16_1_WritePeriod(FS);
LCD_Position(0,6);
LCD_PrCString("e");
}

else if(TC == 87){
PWM16_1_WritePeriod(S);//kyoumo
LCD_Position(0,7);
LCD_PrCString("kyou");
}
else if(TC == 91){
PWM16_1_WritePeriod(R);
LCD_Position(0,11);
LCD_PrCString("mo");
}

else if(TC == 95){
PWM16_1_WritePeriod(L);//sibuyanomatini
LCD_Position(1,0);
LCD_PrCString("si");
}
else if(TC == 97){
PWM16_1_WritePeriod(D);
LCD_Position(1,2);
LCD_PrCString("bu");
}
else if(TC == 99){
PWM16_1_WritePeriod(rs);
LCD_Position(1,4);
LCD_PrCString("ya");
}
else if(TC == 101){
PWM16_1_WritePeriod(D);
LCD_Position(1,6);
LCD_PrCString("no");
}
else if(TC == 103){
PWM16_1_WritePeriod(D);
LCD_Position(1,8);
LCD_PrCString("ma");
}
else if(TC == 105){
PWM16_1_WritePeriod(rs);
LCD_Position(1,10);
LCD_PrCString("ti");
}
else if(TC == 107){
PWM16_1_WritePeriod(D);
LCD_Position(1,12);
LCD_PrCString("ni");
}

else if(TC == 109){//clear
LCD_Position(0,0);
LCD_PrCString(" ");
LCD_Position(1,0);
LCD_PrCString(" ");
}

else if(TC == 111){
PWM16_1_WritePeriod(F);//asaga
LCD_Position(0,0);
LCD_PrCString("a");
}
else if(TC == 113){
PWM16_1_WritePeriod(LS);
LCD_Position(0,1);
LCD_PrCString("sa");
}
else if(TC == 115){
PWM16_1_WritePeriod(LS);
LCD_Position(0,3);
LCD_PrCString("ga");
}

else if(TC == 119){
PWM16_1_WritePeriod(L);//furu
LCD_Position(0,5);
LCD_PrCString("fu");
}
else if(TC == 121){
PWM16_1_WritePeriod(L);
LCD_Position(0,7);
LCD_PrCString("ru");
}

else if(TC == 129){
PWM16_1_WritePeriod(rs);//dokoka
LCD_Position(1,0);
LCD_PrCString("do");
}
else if(TC == 131){
PWM16_1_WritePeriod(D);
LCD_Position(1,2);
LCD_PrCString("ko");
}
else if(TC == 133){
PWM16_1_WritePeriod(L);
LCD_Position(1,4);
LCD_PrCString("ka");
}

else if(TC == 137){//clear
LCD_Position(0,0);
LCD_PrCString(" ");
LCD_Position(1,0);
LCD_PrCString(" ");
}

else if(TC == 140){//munasiiyona
PWM16_1_WritePeriod(D);
LCD_Position(0,0);
LCD_PrCString("mu");
}
else if(TC == 142){
PWM16_1_WritePeriod(L);
LCD_Position(0,2);
LCD_PrCString("na");
}
else if (TC == 144){
PWM16_1_WritePeriod(S);
LCD_Position(0,4);
LCD_PrCString("si");
}
else if(TC == 146){
PWM16_1_WritePeriod(R);
LCD_Position(0,6);
LCD_PrCString("i");
}
else if(TC == 148){
PWM16_1_WritePeriod(RS);
LCD_Position(0,7);
LCD_PrCString("yo");
}
else if(TC == 150){
PWM16_1_WritePeriod(R);
LCD_Position(0,9);
LCD_PrCString("na");
}

else if (TC == 157){//sonnakimoti
PWM16_1_WritePeriod(RS);
LCD_Position(1,0);
LCD_PrCString("so");
}
else if(TC == 159){
PWM16_1_WritePeriod(R);
LCD_Position(1,2);
LCD_PrCString("n");
}
else if(TC == 161){
PWM16_1_WritePeriod(F);
LCD_Position(1,3);
LCD_PrCString("na");
}
else if(TC == 163){
PWM16_1_WritePeriod(D);
LCD_Position(1,5);
LCD_PrCString("ki");
}
else if(TC == 165){
PWM16_1_WritePeriod(DS);
LCD_Position(1,7);
LCD_PrCString("mo");
}
else if(TC == 167){
PWM16_1_WritePeriod(L);
LCD_Position(1,9);
LCD_PrCString("ti");
}

else if(TC == 171){//clear
LCD_Position(0,0);
LCD_PrCString(" ");
LCD_Position(1,0);
LCD_PrCString(" ");
}

else if (TC == 174){
PWM16_1_WritePeriod(D);//tumaranaina
LCD_Position(0,0);
LCD_PrCString("tu");
}
else if(TC == 176){
PWM16_1_WritePeriod(L);
LCD_Position(0,2);
LCD_PrCString("ma");
}
else if(TC == 178){
PWM16_1_WritePeriod(S);
LCD_Position(0,4);
LCD_PrCString("ra");
}
else if (TC == 180){
PWM16_1_WritePeriod(F);
LCD_Position(0,6);
LCD_PrCString("na");
}
else if(TC == 182){
PWM16_1_WritePeriod(L);
LCD_Position(0,8);
LCD_PrCString("i");
}
else if(TC == 184){
PWM16_1_WritePeriod(rs);
LCD_Position(0,9);
LCD_PrCString("na");
}

else if(TC == 191){
PWM16_1_WritePeriod(D);//demosoredeii
LCD_Position(1,0);
LCD_PrCString("de");
}
else if(TC == 193){
PWM16_1_WritePeriod(L);
LCD_Position(1,2);
LCD_PrCString("mo");
}
else if(TC == 195){
PWM16_1_WritePeriod(L);
LCD_Position(1,4);
LCD_PrCString("so");
}
else if(TC == 197){
PWM16_1_WritePeriod(D);
LCD_Position(1,6);
LCD_PrCString("re");
}
else if(TC == 199){
PWM16_1_WritePeriod(rs);
LCD_Position(1,8);
LCD_PrCString("de");
}
else if(TC == 201){
PWM16_1_WritePeriod(rs);
LCD_Position(1,10);
LCD_PrCString("ii");
}

else if(TC == 204){//clear
LCD_Position(0,0);
LCD_PrCString(" ");
LCD_Position(1,0);
LCD_PrCString(" ");
}

else if(TC == 207){
PWM16_1_WritePeriod(D);//sonnamonsa
LCD_Position(0,0);
LCD_PrCString("so");
}
else if(TC == 209){
PWM16_1_WritePeriod(L);
LCD_Position(0,2);
LCD_PrCString("n");
}
else if(TC == 211){
PWM16_1_WritePeriod(L);
LCD_Position(0,3);
LCD_PrCString("na");
}
else if(TC == 213){
PWM16_1_WritePeriod(D);
LCD_Position(0,5);
LCD_PrCString("mo");
}
else if(TC == 215){
PWM16_1_WritePeriod(rs);
LCD_Position(0,7);
LCD_PrCString("n");
}
else if(TC == 217){
PWM16_1_WritePeriod(rs);
LCD_Position(0,8);
LCD_PrCString("sa");
}

else if(TC == 223){
PWM16_1_WritePeriod(f);//koredeii
LCD_Position(1,0);
LCD_PrCString("ko");
}
else if(TC == 225){
PWM16_1_WritePeriod(s);
LCD_Position(1,2);
LCD_PrCString("re");
}
else if(TC == 227){
PWM16_1_WritePeriod(rs);
LCD_Position(1,4);
LCD_PrCString("de");
}
else if(TC == 229){
PWM16_1_WritePeriod(rs);
LCD_Position(1,6);
LCD_PrCString("ii");
}

else if(TC == 234){//end
PWM16_1_WritePeriod(SILENT);
LCD_Position(0,0);
LCD_PrCString(" END ");
LCD_Position(1,0);
LCD_PrCString("YOASOBI-gunjou-");

}
}

void main(void)
{
/*M8C_EnableGInt;
PWM16_1_Start();
Timer16_1_EnableInt();
Timer16_1_Start();
LCD_Start();

while(1)
{};*/
char * strPtr; // Parameter pointer
 UART_CmdReset(); // Initialize receiver/cmd buffer
  UART_IntCntl(UART_ENABLE_RX_INT); // Enable RX interrupts
  Counter8_1_WritePeriod(155); // Set up baud rate generator
   Counter8_1_WriteCompareValue(77);
  Counter8_1_Start(); // Turn on baud rate generator
  UART_Start(UART_PARITY_NONE); // Enable UART
  M8C_EnableGInt ; // Turn on interrupts
  Timer16_1_EnableInt();
   UART_CPutString(" \r\n pで楽曲の再生、sで楽曲の停止、rでリピート再生を行います \r\n");
  while(1) {
       if(UART_bCmdCheck()) { // Wait for command
          if(strPtr = UART_szGetParam()) { // More than delimiter?
              UART_PutString(strPtr); // Print out command;
              if (*strPtr=='p'){
                  UART_CPutString(" \r\n 再生 \r\n");
                    Timer16_1_Start();
                      PWM16_1_Start();
                      LCD_Start();
              }
               else if (*strPtr=='s'){
                  UART_CPutString(" \r\n 停止 \r\n");
                   Timer16_1_Stop();
                     PWM16_1_Stop();
                   //LCD_Stop();
                   LCD_Position(0,0);
                   LCD_PrCString("                ");
                   LCD_Position(1,0);
                   LCD_PrCString("                ");
              }
              else if (*strPtr=='r'){
                  UART_CPutString(" \r\n リピート再生 \r\n");
                  Timer16_1_Stop();
                    PWM16_1_Stop();
                   //LCD_Stop();
                   LCD_Position(0,0);
                   LCD_PrCString("                ");
                   LCD_Position(1,0);
                   LCD_PrCString("                ");
                  TC = 0;
                  Timer16_1_Start();
                    PWM16_1_Start();
                    LCD_Start();
              }
              else {
                  UART_CPutString(" \r\n 無効なコマンドです \r\n");
              }
          }
           UART_CmdReset(); // Reset command buffer
      }
  }
}

設計

コメント 2021-05-18 171213.png
コメント 2021-05-18 173431.png
コメント 2021-05-18 173618.png
コメント 2021-05-18 173639.png
コメント 2021-05-18 173702.png
コメント 2021-05-18 173730.png


考察

今回は時間がなく実現できなかったが、キーボードからの入力によってキーを変えたり、曲を選択できたりする機能をつければよりいいものになったと思う。改善点は3つあり、1つ目は一音一音の間隔が実際の曲と少し違うところもあったので、timerの割り込む間隔を短くして微調整ができるようにすればよかった。2つ目は曲を停止した際に歌詞のところもそのまま止めることができたと思う。その方法としては今回リピートの際に歌詞をうまく出力させるために停止した際に歌詞を消すようにコードを書いてしまっている。改善策としては曲が始まる直前に一旦空白を出力させるようにすればうまくできたと考えられる。3つ目は歌詞の表示を日本語、ひらがなにするところである。一度取り組んだがうまくいかなかったのであきらめたが時間があれば修正したかった部分である

  • 最終更新:2021-05-18 17:56:21

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

認証パスワード