チーム1733
課題名
かえるの大合唱
研究者名
Shota Isozaki
Kotaro Ichikawa
概要
かえるのうたの輪唱を3つのスピーカーで再現した。
音域を3オクターブ用意し、それぞれのスピーカーで違う音域のかえるのうたを演奏する。
はじめは一番高い音のかえるのうたを演奏して次に低い音、その次に一番低い音のかえるのうたを被せていき輪唱させる。
使用機器
PSoC基盤 1個
スピーカー 3つ
ジャンパ線 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,T=1;//pulse width
int SILENT=0, D0=458, L0=408, M0=364, F0=343,S0=306, R0=273, C0=243, D1=229,
L1=204, M1=182, F1=172, S1=153, R1=136, C1=121, D2=115,L2=102, M2=91, F2=86, S2=77, R2=68, C2=61; //Scale
int TC=0;//Time Count
void myISR(void)
{
TC+=1;
PWM16_1_WritePulseWidth(PW); PWM16_2_WritePulseWidth(PW); PWM16_3_WritePulseWidth(PW); if(TC==2)PWM16_1_WritePeriod(D2); if(TC==6)PWM16_1_WritePeriod(L2); if(TC==10)PWM16_1_WritePeriod(M2); if(TC==14)PWM16_1_WritePeriod(F2); if(TC==18)PWM16_1_WritePeriod(M2); if(TC==22)PWM16_1_WritePeriod(L2); if(TC==26)PWM16_1_WritePeriod(D2); if(TC==30)PWM16_1_WritePeriod(SILENT); if(TC==34){ PWM16_1_WritePeriod(M2); PWM16_2_WritePeriod(D1); } if(TC==38){ PWM16_1_WritePeriod(F2); PWM16_2_WritePeriod(L1); } if(TC==42){ PWM16_1_WritePeriod(S2); PWM16_2_WritePeriod(M1); } if(TC==46){ PWM16_1_WritePeriod(R2); PWM16_2_WritePeriod(F1); } if(TC==50){ PWM16_1_WritePeriod(S2); PWM16_2_WritePeriod(M1); } if(TC==54){ PWM16_1_WritePeriod(F2); PWM16_2_WritePeriod(L1); } if(TC==58){ PWM16_1_WritePeriod(M2); PWM16_2_WritePeriod(D1); } if(TC==62){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); } if(TC==66){ PWM16_1_WritePeriod(D2); PWM16_2_WritePeriod(M1); PWM16_3_WritePeriod(D0); }
if(TC==70){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(F1); PWM16_3_WritePeriod(L0); } if(TC==74){ PWM16_1_WritePeriod(D2); PWM16_2_WritePeriod(S1); PWM16_3_WritePeriod(M0); }
if(TC==78){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(R1); PWM16_3_WritePeriod(F0); }
if(TC==82){
PWM16_1_WritePeriod(D2); PWM16_2_WritePeriod(S1); PWM16_3_WritePeriod(M0); } if(TC==86){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(F1); PWM16_3_WritePeriod(L0); } if(TC==90){ PWM16_1_WritePeriod(D2); PWM16_2_WritePeriod(M1); PWM16_3_WritePeriod(D0); } if(TC==94){ PWM16_1_WritePeriod(SILENT); PWM16_2_WritePeriod(SILENT); PWM16_3_WritePeriod(SILENT); }
if(TC==98){
PWM16_1_WritePeriod(D2);
PWM16_2_WritePeriod(D1);
PWM16_3_WritePeriod(M0);
}
if(TC==99)PWM16_1_WritePeriod(SILENT);
if(TC==100)PWM16_1_WritePeriod(D2);
if(TC==101)PWM16_1_WritePeriod(SILENT);
if(TC==102){
PWM16_1_WritePeriod(L2);
PWM16_2_WritePeriod(SILENT);
PWM16_3_WritePeriod(F0);
}
if(TC==103)PWM16_1_WritePeriod(SILENT);
if(TC==104)PWM16_1_WritePeriod(L2);
if(TC==105)PWM16_1_WritePeriod(SILENT);
if(TC==106){
PWM16_1_WritePeriod(M2);
PWM16_2_WritePeriod(D1);
PWM16_3_WritePeriod(S0);
}
if(TC==107)PWM16_1_WritePeriod(SILENT);
if(TC==108)PWM16_1_WritePeriod(M2);
if(TC==109)PWM16_1_WritePeriod(SILENT);
if(TC==110){
PWM16_1_WritePeriod(F2);
PWM16_2_WritePeriod(SILENT);
PWM16_3_WritePeriod(R0);
}
if(TC==111)PWM16_1_WritePeriod(SILENT);
if(TC==112)PWM16_1_WritePeriod(F2);
if(TC==113)PWM16_1_WritePeriod(SILENT);
if(TC==114){
PWM16_1_WritePeriod(M2);
PWM16_2_WritePeriod(D1);
PWM16_3_WritePeriod(S0);
}
if(TC==118){
PWM16_1_WritePeriod(L2);
PWM16_2_WritePeriod(SILENT);
PWM16_3_WritePeriod(F0);
}
if(TC==122){
PWM16_1_WritePeriod(D2);
PWM16_2_WritePeriod(D1);
PWM16_3_WritePeriod(M0);
}
if(TC==126){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
PWM16_3_WritePeriod(SILENT);
}
if(TC==130){
PWM16_2_WritePeriod(D1);
PWM16_3_WritePeriod(D0);
}
if(TC==131)PWM16_2_WritePeriod(SILENT);
if(TC==132)PWM16_2_WritePeriod(D1);
if(TC==133)PWM16_2_WritePeriod(SILENT);
if(TC==134){
PWM16_2_WritePeriod(L1);
PWM16_3_WritePeriod(SILENT);
}
if(TC==135)PWM16_2_WritePeriod(SILENT);
if(TC==136)PWM16_2_WritePeriod(L1);
if(TC==137)PWM16_2_WritePeriod(SILENT);
if(TC==138){
PWM16_2_WritePeriod(M1);
PWM16_3_WritePeriod(D0);
}
if(TC==139)PWM16_2_WritePeriod(SILENT);
if(TC==140)PWM16_2_WritePeriod(M1);
if(TC==141)PWM16_2_WritePeriod(SILENT);
if(TC==142){
PWM16_2_WritePeriod(F1);
PWM16_3_WritePeriod(SILENT);
}
if(TC==143)PWM16_2_WritePeriod(SILENT);
if(TC==144)PWM16_2_WritePeriod(F1);
if(TC==145)PWM16_2_WritePeriod(SILENT);
if(TC==146){
PWM16_2_WritePeriod(M1);
PWM16_3_WritePeriod(D0);
}
if(TC==150){
PWM16_2_WritePeriod(L1);
PWM16_3_WritePeriod(SILENT);
}
if(TC==154){
PWM16_2_WritePeriod(D1);
PWM16_3_WritePeriod(D0);
}
if(TC==158){
PWM16_2_WritePeriod(SILENT);
PWM16_3_WritePeriod(SILENT);
}
if(TC==162)PWM16_3_WritePeriod(D0);
if(TC==163)PWM16_3_WritePeriod(SILENT);
if(TC==164)PWM16_3_WritePeriod(D0);
if(TC==165)PWM16_3_WritePeriod(SILENT);
if(TC==166)PWM16_3_WritePeriod(L0);
if(TC==167)PWM16_3_WritePeriod(SILENT);
if(TC==168)PWM16_3_WritePeriod(L0);
if(TC==169)PWM16_3_WritePeriod(SILENT);
if(TC==170)PWM16_3_WritePeriod(M0);
if(TC==171)PWM16_3_WritePeriod(SILENT);
if(TC==172)PWM16_3_WritePeriod(M0);
if(TC==173)PWM16_3_WritePeriod(SILENT);
if(TC==174)PWM16_3_WritePeriod(F0);
if(TC==175)PWM16_3_WritePeriod(SILENT);
if(TC==176)PWM16_3_WritePeriod(F0);
if(TC==177)PWM16_3_WritePeriod(SILENT);
if(TC==178)PWM16_3_WritePeriod(M0);
if(TC==182)PWM16_3_WritePeriod(L0);
if(TC==186)PWM16_3_WritePeriod(D0);
if(TC==190)PWM16_3_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(); PWM16_2_Start(); PWM16_3_Start(); Timer16_1_EnableInt(); Timer16_1_Start();
}
考察
タイムカウントを使用しまして、PWM16を3つ使用しました。その際に、タイムカウントをカウントしていくたびに音域を変化させていき、音が重なるところでは、複数のPWM16が作動します。
「カエルの歌」を採用していますが、カエルの歌の終盤では、音が重なるところで「ミ・ファ・ソ・ラ・ソ・ファ・ミ」と「ド・休・ド・休・レ・休・レ・休・ミ
・休・ファ・休・ファ・ミ・レ・ド」というテンポが異なる場面がある。そこで、最もゆっくりのリズムのところをタイムカンウトが4変化するときに変化させるすると、「ドーーー」と「ド休ド休」テンポが合わせられるようになる。そのようなことを考慮した。
機器「CY8C27443-24PXI」は、GNDが2つしか搭載されていないので、GNDをジャンパー線を用いてタコ足にしなければならない。
<参考にした作品>
チーム1715
チーム1439
- 最終更新:2017-07-11 14:15:26