チーム2036

課題名

ダース・ベイダーのテーマ曲

研究者名

2-15-051 Yutaro Morita
2-15-052 Kazuki Yasuhara

使用機材

PSoC MiniProg
PSoC基盤
スピーカー
USBケーブル


ソースコード

#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,Ds=217,L=204,Ls=193,M=182,F=172,Fs=162,S=153,Ss=145,R=136,Rs=129,C=121;
int 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;
void myISR(void){
TC+=1;
PWM16_1_WritePulseWidth(PW);
if (TC==1)PWM16_1_WritePeriod(S);
else if (TC==4)PWM16_1_WritePeriod(SILENT);
else if (TC==5)PWM16_1_WritePeriod(S);
else if (TC==8)PWM16_1_WritePeriod(SILENT);
else if (TC==9)PWM16_1_WritePeriod(S);
else if (TC==12)PWM16_1_WritePeriod(SILENT);
else if (TC==13)PWM16_1_WritePeriod(Ls);
else if (TC==16)PWM16_1_WritePeriod(Rs);
else if (TC==17)PWM16_1_WritePeriod(S);
else if (TC==21)PWM16_1_WritePeriod(Ls);
else if (TC==24)PWM16_1_WritePeriod(Rs);
else if (TC==25)PWM16_1_WritePeriod(S);
else if (TC==29)PWM16_1_WritePeriod(SILENT);
else if (TC==32)PWM16_1_WritePeriod(LL);
else if (TC==35)PWM16_1_WritePeriod(SILENT);
else if (TC==36)PWM16_1_WritePeriod(LL);
else if (TC==39)PWM16_1_WritePeriod(SILENT);
else if (TC==40)PWM16_1_WritePeriod(LL);
else if (TC==43)PWM16_1_WritePeriod(SILENT);
else if (TC==44)PWM16_1_WritePeriod(LLs);
else if (TC==47)PWM16_1_WritePeriod(Rs);
else if (TC==48)PWM16_1_WritePeriod(Fs);
else if (TC==52)PWM16_1_WritePeriod(Ls);
else if (TC==55)PWM16_1_WritePeriod(Rs);
else if (TC==56)PWM16_1_WritePeriod(S);
else if (TC==60)PWM16_1_WritePeriod(SILENT);
else if (TC==63)PWM16_1_WritePeriod(SS);
else if (TC==67)PWM16_1_WritePeriod(S);
else if (TC==69)PWM16_1_WritePeriod(SILENT);
else if (TC==70)PWM16_1_WritePeriod(S);
else if (TC==71)PWM16_1_WritePeriod(SS);
else if (TC==74)PWM16_1_WritePeriod(FFs);
else if (TC==77)PWM16_1_WritePeriod(FF);
else if (TC==78)PWM16_1_WritePeriod(MM);
else if (TC==79)PWM16_1_WritePeriod(LLs);
else if (TC==80)PWM16_1_WritePeriod(MM);
else if (TC==83)PWM16_1_WritePeriod(SILENT);
else if (TC==84)PWM16_1_WritePeriod(S);
else if (TC==86)PWM16_1_WritePeriod(DDs);
else if (TC==89)PWM16_1_WritePeriod(DD);
else if (TC==92)PWM16_1_WritePeriod(C);
else if (TC==93)PWM16_1_WritePeriod(Rs);
else if (TC==94)PWM16_1_WritePeriod(R);
else if (TC==95)PWM16_1_WritePeriod(Rs);
else if (TC==98)PWM16_1_WritePeriod(SILENT);
else if (TC==99)PWM16_1_WritePeriod(Ls);
else if (TC==101)PWM16_1_WritePeriod(Fs);
else if (TC==104)PWM16_1_WritePeriod(Ls);
else if (TC==106)PWM16_1_WritePeriod(Fs);
else if (TC==108)PWM16_1_WritePeriod(Rs);
else if (TC==110)PWM16_1_WritePeriod(S);
else if (TC==112)PWM16_1_WritePeriod(Rs);
else if (TC==114)PWM16_1_WritePeriod(LL);
else if (TC==118)PWM16_1_WritePeriod(SILENT);
else if (TC==119) TC=0;
}
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
  // Insert your main routine code here.
  M8C_EnableGInt;
  PWM16_1_Start();
  Timer16_1_EnableInt();
  Timer16_1_Start();
  while(1)
  { };
}

設計過程

実習で用いたtimer_pwm2を参考に設計した。
(1)音
ダース・ベイダーのテーマ曲は非常に#の音が使われていて、はじめドの#のときVC3の値がわからなかったが、Timer16を設計するときに用いたscale_freqというExcel資料にVC3の値が載っておりそれを使った。また。VC3の計算方法も載っていたため高いドレミの音を作成した。高いドレミの周波数は音階周波数(https://tomari.org/main/java/oto.html)を使用し、Excelに代入して計算した。

int SILENT=0,D=229,Ds=217,L=204,Ls=193,M=182,F=172,Fs=162,S=153,Ss=145,R=136,Rs=129,C=121;
int DD=115,DDs=108,LL=102,LLs=96,MM=91,FF=86,FFs=81,SS=77,SSs=72,RR=68,RRs=64,CC=61;

(2)リズム
YouTube上のダースベイダーのテーマをピアノで演奏している動画を聞いてリズムをあわせた。また、その動画に載っていた楽譜を用いた。

参考文献
scale_freq.xls
スターウォーズ帝国のマーチ(ダース・ベイダーのテーマ)〔ピアノ連弾〕
音階周波数


考察

今回、繰り返しの使い方がわからず演奏が終わったあとにTCの値を0に変えることで繰り返しを実行した。このPSoCのソースコードはCで作られているのでfor文での実行もできると考える。また、chipでTimer16_1、PWM16_1を作り、演奏してるのでTimer16_2、PWM16_2を作ればさらに複雑な音楽を作ることができるのではないかと考えた。

  • 最終更新:2020-07-28 12:45:28

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

認証パスワード