チーム1654
課題名
PPAP
研究者名
Kiyoshige Gotoh
Yuuki Sukenaga
使用器具
・PSoC
・PSoC MiniProg
・ジャンパ線
・スピーカー
概要
このプロジェクトはPPAPを永遠に演奏する音楽プレイヤーです。
LCDを用いた歌詞表示機能もあります。
コード
#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,S=162,L=217,C=243,M=182,Cc=121,CC=129,RR=145,LL=108;
int TC=0;//Time Count
void myISR(void)
{
TC += 1;//TC = TC + 1
PWM16_WritePulseWidth(PW);
if(TC == 1){PWM16_WritePeriod(S);LCD_PrCString("I have a pen."); }
else if(TC == 3)PWM16_WritePeriod(L);
else if(TC == 5)PWM16_WritePeriod(C);
else if(TC == 7)PWM16_WritePeriod(L);
else if(TC == 15){LCD_Start();PWM16_WritePeriod(SILENT);LCD_PrCString("I have an apple.");}
else if(TC == 16)PWM16_WritePeriod(S);
else if(TC == 18)PWM16_WritePeriod(L);
else if(TC == 20)PWM16_WritePeriod(C);
else if(TC == 22)PWM16_WritePeriod(S);
else if(TC == 24)PWM16_WritePeriod(M);
else if(TC == 36){LCD_Start();PWM16_WritePeriod(SILENT);LCD_PrCString("Unnnnnnnnnnnnnn!");}
else if(TC == 37)PWM16_WritePeriod(M);
else if(TC == 45){LCD_Start();PWM16_WritePeriod(SILENT);LCD_PrCString("ApplePen!");}
else if(TC == 46)PWM16_WritePeriod(S);
else if(TC == 48)PWM16_WritePeriod(M);
else if(TC == 52)PWM16_WritePeriod(L);
else if(TC == 58)PWM16_WritePeriod(S);
else if(TC == 59)PWM16_WritePeriod(SILENT);
else if(TC == 65){LCD_Start();PWM16_WritePeriod(S);LCD_PrCString("I have a pen."); }
else if(TC == 67)PWM16_WritePeriod(L);
else if(TC == 69)PWM16_WritePeriod(C);
else if(TC == 71)PWM16_WritePeriod(L);
else if(TC == 79){LCD_Start();PWM16_WritePeriod(SILENT);LCD_PrCString("I have an pineapple.");}
else if(TC == 80)PWM16_WritePeriod(S);
else if(TC == 82)PWM16_WritePeriod(M);
else if(TC == 84)PWM16_WritePeriod(Cc);
else if(TC == 86)PWM16_WritePeriod(CC);
else if(TC == 88)PWM16_WritePeriod(RR);
else if(TC == 90)PWM16_WritePeriod(CC);
else if(TC == 102){LCD_Start();PWM16_WritePeriod(SILENT);LCD_PrCString("Unnnnnnnnnnnnnn!");}
else if(TC == 103)PWM16_WritePeriod(M);
else if(TC == 111){LCD_Start();PWM16_WritePeriod(SILENT);LCD_PrCString("PineapplePen!");}
else if(TC == 112)PWM16_WritePeriod(LL);
else if(TC == 114)PWM16_WritePeriod(Cc);
else if(TC == 116)PWM16_WritePeriod(RR);
else if(TC == 118)PWM16_WritePeriod(L);
else if(TC == 130)PWM16_WritePeriod(SILENT);
else if(TC == 140)TC=0;
}
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. LCD_Start(); M8C_EnableGInt; PWM16_Start(); Timer16_EnableInt(); Timer16_Start(); while(1) {};
}
考察
今回の課題作成にあたってhello_worldとtimer_pwm2を参考にした。
音の長さは割り込んで処理するときのTCの間隔を空けることで調整することができた。
だがTCが1単位でしか調整できかったためsilentを出来るだけうまく使ったが、原曲のテンポと違ってしまった。
TCの仕様を理解し、小数を使うことによって原曲と近いスピードを再現できたのではないかと考えられる。
また前奏の音域が5オクターブと広くネットで調べて音の周波数はわかったが、音階周波数とクロック分周の理解が出来ていなかったため、その音の再現が出来なかった。
発表前にクロック分周した後の値を求め方を理解できたが、時間がなかったため修正できなかった。
歌詞については表示される歌詞が一列を超えると表示されなくなってしまったため、LCD_Start();を使いもう一度スタートさせることで歌詞を表示できるようにした。
もう少し早めに仕組みを理解できていればしっかり再現できたと考えられる。
- 最終更新:2016-11-22 16:38:19