チーム1533
課題名
電子オルゴール
研究者名
Shigenori Kojima
Ryuya Shiokawa
概要
timer_pwm2を利用し、クリスマスによく聞く赤鼻のトナカイを演奏するようにした。
使用機材
・PSoC基盤 1個
・MiniProg 1個
・スピーカー 1個
ソースコード
#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, MR=273, D=229, DC=217, L=204, LC=193, M=182, F=172, FC=162, S=153, SC=145, R=136, RC=129, C=121, DD=115, DDC=108, LL=102, LLC=96, MM=91, FF=86, FFC=81, SS=77, SSC=72, RR=68, RRC=64;
int TC=0; //Time Count
void myISR(void)
{
TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);
if(TC == 1)
PWM16_1_WritePeriod(S);
else if(TC == 5)
PWM16_1_WritePeriod(R);
else if (TC == 7)
PWM16_1_WritePeriod(S);
else if(TC == 9)
PWM16_1_WritePeriod(M);
else if(TC == 13)
PWM16_1_WritePeriod(DD);
else if (TC == 17)
PWM16_1_WritePeriod(R);
else if(TC == 21)
PWM16_1_WritePeriod(S);
else if(TC == 29)
PWM16_1_WritePeriod(SILENT);
else if(TC == 33)
PWM16_1_WritePeriod(S);
else if (TC == 35)
PWM16_1_WritePeriod(R);
else if(TC == 37)
PWM16_1_WritePeriod(S);
else if(TC == 39)
PWM16_1_WritePeriod(R);
else if (TC == 41)
PWM16_1_WritePeriod(S);
else if(TC == 45)
PWM16_1_WritePeriod(DD);
else if(TC == 49)
PWM16_1_WritePeriod(C);
else if(TC == 61)
PWM16_1_WritePeriod(SILENT);
else if(TC == 65)
PWM16_1_WritePeriod(F);
else if (TC == 67)
PWM16_1_WritePeriod(S);
else if(TC == 69)
PWM16_1_WritePeriod(F);
else if(TC == 73)
PWM16_1_WritePeriod(L);
else if(TC == 77)
PWM16_1_WritePeriod(C);
else if (TC == 81)
PWM16_1_WritePeriod(R);
else if(TC == 85)
PWM16_1_WritePeriod(S);
else if(TC == 93)
PWM16_1_WritePeriod(SILENT);
else if(TC == 97)
PWM16_1_WritePeriod(S);
else if(TC == 99)
PWM16_1_WritePeriod(R);
else if(TC == 101)
PWM16_1_WritePeriod(S);
else if (TC == 103)
PWM16_1_WritePeriod(R);
else if(TC == 105)
PWM16_1_WritePeriod(S);
else if(TC == 109)
PWM16_1_WritePeriod(R);
else if (TC == 113)
PWM16_1_WritePeriod(M);
else if(TC == 125)
PWM16_1_WritePeriod(SILENT);
else if(TC == 129)
PWM16_1_WritePeriod(S);
else if (TC == 131)
PWM16_1_WritePeriod(R);
else if(TC == 133)
PWM16_1_WritePeriod(S);
else if(TC == 137)
PWM16_1_WritePeriod(M);
else if(TC == 141)
PWM16_1_WritePeriod(DD);
else if (TC == 145)
PWM16_1_WritePeriod(R);
else if(TC == 149)
PWM16_1_WritePeriod(S);
else if(TC == 157)
PWM16_1_WritePeriod(SILENT);
else if(TC == 161)
PWM16_1_WritePeriod(S);
else if(TC == 163)
PWM16_1_WritePeriod(R);
else if(TC == 165)
PWM16_1_WritePeriod(S);
else if (TC == 167)
PWM16_1_WritePeriod(R);
else if(TC == 169)
PWM16_1_WritePeriod(S);
else if(TC == 173)
PWM16_1_WritePeriod(DD);
else if (TC == 177)
PWM16_1_WritePeriod(C);
else if(TC == 189)
PWM16_1_WritePeriod(SILENT);
else if(TC == 193)
PWM16_1_WritePeriod(F);
else if(TC == 197)
PWM16_1_WritePeriod(S);
else if (TC == 199)
PWM16_1_WritePeriod(F);
else if(TC == 201)
PWM16_1_WritePeriod(L);
else if(TC == 205)
PWM16_1_WritePeriod(C);
else if (TC == 209)
PWM16_1_WritePeriod(R);
else if(TC == 213)
PWM16_1_WritePeriod(S);
else if(TC == 221)
PWM16_1_WritePeriod(SILENT);
else if(TC == 225)
PWM16_1_WritePeriod(S);
else if (TC == 227)
PWM16_1_WritePeriod(R);
else if(TC == 229)
PWM16_1_WritePeriod(S);
else if(TC == 231)
PWM16_1_WritePeriod(R);
else if (TC == 233)
PWM16_1_WritePeriod(S);
else if(TC == 237)
PWM16_1_WritePeriod(LL);
else if(TC == 241)
PWM16_1_WritePeriod(DD);
else if(TC == 253)
PWM16_1_WritePeriod(SILENT);
else if (TC == 257)
PWM16_1_WritePeriod(R); else if (TC == 261) PWM16_1_WritePeriod(R); else if (TC == 265) PWM16_1_WritePeriod(DD); else if (TC == 269) PWM16_1_WritePeriod(R);
else if (TC == 273) PWM16_1_WritePeriod(S); else if (TC == 277) PWM16_1_WritePeriod(M); else if (TC == 281) PWM16_1_WritePeriod(S); else if (TC == 289) PWM16_1_WritePeriod(F); else if (TC == 293) PWM16_1_WritePeriod(R); else if (TC == 297) PWM16_1_WritePeriod(S); else if (TC == 301) PWM16_1_WritePeriod(F); else if (TC == 305) PWM16_1_WritePeriod(M); else if (TC == 317) PWM16_1_WritePeriod(SILENT);
else if (TC == 321) PWM16_1_WritePeriod(L); else if (TC == 325) PWM16_1_WritePeriod(M); else if (TC == 329) PWM16_1_WritePeriod(S); else if (TC == 333) PWM16_1_WritePeriod(R);
else if (TC == 337) PWM16_1_WritePeriod(C); else if (TC == 341) PWM16_1_WritePeriod(C); else if (TC == 345) PWM16_1_WritePeriod(C); else if (TC == 353) PWM16_1_WritePeriod(DD); else if (TC == 357) PWM16_1_WritePeriod(DD); else if (TC == 361) PWM16_1_WritePeriod(C); else if (TC == 365) PWM16_1_WritePeriod(R); else if (TC == 369) PWM16_1_WritePeriod(S); else if (TC == 373) PWM16_1_WritePeriod(F); else if (TC == 375) PWM16_1_WritePeriod(L); else if (TC == 377) PWM16_1_WritePeriod(L); else if (TC == 385) PWM16_1_WritePeriod(SILENT); //7
else if(TC == 389)
PWM16_1_WritePeriod(S);
else if (TC == 391)
PWM16_1_WritePeriod(R);
else if(TC == 393)
PWM16_1_WritePeriod(S);
else if(TC == 397)
PWM16_1_WritePeriod(M);
else if(TC == 401)
PWM16_1_WritePeriod(DD);
else if (TC == 405)
PWM16_1_WritePeriod(R);
else if(TC == 409)
PWM16_1_WritePeriod(S);
else if(TC == 417)
PWM16_1_WritePeriod(SILENT);
else if(TC == 421)
PWM16_1_WritePeriod(S);
else if(TC == 423)
PWM16_1_WritePeriod(R);
else if(TC == 425)
PWM16_1_WritePeriod(S);
else if (TC == 427)
PWM16_1_WritePeriod(R);
else if(TC == 429)
PWM16_1_WritePeriod(S);
else if(TC == 433)
PWM16_1_WritePeriod(DD);
else if (TC == 437)
PWM16_1_WritePeriod(C);
else if(TC == 449)
PWM16_1_WritePeriod(SILENT);
else if(TC == 453)
PWM16_1_WritePeriod(F);
else if(TC == 455)
PWM16_1_WritePeriod(S);
else if (TC == 457)
PWM16_1_WritePeriod(F);
else if(TC == 461)
PWM16_1_WritePeriod(L);
else if(TC == 465)
PWM16_1_WritePeriod(C);
else if (TC == 469)
PWM16_1_WritePeriod(R);
else if(TC == 473)
PWM16_1_WritePeriod(S);
else if(TC == 481)
PWM16_1_WritePeriod(SILENT);
else if(TC == 485)
PWM16_1_WritePeriod(S);
else if (TC == 487)
PWM16_1_WritePeriod(R);
else if(TC == 489)
PWM16_1_WritePeriod(S);
else if(TC == 491)
PWM16_1_WritePeriod(R);
else if (TC == 493)
PWM16_1_WritePeriod(S);
else if(TC == 497)
PWM16_1_WritePeriod(LL);
else if(TC == 501)
PWM16_1_WritePeriod(DD);
else if(TC == 513)
PWM16_1_WritePeriod(SILENT);
else if(TC == 517)
TC=0;
}
void main()
{
// Insert your main routine code here. M8C_EnableGInt; PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); while(1) {};
}
考察
オルゴールは繰り返し鳴り続けるため、一曲が終わった際TCに0を代入し、繰り返すようにしている。
原曲に近づけるためにperiodの値を変更し、割り込みの間隔を短くした。
スイッチによる曲の一時停止などを実現したかったが時間が足りなかった。
VRや距離センサーを使用して音量調節や演奏速度の調節ができたらもっと実用的になったと考えられる。
- 最終更新:2015-07-14 15:43:48