チーム1544

課題名

Do-Re-Mi

研究者名

Hiroki Imaizumi
Jun Iwade

概要

プログラムを実行すると「ドレミの歌」が流れる。
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;
int SILENT = 0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, FF = 162, SS = 145;

int TC=0;

void myISR(void){
TC +=1;
PWM16_1_WritePulseWidth(PW);
if(TC==1){
PWM16_1_WritePeriod(D);
LCD_1_Start();
     LCD_1_PrCString("DO-WA DO-NATUNO-DO");}
else if(TC==6)
PWM16_1_WritePeriod(L);
else if(TC==8)
PWM16_1_WritePeriod(M);
if(TC==13)
PWM16_1_WritePeriod(D);
else if(TC==15)
PWM16_1_WritePeriod(M);
if(TC==18)
PWM16_1_WritePeriod(D);
else if(TC==21)
PWM16_1_WritePeriod(M);

if(TC==25){
PWM16_1_WritePeriod(L);
LCD_1_Start();
     LCD_1_PrCString("LE-WA LEMONNO-LE");}
else if(TC==30)
PWM16_1_WritePeriod(M);
else if(TC==32)
PWM16_1_WritePeriod(F);
else if(TC==33)
PWM16_1_WritePeriod(SILENT);
if(TC==35)
PWM16_1_WritePeriod(F);
else if(TC==38)
PWM16_1_WritePeriod(M);
if(TC==41)
PWM16_1_WritePeriod(L);
else if(TC==44)
PWM16_1_WritePeriod(F);

if(TC==56){
PWM16_1_WritePeriod(M);
LCD_1_Start();
     LCD_1_PrCString("MI-WA MINNANO-MI");}
else if(TC==61)
PWM16_1_WritePeriod(F);
else if(TC==63)
PWM16_1_WritePeriod(S);
if(TC==68)
PWM16_1_WritePeriod(M);
else if(TC==70)
PWM16_1_WritePeriod(S);
if(TC==73)
PWM16_1_WritePeriod(M);
else if(TC==76)
PWM16_1_WritePeriod(S);

if(TC==82){
PWM16_1_WritePeriod(F);
LCD_1_Start();
     LCD_1_PrCString("FA-WA FAITONO-FA");}
else if(TC==87)
PWM16_1_WritePeriod(S);
else if(TC==89)
PWM16_1_WritePeriod(R);
if(TC==90)
PWM16_1_WritePeriod(SILENT);
if(TC==92)
PWM16_1_WritePeriod(R);
else if(TC==95)
PWM16_1_WritePeriod(S);
if(TC==97)
PWM16_1_WritePeriod(F);
else if(TC==101)
PWM16_1_WritePeriod(R);

if(TC==113){
PWM16_1_WritePeriod(S);
LCD_1_Start();
     LCD_1_PrCString("SO-WA AOISORA");}
else if(TC==118)
PWM16_1_WritePeriod(D);
else if(TC==120)
PWM16_1_WritePeriod(L);
if(TC==123)
PWM16_1_WritePeriod(M);
else if(TC==126)
PWM16_1_WritePeriod(F);
if(TC==129)
PWM16_1_WritePeriod(S);
else if(TC==132)
PWM16_1_WritePeriod(R);

if(TC==144){
PWM16_1_WritePeriod(R);
LCD_1_Start();
     LCD_1_PrCString("RA-WA RAPPANO-RA");}
else if(TC==148)
PWM16_1_WritePeriod(L);
else if(TC==150)
PWM16_1_WritePeriod(M);
if(TC==153)
PWM16_1_WritePeriod(F);
else if(TC==156)
PWM16_1_WritePeriod(S);
if(TC==159)
PWM16_1_WritePeriod(R);
else if(TC==162)
PWM16_1_WritePeriod(C);

if(TC==174){
PWM16_1_WritePeriod(C);
LCD_1_Start();
     LCD_1_PrCString("SI-WA SIAWASEYO");}
else if(TC==179)
PWM16_1_WritePeriod(M);
else if(TC==181)
PWM16_1_WritePeriod(FF);
if(TC==184)
PWM16_1_WritePeriod(SS);
else if(TC==186)
PWM16_1_WritePeriod(R);
if(TC==190)
PWM16_1_WritePeriod(C);
else if(TC==193)
PWM16_1_WritePeriod(DD);

if(TC==205){
PWM16_1_WritePeriod(DD);
LCD_1_Start();
     LCD_1_PrCString("SAUTAIMASHO");}
else if(TC==208)
PWM16_1_WritePeriod(C);
else if(TC==211)
PWM16_1_WritePeriod(R);
if(TC==214)
PWM16_1_WritePeriod(F);
else if(TC==217)
PWM16_1_WritePeriod(C);
if(TC==220)
PWM16_1_WritePeriod(S);
else if(TC==223)
PWM16_1_WritePeriod(DD);

else if(TC==235)
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)
   {};
}


考察

「timer_pwm2」を参考にした。
工夫した点は音が連続で流れるときの対応である。ドレミの歌の音階で言うと「ファ ファ」や「ラ ラ」のときである。音と音の間隔をあけるために音との間にSILENTをいれることで分けることは可能である。しかし, ドレミの歌は音が出るタイミングをどんなに早くしてもSILENTでとまる時間が長く, 曲が上手く聞こえない。そこで割り込み処理について考える。Timer16_1のPeriodに注目した。「timer_pwm2」のPeriodは9999であった。9999から0になったとき割り込み処理が起きるので9999の約半分の5000にしてみると割り込むタイミングが早くなりSILENTでとまる時間が短くなり上手くできた。
マイクと基盤を2つ使って1つの基盤で曲を流し, もう一方の基盤でマイクを使って音を拾うことでLCDに音の周波数を表示させるなども時間をかければできるはずである。

  • 最終更新:2015-10-20 16:04:03

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

認証パスワード