チーム1247
課題名
FURUSATO
研究者名
14組53番 米澤 剛
14組54番 米山 幸孝
概要
過去に演習を行ったtimer_pwm2とpwm_uart_2の二つを組み合わせて音楽を演奏させる装置を作った。
uartモジュールを用いることでPCへコマンドを打ち込めば、そのコマンドに合わせた音楽を再生や停止するようにした。
また、3つのスピーカーを使うことでそれぞれ別の音を鳴らすことができる。
"A"のボタンを押せば主旋律、"B"で副旋律、"C"だと伴奏で、"D"では3つを合わせたものを演奏し、
演奏を終了させるときには"0"を押せば終了する。
PC上は以下の画面が現れる。
以下が全体図である。
使用したもの
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