チーム1247

課題名


FURUSATO

研究者名

14組53番 米澤 剛
14組54番 米山 幸孝

概要


過去に演習を行ったtimer_pwm2とpwm_uart_2の二つを組み合わせて音楽を演奏させる装置を作った。
uartモジュールを用いることでPCへコマンドを打ち込めば、そのコマンドに合わせた音楽を再生や停止するようにした。
また、3つのスピーカーを使うことでそれぞれ別の音を鳴らすことができる。
"A"のボタンを押せば主旋律、"B"で副旋律、"C"だと伴奏で、"D"では3つを合わせたものを演奏し、
演奏を終了させるときには"0"を押せば終了する。

PC上は以下の画面が現れる。
自由課題 テラ.png

以下が全体図である。
自由課題.jpg

使用したもの


PsoC本体 1つ
通信ケーブル 1本
スピーカー 3つ
ジャンパー線 8本

ソースコード




#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,m = 364, f = 343, s = 306, r = 273, rs = 258, c = 243,D = 229, Ds = 217, L = 204,
          Ls = 193, M = 182, F = 172, Fs = 162,
           S = 153, Ss = 145, R = 136, Rs = 129, C = 129, DD = 115, DDs = 108, LL = 102, LLs = 96,
           MM = 91, FF = 86, FFs = 81, SS = 77, SSs = 72, RR = 68, RRs = 64, CC = 61;
int TC = 0;
int part = 0;

void myISR(void){
  if(part == 0){
       PWM16_1_WritePeriod(SILENT);
       PWM16_2_WritePeriod(SILENT);
       PWM16_3_WritePeriod(SILENT);
   }
   else if(part == 1)...

   else if(part == 2)...
       
   else if(part == 3)...
       
   else if(part == 4){
       TC += 1; 
       PWM16_1_WritePulseWidth(PW);
       PWM16_2_WritePulseWidth(PW);
       PWM16_3_WritePulseWidth(PW);
       //1
       if(TC == 1){
           PWM16_1_WritePeriod(F);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(f);
       }
       else if(TC == 4){
           PWM16_1_WritePeriod(F);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(F);
       }
       else if(TC == 8){
           PWM16_1_WritePeriod(F);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(f);
       }
       //2
       else if(TC == 12){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(M);
           PWM16_3_WritePeriod(D);
       }
       else if(TC == 16)
           PWM16_3_WritePeriod(Ls);    
       else if(TC == 18){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);
       }
       else if(TC == 20){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(M);
           PWM16_3_WritePeriod(D);
       }
       //3
       else if(TC == 24){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);        
           PWM16_3_WritePeriod(f);
       }
       else if(TC == 28){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(F);
       }
       else if(TC == 32){
           PWM16_1_WritePeriod(C);
           PWM16_2_WritePeriod(S);
           PWM16_3_WritePeriod(S);
       }
       //4
       else if(TC == 36){
           PWM16_1_WritePeriod(DD);
           PWM16_2_WritePeriod(R);
           PWM16_3_WritePeriod(R);
       }
       else if(TC == 44)
           PWM16_3_WritePeriod(F);
       
       //5
       else if(TC == 48){
           PWM16_1_WritePeriod(C);
           PWM16_2_WritePeriod(L);
           PWM16_3_WritePeriod(c);
       }
       else if(TC == 52){
           PWM16_1_WritePeriod(DD);
           PWM16_2_WritePeriod(M);
           PWM16_3_WritePeriod(r);
       }
       else if(TC == 56){
           PWM16_1_WritePeriod(LL);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(s);
       }
       //6
       else if(TC == 60){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(f);
       }
       else if(TC == 64){
           PWM16_3_WritePeriod(s);
           }
       else if(TC == 66){
           PWM16_1_WritePeriod(C);
           PWM16_2_WritePeriod(S);
       }
       else if(TC == 68){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(r);
       }
       //7
       else if(TC == 72){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(M);
           PWM16_3_WritePeriod(c);
       }
       else if(TC == 76){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(M);
           PWM16_3_WritePeriod(s);
       }
       else if(TC == 80){
           PWM16_1_WritePeriod(M);
           PWM16_2_WritePeriod(D);
           PWM16_3_WritePeriod(D);
       }
       //8
       else if(TC == 84){
           PWM16_1_WritePeriod(F);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(f);
       }
       else if(TC == 88)
           PWM16_3_WritePeriod(D);
       else if(TC == 92){
           PWM16_1_WritePeriod(SILENT);
           PWM16_2_WritePeriod(SILENT);
           PWM16_3_WritePeriod(F);
       }
       //9
       else if(TC == 96){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(S);
           PWM16_3_WritePeriod(D);
       }
       else if(TC == 98){
           PWM16_1_WritePeriod(F);
           PWM16_2_WritePeriod(F);
       }
       else if(TC == 100){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(S);
       }
       else if(TC == 104){
           PWM16_1_WritePeriod(D);
           PWM16_2_WritePeriod(D);
           PWM16_3_WritePeriod(D);
       }
       //10
       else if(TC == 108){
           PWM16_1_WritePeriod(F);
           PWM16_2_WritePeriod(m);
           PWM16_3_WritePeriod(F);
       }
       else if(TC == 110){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(D);
       }
       else if(TC == 112){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);
       }
       else if(TC == 116){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(F);
       }
       //11
       else if(TC == 120){
           PWM16_1_WritePeriod(C);
           PWM16_2_WritePeriod(S);
           PWM16_3_WritePeriod(c);
       }
       else if(TC == 122){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(Ss);
       }
       else if(TC == 124){
           PWM16_1_WritePeriod(C);
           PWM16_2_WritePeriod(S);
       }
       else if(TC == 128)
           PWM16_3_WritePeriod(D);
       else if(TC == 130){
           PWM16_1_WritePeriod(LL);
           PWM16_2_WritePeriod(F);
       }
       //12
       else if(TC == 132){
           PWM16_1_WritePeriod(DD);
           PWM16_2_WritePeriod(M);
           PWM16_3_WritePeriod(F);
       }
       else if(TC == 134){
           PWM16_1_WritePeriod(C);
           PWM16_2_WritePeriod(S);
       }
       else if(TC == 136){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(F);
       }
       //13
       else if(TC == 144){
           PWM16_1_WritePeriod(DD);
           PWM16_2_WritePeriod(C);
           PWM16_3_WritePeriod(rs);
       }
       else if(TC == 148){
           PWM16_1_WritePeriod(DD);
           PWM16_2_WritePeriod(R);
           PWM16_3_WritePeriod(D);
       }
       else if(TC == 152){
           PWM16_1_WritePeriod(DD);
           PWM16_2_WritePeriod(S);
           PWM16_3_WritePeriod(F);
       }
       //14
       else if(TC == 156){
           PWM16_1_WritePeriod(F);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(r);
       }
       else if(TC == 162){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(M);
           PWM16_3_WritePeriod(rs);
       }
       else if(TC == 164){
           PWM16_1_WritePeriod(R);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(D);
       }
       //15
       else if(TC == 168){
           PWM16_1_WritePeriod(C);
           PWM16_2_WritePeriod(L);
           PWM16_3_WritePeriod(s);
       }
       else if(TC == 172){
           PWM16_1_WritePeriod(C);
           PWM16_2_WritePeriod(S);
           PWM16_3_WritePeriod(s);
       }
       else if(TC == 176){
           PWM16_1_WritePeriod(S);
           PWM16_2_WritePeriod(M);
           PWM16_3_WritePeriod(D);
       }
       //16
       else if(TC == 180){
           PWM16_1_WritePeriod(F);
           PWM16_2_WritePeriod(F);
           PWM16_3_WritePeriod(f);
       }
       else if(TC == 188){
           PWM16_1_WritePeriod(SILENT);
           PWM16_2_WritePeriod(SILENT);
           PWM16_3_WritePeriod(SILENT);
       }
   }
   
   if(part == 5){
       PWM16_1_WritePeriod(D);
       PWM16_2_WritePeriod(M);
       PWM16_3_WritePeriod(S);
   }
}

void main(){
  char * strPtr; // Parameter pointer <=Char型変数の宣言
   UART_CmdReset(); // Initialize receiver/cmd buffer <=コマンドバッファのリセット
   UART_IntCntl(UART_ENABLE_RX_INT); // Enable RX interrupts <=RX割込のイネーブル
   Counter8_WritePeriod(155); // Set up baud rate generat
   Counter8_WriteCompareValue(78);
   Counter8_Start(); // Turn on baud rate generator
   UART_Start(UART_PARITY_NONE); // Enable UART <=UARTのモード設定
   M8C_EnableGInt ; // Turn on interrupts
   PWM16_1_Start();
   PWM16_2_Start();
   PWM16_3_Start();
   Timer16_1_EnableInt();
   Timer16_1_Start();
   UART_CPutString("パートA,B,Cから演奏するものを選んでください");
   UART_CPutString("\n\r");
   UART_CPutString("A → Aパート");
   UART_CPutString("\n\r");
   UART_CPutString("B → Bパート");
   UART_CPutString("\n\r");
   UART_CPutString("C → Cパート");
   UART_CPutString("\n\r");
   UART_CPutString("D → A+B+C");
   UART_CPutString("\n\r"); 
   UART_CPutString("0→再生停止");
   UART_CPutString("\n\r"); 
   
   while(1) {
       if(UART_bCmdCheck()) { // Wait for command
           if(strPtr = UART_szGetParam()) { // More than delimiter?
               UART_CPutString("Found valid commandCommand =>");
               UART_PutString(strPtr); // Print out command
               UART_CPutString("<Paramaters:");
               UART_CPutString("\n\r"); 
               
               if (*strPtr=='A'){
                   TC=0;
                   part=1;
               }
               else if (*strPtr=='B'){
                   TC=0;
                   part=2;
               }
               else if (*strPtr=='C'){
                   TC=0;
                   part=3;
               }
               else if (*strPtr=='D'){
                   TC=0;
                   part=4;
               }
               else if(*strPtr=='0'){
                   TC=0;
                   part=0;
               }
               UART_CmdReset(); // Reset command buffer}
           }
       }
   }
}

考察


今回のソースで異なるif文の中で同じtimerを用いて音を鳴らそうとしたが、別のifを参照する際に時間がかかり、パート毎の音を出力するタイミングが同時ではなくなってしまったため、それぞれのパートの演奏のタイミングがずれてしまった。
そのため、今回は同時に複数の音を出すときは一つのif文の中ですべての音の出力を管理して音の出力にずれが出ないようにしたため、それぞれの演奏方法毎に音の管理の文を書いていて、プログラムがあまりにも長くなってしまった。

  • 最終更新:2012-10-23 16:11:07

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

認証パスワード