チーム1456

課題名

二部合唱

研究者名

Satoshi Kanai
Ayaka Kariyama

概要

2つのスピーカーを使用し、二部合唱の形で「栄光の架け橋」を演奏した。
また、歌詞が英文字としてLCD上に出力されるものとする。

使用機材

・PSoC基板
・ジャンパ線 - 2本
・スピーカー - 2個

ブロック図

my_pwmブロック図.png

ソースコード


#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,Fs=162, S=153, Ss=145, R=136, Rs=129, C=121, DD=115, DDs=109, LLs=97, MM=91, FFs=82, SSs=73, RR=68;
double TC=0;

void myISR(void){
  TC+=0.25;
   PWM16_1_WritePulseWidth(PW);
   PWM16_2_WritePulseWidth(PW);
   if(TC==1){
       PWM16_1_WritePeriod(Ss);
       LCD_1_PrCString("i");
   }
   else if(TC==3){
       PWM16_1_WritePeriod(SSs);
       LCD_1_PrCString("ku");
       }
   else if(TC==7){
       PWM16_1_WritePeriod(FFs);
       LCD_1_PrCString("tsumo");
   }
   else if(TC==9){
       PWM16_1_WritePeriod(MM);
   }
   else if(TC==10.75){
       PWM16_1_WritePeriod(SILENT);
   }
   else if(TC==11){
       PWM16_1_WritePeriod(MM);
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("no");
   }
   else if(TC==16.75)
       PWM16_2_WritePeriod(SILENT);
   else if(TC==17){
       PWM16_1_WritePeriod(R);
       LCD_1_Position(1,0);
       LCD_1_PrCString("hi");
   }
   else if(TC==19){
       PWM16_1_WritePeriod(FFs);
       PWM16_2_WritePeriod(LLs);
       LCD_1_PrCString("bi");
   }
   else if(TC==20){
       PWM16_2_WritePeriod(FFs);
       LCD_1_PrCString("wo");
   }
   else if(TC==20.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==21){
       PWM16_1_WritePeriod(FFs);
   }
   else if(TC==23){
       PWM16_1_WritePeriod(MM);
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("ko");
       }
   else if(TC==24){
       PWM16_1_WritePeriod(FFs);
       LCD_1_PrCString("e");
   }
   else if(TC==25)
       PWM16_2_WritePeriod(FFs);
   else if(TC==26){
       PWM16_1_WritePeriod(SSs);
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("te");
       }
   else if(TC==32.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==33){
       PWM16_1_WritePeriod(Ss);
       LCD_1_Control(0x01);
       LCD_1_PrCString("ta");
   }
   else if(TC==35){
       PWM16_1_WritePeriod(SSs);
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("do");
   }
   else if(TC==37.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==38){
       PWM16_1_WritePeriod(SSs);
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("ri");
   }
   else if(TC==39){
       PWM16_1_WritePeriod(FFs);
       PWM16_2_WritePeriod(LLs);
       LCD_1_PrCString("tsu");
   }
   else if(TC==41){
       PWM16_1_WritePeriod(MM);
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("i");
   }
   else if(TC==42.75)
       PWM16_1_WritePeriod(SILENT);
   else if(TC==43){
       PWM16_1_WritePeriod(MM);
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("ta");
   }
   else if(TC==49){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(MM);
       LCD_1_Position(1,0);
       LCD_1_PrCString("i");
   }
   else if(TC==51){
       PWM16_2_WritePeriod(LLs);
       LCD_1_PrCString("ma");
   }
   else if(TC==53){
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("ga");
   }
   else if(TC==54){
       PWM16_2_WritePeriod(C);
       LCD_1_PrCString("a");
   }
   else if(TC==55){
       PWM16_1_WritePeriod(DDs);
       PWM16_2_WritePeriod(DDs);
   }
   else if(TC==56.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==57){
       PWM16_1_WritePeriod(DDs);
       LCD_1_PrCString("ru");
   }
   else if(TC==58){
       PWM16_1_WritePeriod(C);
   }
   else if(TC==59)
       PWM16_2_WritePeriod(C);
   else if(TC==63){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==65){
       PWM16_2_WritePeriod(SILENT);
       PWM16_1_WritePeriod(Ss);
       LCD_1_Control(0x01);
       LCD_1_PrCString("da");
   }
   else if(TC==67){
       PWM16_1_WritePeriod(SSs);
       PWM16_2_WritePeriod(DD);
       LCD_1_PrCString("ka");
   }
   else if(TC==69.75)
       PWM16_1_WritePeriod(SILENT);
   else if(TC==70){
       PWM16_1_WritePeriod(SSs);
       LCD_1_PrCString("ra");
   }
   else if(TC==71){
       PWM16_2_WritePeriod(SILENT);
       PWM16_1_WritePeriod(FFs);
       LCD_1_PrCString("mo");
   }
   else if(TC==73)
       PWM16_1_WritePeriod(MM);
   else if(TC==74.75)
       PWM16_1_WritePeriod(SILENT);
   else if(TC==75){
       PWM16_1_WritePeriod(MM);
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("u");
   }
   else if(TC==80.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==81){
       PWM16_2_WritePeriod(DDs);
       LCD_1_Position(1,0);
       LCD_1_PrCString("ma");
   }
   else if(TC==82){
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("yo");
   }
   else if(TC==83){
       PWM16_1_WritePeriod(LLs);
       PWM16_2_WritePeriod(FFs);
       LCD_1_PrCString("wa");
   }
   else if(TC==84.75)
       PWM16_2_WritePeriod(SILENT);
   else if(TC==85){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(FFs);
       LCD_1_PrCString("zu");
   }
   else if(TC==85.75)
       PWM16_2_WritePeriod(SILENT);
   else if(TC==86){
       PWM16_2_WritePeriod(FFs);
       LCD_1_PrCString("ni");
   }
   else if(TC==88){
       PWM16_2_WritePeriod(R);
       LCD_1_Control(0x01);
       LCD_1_PrCString("su");
   }
   else if(TC==88.75)
       PWM16_2_WritePeriod(SILENT);
   else if(TC==89){
       PWM16_1_WritePeriod(R);
       PWM16_2_WritePeriod(R);
   }
   else if(TC==91){
       PWM16_1_WritePeriod(SSs);
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("su");
   }
   else if(TC==93){
       PWM16_1_WritePeriod(FFs);
       LCD_1_PrCString("me");
   }
   else if(TC==93.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==94){
       PWM16_1_WritePeriod(FFs);
       PWM16_2_WritePeriod(FFs);
       LCD_1_PrCString("ba");
   }
   else if(TC==97){
       PWM16_1_WritePeriod(SSs);
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("i");
   }
   else if(TC==97.75){
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==98){
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("i");
   }
   else if(TC==99){
       PWM16_1_WritePeriod(MM);
   }
   else if(TC==101){
       PWM16_1_WritePeriod(DDs);
       PWM16_2_WritePeriod(DDs);
       LCD_1_Position(1,0);
       LCD_1_PrCString("e");
   }
   else if(TC==103){
       PWM16_1_WritePeriod(LLs);
       PWM16_2_WritePeriod(C);
       LCD_1_PrCString("i");
   }
   else if(TC==105){
       PWM16_1_WritePeriod(MM);
       PWM16_2_WritePeriod(MM);
       LCD_1_PrCString("ko");
   }
   else if(TC==107){
       PWM16_1_WritePeriod(R);
       PWM16_2_WritePeriod(RR);
       LCD_1_PrCString("u");
   }
   else if(TC==108.75){
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==109){
       PWM16_2_WritePeriod(RR);
       LCD_1_PrCString("no");
   }
   else if(TC==112.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==113){
       PWM16_1_WritePeriod(R);
       LCD_1_Control(0x01);
       LCD_1_PrCString("ka");
   }
   else if(TC==114.75){
       PWM16_1_WritePeriod(SILENT);
   }
   else if(TC==115){
       PWM16_1_WritePeriod(RR);
       PWM16_2_WritePeriod(LLs);
       LCD_1_PrCString("ke");
   }
   else if(TC==117){
       PWM16_1_WritePeriod(SSs);
       LCD_1_PrCString("ha");
   }
   else if(TC==119){
       PWM16_1_WritePeriod(FFs);
       LCD_1_PrCString("shi");
   }
   else if(TC==121){
       PWM16_1_WritePeriod(MM);
       LCD_1_PrCString("e");
   }
   else if(TC==122.75){
       PWM16_1_WritePeriod(SILENT);
   }
   else if(TC==123){
       PWM16_1_WritePeriod(SSs);
       PWM16_2_WritePeriod(C);
       LCD_1_PrCString("to");
   }
   else if(TC==132){
       PWM16_1_WritePeriod(Rs);
       PWM16_2_WritePeriod(Fs);
   }
   else if(TC==136){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==138){
       PWM16_1_WritePeriod(DDs);
       LCD_1_Control(0x01);
       LCD_1_PrCString("ki");
   }
   else if(TC==139){
       PWM16_1_WritePeriod(MM);
       LCD_1_PrCString("mi");
   }
   else if(TC==140){
       PWM16_1_WritePeriod(RR);
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("no");
   }
   else if(TC==144.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==145){
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString(" ko");
   }
   else if(TC==145.75){
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==146){
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("ko");
   }
   else if(TC==146.75){
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==147){
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("ro");
   }
   else if(TC==147.75){
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==148){
       PWM16_1_WritePeriod(RR);
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("he");
   }
   else if(TC==152.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==153){
       PWM16_2_WritePeriod(DDs);
       LCD_1_Position(1,0);
       LCD_1_PrCString("tsu");
   }
   else if(TC==153.75){
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==154){
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("zu");
   }
   else if(TC==155){
       PWM16_1_WritePeriod(RR);
       PWM16_2_WritePeriod(LLs);
       LCD_1_PrCString("ku");
   }
   else if(TC==158){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==160){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(R);
       LCD_1_Control(0x01);
       LCD_1_PrCString("ka");
   }
   else if(TC==162){
       PWM16_1_WritePeriod(RR);
       PWM16_2_WritePeriod(DDs);
       LCD_1_PrCString("ke");
   }
   else if(TC==164){
       PWM16_1_WritePeriod(SSs);
       PWM16_2_WritePeriod(C);
       LCD_1_PrCString("ha");
   }
   else if(TC==166){
       PWM16_1_WritePeriod(FFs);
       PWM16_2_WritePeriod(R);
       LCD_1_PrCString("shi");
   }
   else if(TC==168){
       PWM16_1_WritePeriod(MM);
       PWM16_2_WritePeriod(Ss);
       LCD_1_PrCString("e");
   }
   else if(TC==169.75){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
   }
   else if(TC==170){
       PWM16_1_WritePeriod(MM);
       PWM16_2_WritePeriod(Ss);
       LCD_1_PrCString("to");
   }
   else if(TC==180){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
       LCD_1_Control(0x01);
       LCD_1_PrCString("fin");
   }
   
}

void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   M8C_EnableGInt;
   PWM16_1_Start();
   PWM16_2_Start();
   Timer16_1_EnableInt();
   Timer16_1_Start();
   Timer16_2_EnableInt();
   Timer16_2_Start();
   LCD_1_Start();
   while(1)
   {};
}

考察

「栄光の架け橋」はmid2G(ソ)~hihiA(ラ)まで音階を必要とするため、
音階周波数とPWMクロック計算用スプレッドシートを参考にしながら、hiC(ド)より高い音階を作成した。
また、参考にしていたtimer_pwm2のクロック設定では早すぎたため、
Timerモジュールのクロックを調整し、割り込み回数を計るTC1つ分を16分音符1つと同等とした。つまり、TC2つ分で8分音符、TC4つ分で4分音符となる。
if文を用いてTCの値を指定することで音の長さを調節し、PWM16_1_WritePeriodを用いて音階を指定し演奏を実現した。

文字の表示については、歌詞を順にLCDに表示させようとしたが16文字目以降が表示されなかったため
歌詞の区切りごとに改行し、2行埋まった場合は初期化することで再度表示させることにした。

二部に限らず三部、四部の合唱を実現してみたかったが、PSoCが容量不足であることと、時間が足りなかったことからできなかった。

  • 最終更新:2014-11-18 16:28:55

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

認証パスワード