チーム2166

課題名

Let it be

研究者名

Kyosuke Miyashita
Shunta Yagisawa

使用した器具

PSoC基板
PSoC MiniProg
スピーカー

概要

timer_pwm2を参考に音階になるようにスピーカーから出力した。
歌詞をLCDに出力した

ソースコード[#v525b1bc]

      • -------------------------------------------------------------------------

#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, D = 229, L = 204, M = 182, F = 172, S = 153, R = 136, C = 121, DD = 115, LL = 102, MM = 91, FF = 86, SS = 77, RR = 68, CC = 61;
int n = 0;

int TC = 0; //Time Count

void myISR(void){

TC += 1; //TC = TC + 1
PWM16_1_WritePulseWidth(PW);

if(TC == 1 | | TC == 85){
  PWM16_1_WritePeriod(S);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("When I");
   }
   
else if(TC == 3 | | TC == 87){
  PWM16_1_WritePeriod(S);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("When I");
   }
   
else if(TC == 5 | | TC == 89){
  PWM16_1_WritePeriod(S);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("find my");
   }
   
else if(TC == 8| | TC == 92){
  PWM16_1_WritePeriod(S);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("find my");
   }
   
else if(TC == 10 | | TC == 94){
  PWM16_1_WritePeriod(R);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("self in");
   }
   
else if(TC == 13 | | TC == 97){
  PWM16_1_WritePeriod(M);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("self in");
   }
   
else if(TC == 15 | | TC == 99){
  PWM16_1_WritePeriod(S);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("time of");
   }
   
else if(TC == 18 | | TC == 102){
  PWM16_1_WritePeriod(S);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("time of");
   }
   
else if(TC == 20 | | TC == 104){
  PWM16_1_WritePeriod(DD);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("trouble");
   }
   
else if(TC == 22 | | TC == 106){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("trouble");
   }
   
else if(TC == 25 | | TC == 109){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Mother Mary");
   }
   
else if(TC == 27| | TC == 111){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Mother Mary");

  }        
   
else if(TC == 29| | TC == 113){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Mother Mary");
}
  
else if(TC == 35| | TC == 119){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Mother Mary");
   }
   
else if(TC == 37| | TC == 121){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("comes to me");
   }
   
else if(TC == 40| | TC == 124){
  PWM16_1_WritePeriod(DD);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("comes to me");
   }

else if(TC == 45 | | TC == 129){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Speaking words of wisdom");
   }

else if(TC == 47| | TC == 131){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Speaking words of wisdom");
   }
else if(TC == 50| | TC == 135){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Speaking words of wisdom");
   }
else if(TC == 54| | TC == 139){
  PWM16_1_WritePeriod(FF);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Speaking words of wisdom");
   }
   
else if(TC == 60| | TC == 145){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Speaking words of wisdom");
   }
   
else if(TC == 63| | TC == 148){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Speaking words of wisdom");
   }

else if(TC == 68| | TC == 153){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("wisdom");
   }
else if(TC == 73| | TC == 158){
  PWM16_1_WritePeriod(SILENT);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("wisdom");
   }
else if(TC == 74| | TC == 159){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 77| | TC == 162){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 80| | TC == 165){
  PWM16_1_WritePeriod(DD);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 82| | TC == 167){
  PWM16_1_WritePeriod(SILENT);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("");
   }




else if(TC == 175){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   

else if(TC == 178){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 181){
  PWM16_1_WritePeriod(DD);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 189){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }

else if(TC == 192){
  PWM16_1_WritePeriod(SS);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
else if(TC == 195){
  PWM16_1_WritePeriod(RR);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
else if(TC == 197){
  PWM16_1_WritePeriod(SILENT);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 200){
  PWM16_1_WritePeriod(SS);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 203){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }

else if(TC == 206){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
else if(TC == 212){
  PWM16_1_WritePeriod(R);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
else if(TC == 214){
  PWM16_1_WritePeriod(S);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 216){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Whisper words of wisdom");
   }

else if(TC == 222){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Whisper words of wisdom");
   }
else if(TC == 225){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Whisper words of wisdom");
   }
else if(TC == 228){
  PWM16_1_WritePeriod(FF);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Whisper words of wisdom");
   }
   
else if(TC == 233){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Whisper words of wisdom");
   }
   
else if(TC == 235){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("Whisper words of wisdom");
   }

else if(TC == 238){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("wisdom");
   }
else if(TC == 241){
  PWM16_1_WritePeriod(SILENT);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("wisdom");
   }
else if(TC == 242){
  PWM16_1_WritePeriod(MM);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 245){
  PWM16_1_WritePeriod(LL);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }
   
else if(TC == 248){
  PWM16_1_WritePeriod(DD);
   LCD_1_Init();
   LCD_1_Position(0,0);
   LCD_1_PrCString("let it be");
   }

PWM16_1_WritePeriod(SILENT);
}


void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   M8C_EnableGInt;
   PWM16_1_Start();
   Timer16_1_EnableInt();
   Timer16_1_Start();

while(1){};
}


考察

メイン文の中で、割り込みを可にし、LDC、PWM、Timerを起動したら曲が流れる。
同じメロディーが何回も使われている曲なので、if文の条件式の部分をを工夫してコードが長くなりすぎないようにした。そうしたことで、本来とは異なる歌詞が出力されるようになってしまった。if文を工夫すれば改善の余地があると思うが、時間の関係上できなかった。ソースコードに書いたメロディを繰り返すことで最後まで演奏することができるが、TCの値を設定するのが大変だったため諦めた。メロディを区切っておいて、それを何らかの方法で呼び出せば最小限のコードで最後まで演奏できるのではと考えたが実現には至らなかった。シリアル通信を使いキーボードの出力で流れるメロディを変えることができればよかった。
チーム2031を参考にした。(参考:http://mikamir.wiki.fc2.com/wiki/%E3%83%81%E3%83%BC%E3%83%A02031)
DDより高い音階の周波数を調べ、PWMクロックを計算した。(参考サイト:https://tomari.org/main/java/oto.html

  • 最終更新:2021-10-19 17:17:21

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

認証パスワード