チーム2211
課題名
Meiji Music Machine
研究者名
Osuke Nagaoka
Haruto Nakano
概要
突然だがこれを見ている諸君は明治大学の校歌を歌えるだろうか。明治の学生たるもの自分の大学の校歌を歌えたら...という場面に出くわすことは日常茶飯事だ。しかし、大学の校歌を歌えるという学生を僕は一人しか見たことがない。これは由々しき事態だととらえるべきだろう。そこで今回、開発されたのがMeiji Music Machineである。これはPSoC基板とPCでシリアル通信を行い、PCからのコマンド「1」を受け付けるとなんと明治大学校歌が流れるのだ!さらに、LCDに歌詞を表示する機能も搭載!これで明治大学の校歌を練習し、歌えるようになろう!ちなみにコマンド「2」「3」に対応する曲は終わらなくて未完成だ!
大まかな機能や仕組み
シリアル通信を行い、起動するとPCのディスプレイ上にはスタート画面が表示され、打ち込んだ数字に対応する曲が流れるようになる。PSoC基板からは「ドレミファソラシド」が流れ、「Meiji Music Machine」と表示される。対応している数字は「1」「2」「3」であり、内「1」は明治大学校歌が流れ「2」「3」はまだ未完成。曲が流れている間は「s」を打つと曲が停止し、その間にほかの数字を打ち込むとその数字に対応した曲が流れる。曲を停止していない状態でほかの数字を打ち込むと曲を停止するよう警告が出る。
曲の流れる仕組みはTimerモジュールで割り込みを行い、音の高さとリズムをコントロールしている。停止はTCの値を9999に飛ばすことで実現させた。
曲の流れる仕組みはTimerモジュールで割り込みを行い、音の高さとリズムをコントロールしている。停止はTCの値を9999に飛ばすことで実現させた。
ソースコード
#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,L=204,M=182,F=172,S=153,R=136,C=121,DD=115;//ドレミファソラシド
int TC=0;
int UR=273,UC=243,LF=217,SF=162,RF=145,LLF=108,CF=129;//低ラ 低シ レb 高レb シb
int FS=163,DDS=108,LL=102,MM=91,FFS=81;//ド# ファ# 高レ 高ミ 高ファ#
int track=0;//0:初期値 1:校歌 2:応援歌 3:隠しトラック 4:隠しトラック
void myISR(void){
TC +=1;
PWM16_1_WritePulseWidth(PW);
if(track==0){ if(TC==1) PWM16_1_WritePeriod(D); else if (TC==6) PWM16_1_WritePeriod(L); else if (TC==11) PWM16_1_WritePeriod(M); else if (TC==16) PWM16_1_WritePeriod(F); else if (TC==21) PWM16_1_WritePeriod(S); else if (TC==26) PWM16_1_WritePeriod(R); else if (TC==31) PWM16_1_WritePeriod(C); else if (TC==36) PWM16_1_WritePeriod(DD); else if (TC==41){ PWM16_1_WritePeriod(SILENT); TC=9999;} } if(track==1){ if(TC==1){//白雲なびく LCD_Position(0,0); LCD_PrCString("Shirakumonabiku "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(UR);} else if(TC==9) PWM16_1_WritePeriod(L); else if(TC==17) PWM16_1_WritePeriod(M); else if(TC==25) PWM16_1_WritePeriod(FS); else if(TC==33) PWM16_1_WritePeriod(S); else if(TC==41) PWM16_1_WritePeriod(C); else if(TC==45) PWM16_1_WritePeriod(R); else if(TC==65){//駿河台 LCD_Position(0,0); LCD_PrCString("Surugadai "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(L);} else if(TC==71) PWM16_1_WritePeriod(M); else if(TC==73) PWM16_1_WritePeriod(FS); else if(TC==81) PWM16_1_WritePeriod(R); else if(TC==89) PWM16_1_WritePeriod(LL); else if(TC==97) PWM16_1_WritePeriod(C); else if(TC==105) PWM16_1_WritePeriod(R); else if(TC==129){//眉秀でたる LCD_Position(0,0); LCD_PrCString("Mayuhiidetaru "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(FFS);} else if(TC==135) PWM16_1_WritePeriod(MM); else if(TC==137) PWM16_1_WritePeriod(LL); else if(TC==145) PWM16_1_WritePeriod(LL); else if(TC==153) PWM16_1_WritePeriod(LL); else if(TC==161) PWM16_1_WritePeriod(C); else if(TC==169) PWM16_1_WritePeriod(LL); else if(TC==173) PWM16_1_WritePeriod(R); else if(TC==193){//若人が LCD_Position(0,0); LCD_PrCString("Wakoudoga "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(FS);} else if(TC==199) PWM16_1_WritePeriod(R); else if(TC==201) PWM16_1_WritePeriod(LL); else if(TC==209) PWM16_1_WritePeriod(C); else if(TC==217) PWM16_1_WritePeriod(R); else if(TC==225) PWM16_1_WritePeriod(FS); else if(TC==233) PWM16_1_WritePeriod(M); else if(TC==257){//衝くや時代の LCD_Position(0,0); LCD_PrCString("Tsukuya jidaino "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(R);} else if(TC==261) PWM16_1_WritePeriod(MM); else if(TC==265) PWM16_1_WritePeriod(LL); else if(TC==289) PWM16_1_WritePeriod(FS); else if(TC==293) PWM16_1_WritePeriod(S); else if(TC==297) PWM16_1_WritePeriod(R); else if(TC==313) PWM16_1_WritePeriod(R); else if(TC==321){//あけの鐘 LCD_Position(0,0); LCD_PrCString("Akenokane "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(FS);} else if(TC==325) PWM16_1_WritePeriod(S); else if(TC==329) PWM16_1_WritePeriod(R); else if(TC==337) PWM16_1_WritePeriod(C); else if(TC==345) PWM16_1_WritePeriod(LL); else if(TC==349) PWM16_1_WritePeriod(R); else if(TC==357) PWM16_1_WritePeriod(C); else if(TC==361) PWM16_1_WritePeriod(LL); else if(TC==385){//文化の潮 LCD_Position(0,0); LCD_PrCString("Bunkanoushio "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(FFS);} else if(TC==391) PWM16_1_WritePeriod(MM); else if(TC==393) PWM16_1_WritePeriod(LL); else if(TC==401) PWM16_1_WritePeriod(R); else if(TC==409) PWM16_1_WritePeriod(R); else if(TC==417) PWM16_1_WritePeriod(C); else if(TC==425) PWM16_1_WritePeriod(R); else if(TC==429) PWM16_1_WritePeriod(FS); else if(TC==449){//導きて LCD_Position(0,0); LCD_PrCString("Michibikite "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(L);} else if(TC==455) PWM16_1_WritePeriod(M); else if(TC==457) PWM16_1_WritePeriod(FS); else if(TC==465) PWM16_1_WritePeriod(R); else if(TC==473) PWM16_1_WritePeriod(LL); else if(TC==481) PWM16_1_WritePeriod(C); else if(TC==489) PWM16_1_WritePeriod(R); else if(TC==513){//遂げし維新の LCD_Position(0,0); LCD_PrCString("Togeshi Ishinno "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(LL);} else if(TC==521) PWM16_1_WritePeriod(C); else if(TC==537) PWM16_1_WritePeriod(R); else if(TC==545) PWM16_1_WritePeriod(LL); else if(TC==551) PWM16_1_WritePeriod(DDS); else if(TC==553) PWM16_1_WritePeriod(C); else if(TC==569) PWM16_1_WritePeriod(R); else if(TC==577){//はえになう LCD_Position(0,0); LCD_PrCString("Haeninau "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(R);} else if(TC==581) PWM16_1_WritePeriod(C); else if(TC==585) PWM16_1_WritePeriod(R); else if(TC==589) PWM16_1_WritePeriod(FS); else if(TC==597) PWM16_1_WritePeriod(S); else if(TC==601) PWM16_1_WritePeriod(R); else if(TC==609) PWM16_1_WritePeriod(C); else if(TC==617) PWM16_1_WritePeriod(R); else if(TC==625){//オオ明治 LCD_Position(0,0); LCD_PrCString("Oh-o!meiji "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(LL);} else if(TC==633) PWM16_1_WritePeriod(R); else if(TC==641) PWM16_1_WritePeriod(FFS); else if(TC==647) PWM16_1_WritePeriod(MM); else if(TC==649) PWM16_1_WritePeriod(LL); else if(TC==673){//その名ぞ我らが母校1 LCD_Position(0,0); LCD_PrCString("Sononazo "); LCD_Position(1,0); LCD_PrCString(" Wareragabokou"); PWM16_1_WritePeriod(LL);} else if(TC==679) PWM16_1_WritePeriod(MM); else if(TC==681) PWM16_1_WritePeriod(LL); else if(TC==697) PWM16_1_WritePeriod(C); else if(TC==705) PWM16_1_WritePeriod(C); else if(TC==709) PWM16_1_WritePeriod(R); else if(TC==713) PWM16_1_WritePeriod(R); else if(TC==717) PWM16_1_WritePeriod(FS); else if(TC==725) PWM16_1_WritePeriod(S); else if(TC==729) PWM16_1_WritePeriod(R); else if(TC==737) PWM16_1_WritePeriod(C); else if(TC==745) PWM16_1_WritePeriod(R); else if(TC==753){//オオ明治 LCD_Position(0,0); LCD_PrCString("Oh-o!meiji "); LCD_Position(1,0); LCD_PrCString(" "); PWM16_1_WritePeriod(LL);} else if(TC==761) PWM16_1_WritePeriod(R); else if(TC==769) PWM16_1_WritePeriod(FFS); else if(TC==775) PWM16_1_WritePeriod(MM); else if(TC==777) PWM16_1_WritePeriod(LL); else if(TC==801){//その名ぞ我らが母校2 LCD_Position(0,0); LCD_PrCString("Sononazo "); LCD_Position(1,0); LCD_PrCString(" Wareragabokou"); PWM16_1_WritePeriod(L);} else if(TC==807) PWM16_1_WritePeriod(LL); else if(TC==809) PWM16_1_WritePeriod(LL); else if(TC==825) PWM16_1_WritePeriod(R); else if(TC==833) PWM16_1_WritePeriod(C); else if(TC==837) PWM16_1_WritePeriod(R); else if(TC==841) PWM16_1_WritePeriod(R); else if(TC==845) PWM16_1_WritePeriod(FS); else if(TC==853) PWM16_1_WritePeriod(L); else if(TC==857) PWM16_1_WritePeriod(FS); else if(TC==865) PWM16_1_WritePeriod(M); else if(TC==873) PWM16_1_WritePeriod(L); else if (TC==897){ PWM16_1_WritePeriod(SILENT); TC=9999; LCD_Position(0,0); LCD_PrCString("Meiji Music "); LCD_Position(1,0); LCD_PrCString(" Machine ");} } if(track==2){ PWM16_1_WritePeriod(SILENT); TC=9999; LCD_Position(0,0); LCD_PrCString("Meiji Music "); LCD_Position(1,0); LCD_PrCString(" Machine ");} if(track==3){ if (TC==1){ LCD_Position(0,0); LCD_PrCString("Azayakana iro "); LCD_Position(1,0); LCD_PrCString(" matou hamon wa"); PWM16_1_WritePeriod(UR);} else if (TC==3) PWM16_1_WritePeriod(UC); else if (TC==5) PWM16_1_WritePeriod(LF); else if (TC==7) PWM16_1_WritePeriod(M); else if (TC==9) PWM16_1_WritePeriod(SF); else if (TC==15) PWM16_1_WritePeriod(F); else if (TC==21) PWM16_1_WritePeriod(SF); else if (TC==25) PWM16_1_WritePeriod(LLF); else if (TC==31) PWM16_1_WritePeriod(C); else if (TC==37) PWM16_1_WritePeriod(R); else if (TC==41) PWM16_1_WritePeriod(RF); else if (TC==47) PWM16_1_WritePeriod(R); else if (TC==53) PWM16_1_WritePeriod(C); //else if (TC==56) //PWM16_1_WritePeriod(SILENT); else if (TC==57){ PWM16_1_WritePeriod(SILENT); PWM16_1_WritePeriod(C);} else if (TC==75){ LCD_Position(0,0); LCD_PrCString("Kaze ukete "); LCD_Position(1,0); LCD_PrCString(" tobitatta"); PWM16_1_WritePeriod(SILENT); PWM16_1_WritePeriod(C);} else if (TC==81) PWM16_1_WritePeriod(CF); else if (TC==87) PWM16_1_WritePeriod(C); else if (TC==91) PWM16_1_WritePeriod(LL); else if (TC==97) PWM16_1_WritePeriod(LLF); else if (TC==103) PWM16_1_WritePeriod(RF); else if (TC==107) PWM16_1_WritePeriod(C); else if (TC==113) PWM16_1_WritePeriod(R); else if (TC==119) PWM16_1_WritePeriod(RF); else if (TC==123) PWM16_1_WritePeriod(R); else if (TC==139) PWM16_1_WritePeriod(SILENT); else if (TC==140){ PWM16_1_WritePeriod(SILENT); TC=9999; LCD_Position(0,0); LCD_PrCString("Meiji Music "); LCD_Position(1,0); LCD_PrCString(" Machine ");} } }
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. char* strPtr; UART_CmdReset(); UART_IntCntl(UART_ENABLE_RX_INT); Counter8_WritePeriod(155); Counter8_WriteCompareValue(77); Counter8_Start(); UART_Start(UART_PARITY_NONE); M8C_EnableGInt; UART_CPutString("\r\nWelcome to PSoC Music Machine. Please choose the track.\r\n1.Meiji univ. song\r\n2.song2(unfinished)\r\n3.song3(unfinished)\r\n\r\ns:stop the music\r\n"); PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); LCD_Start(); LCD_Position(0,0); LCD_PrCString("Meiji Music "); LCD_Position(1,0); LCD_PrCString(" Machine "); while(1){ if(UART_bCmdCheck()){ if(strPtr = UART_szGetParam()){ UART_CPutString("Found valid command\r\nCommand=>"); UART_PutString(strPtr); UART_CPutString("<\r\nParamaters:\r\n"); if(*strPtr=='s'){ TC=9999; LCD_Position(0,0); LCD_PrCString("Meiji Music "); LCD_Position(1,0); LCD_PrCString(" Machine "); PWM16_1_WritePeriod(SILENT);} else if(TC>9999){ if(*strPtr=='0'){ track=0; TC=0;} if(*strPtr=='1'){ track=1; TC=0;} else if(*strPtr=='2'){ track=2; TC=0;} else if(*strPtr=='3'){ track=3; TC=0;} else UART_CPutString("Invalid command\r\n"); } else UART_CPutString("If you want to listen another music, press [s] button to stop this music\r\n"); } UART_CmdReset(); } }
}
考察
今回はラボ「hello_world」と「timer_pwm2」を参考に制作した。現段階で目立ったバグは存在せず、想定通りの動きをしているため、その点では今までのラボの内容はしっかり理解できていると思う。しかし、あくまで今までやってきたことの範疇での自由課題であったため、もっと深堀りしたり、新しいことを取り入れることでより面白い作品ができたと思う。曲を停止した時点でのTCの値を保存しておき、そこから曲を再生できるようにしたり、TCの値を指定することで曲の好きな部分から流すことも時間があれば実装したいと思った。また音楽プレーヤーの機能として実用性があるかはともかくとして、距離センサーを用いて、曲の再生、停止をコントロールしたり、曲の高さや盛り上がり、Aメロ、Bメロなどに応じて、LEDの点灯などの機能を追加してみるのもありだと思った。
- 最終更新:2022-05-17 17:07:20