チーム1256
課題名
ランダムオルゴール
研究者名
2年14組6番 大石 倖子
2年14組15番 萱沼 里菜
概要
キーボードから文字を入力すると、曲が流れる。ただし、どの曲が流れるかは毎回ランダム。
曲の種類は8種類。それ以外ははずれの効果音が鳴る。曲が流れる確率はおよそ3分の1。
LCDには、選択された乱数及びそれぞれの曲に合わせたタイトルを表示する。
曲目は以下の通り。
1.カエルの歌
2.きらきら星
3.ロンドン橋
4.ハッピーバースデー
5.ぶんぶんぶん
6.ドレミの歌
7.ミッキーマウスマーチ
8.スーパーマリオブラザーズ(地上BGM)
使用器具
PSoC(1個)
PSoC MiniPrag(1個)
ジャンパー線(4本)
スピーカー(1個)
詳細(ソース)
// C main line //---------------------------------------------------------------------------- #include <m8c.h> // part specific constants and macros #include<stdlib.h> #include<time.h> #include "PSoCAPI.h" // PSoC API definitions for all User Module #pragma interrupt_handler myISR int PW=125; // Pulse Width int SILENT=0, D=229, L=204, M=182, F=172, S=153, SR =144, R=136, RC =128, C=121, DD=115;//high int LL=102,MM=91,FF=86,SS=75,RR=68,CC=64; int TC=0; //Time Count int n=0,f=0; int TC2=0; void myISR()// { TC2++; if(TC2 == 100) TC2 = 0; // 1:カエルの歌 if(n==1){ TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC == 1 | | TC == 25 | | TC == 65 | | TC == 73 | | TC == 81 | | TC == 89 | | TC == 97 | | TC == 99 | | TC == 121) PWM16_1_WritePeriod(D); else if(TC == 5 | | TC == 21 | | TC == 101 | | TC == 103 | | TC == 117) PWM16_1_WritePeriod(L); else if (TC == 9 | | TC == 17 | | TC == 33 | | TC == 57 | | TC == 105 | | TC == 107 | | TC == 113) PWM16_1_WritePeriod(M); else if(TC == 13 | | TC == 37 | | TC == 53 | | TC == 109 | | TC == 111) PWM16_1_WritePeriod(F); else if(TC == 41 | | TC == 49) PWM16_1_WritePeriod(S); else if (TC == 45 | | TC == 33 | | TC == 41) PWM16_1_WritePeriod(R); else if(TC == 29 | | TC == 61 | | TC == 69 | | TC == 77 | | TC == 85 | | TC == 93) PWM16_1_WritePeriod(SILENT); else if(TC == 98 | | TC == 100 | | TC == 102 | | TC == 104 | | TC == 106 | | TC == 108 | | TC == 110 | | TC == 112) PWM16_1_WritePeriod(SILENT); else if(TC == 125) PWM16_1_WritePeriod(SILENT); if(TC==129) return; } // 2:きらきら星 if(n==2){ TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC == 1 | | TC == 6 | | TC == 72) PWM16_1_WritePeriod(D); else if(TC == 62 | | TC == 67) PWM16_1_WritePeriod(L); else if (TC == 52 | | TC == 57) PWM16_1_WritePeriod(M); else if(TC == 41 | | TC == 46) PWM16_1_WritePeriod(F); else if(TC == 11 | | TC == 17 | | TC == 32) PWM16_1_WritePeriod(S); else if (TC == 22 | | TC == 27) PWM16_1_WritePeriod(R); else if(TC == 0) PWM16_1_WritePeriod(C); else if(TC == 0) PWM16_1_WritePeriod(DD);//ド else if(TC == 5 | | TC == 10 | | TC == 16 | | TC == 21 | | TC == 26 | | TC == 31 | | TC == 40 | | TC == 45) PWM16_1_WritePeriod(SILENT); else if(TC == 51 | | TC == 56 | | TC == 61 | | TC == 66 | | TC == 71 | | TC == 80) PWM16_1_WritePeriod(SILENT); else if(TC==82) return; } // 3:ロンドン橋 if(n==3){ TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC == 55) PWM16_1_WritePeriod(D); else if(TC == 16 | | TC == 47) PWM16_1_WritePeriod(L); else if(TC == 8 | | TC == 18 | | TC == 24 | | TC == 39 | | TC == 53) PWM16_1_WritePeriod(M); else if(TC == 6 | | TC == 10 | | TC == 20 | | TC == 26 | | TC == 37 | | TC == 41) PWM16_1_WritePeriod(F); else if(TC == 1 | | TC == 4 | | TC == 12| | TC == 28 | | TC == 32 | | TC == 35 | | TC == 43 | | TC == 50) PWM16_1_WritePeriod(S); else if(TC == 3 | | TC == 34) PWM16_1_WritePeriod(R); else if(TC == 14 | | TC == 22 | | TC == 30 | | TC == 45 | | TC == 50) PWM16_1_WritePeriod(SILENT); else if(TC == 59) return; } // 4:ハッピーバースデー if(n==4){ TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC == 1 | | TC == 9 | | TC == 25 | | TC ==33 | | TC ==49) PWM16_1_WritePeriod(D); else if(TC == 5 | | TC ==29 | | TC ==69) PWM16_1_WritePeriod(L); else if (TC == 17 | | TC ==65) PWM16_1_WritePeriod(M); else if(TC == 13 | | TC ==41 | | TC ==61 | | TC ==85 | | TC ==93) PWM16_1_WritePeriod(F); else if(TC == 37 | | TC ==89) PWM16_1_WritePeriod(S); else if (TC == 57 | | TC ==81) PWM16_1_WritePeriod(R); else if (TC == 77) PWM16_1_WritePeriod(RC); else if(TC == 81) PWM16_1_WritePeriod(C); else if(TC == 53) PWM16_1_WritePeriod(DD);//ド else if(TC == 101) PWM16_1_WritePeriod(SILENT); else if(TC==105) return; } // 5:ぶんぶんぶん if(n==5){ TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC == 25 | | TC == 89) PWM16_1_WritePeriod(D); else if(TC == 17 | | TC == 23 | | TC == 41 | | TC == 47 | | TC == 57 | | TC == 63 | | TC == 81 | | TC == 87) PWM16_1_WritePeriod(L); else if (TC == 9 | | TC == 19 | | TC == 33 | | TC == 39 | | TC == 43 | | TC == 49 | | TC == 55 | | TC == 59 | | TC == 73 | | TC == 83) PWM16_1_WritePeriod(M); else if(TC == 5 | | TC == 21 | | TC == 35 | | TC == 45 | | TC == 51 | | TC == 61 | | TC == 69 | | TC == 85) PWM16_1_WritePeriod(F); else if(TC == 1 | | TC == 37 | | TC == 53 | | TC == 65) PWM16_1_WritePeriod(S); else if(TC == 13 | | TC == 29 | | TC == 77 | | TC == 93) PWM16_1_WritePeriod(SILENT); if(TC==99) return; } // 6:ドレミの歌 if(n==6){ TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC ==1 | | TC == 7 | | TC == 10 | | TC == 67 | | TC == 121) PWM16_1_WritePeriod(D); else if(TC ==3 | | TC == 16 | | TC == 23 | | TC == 68 | | TC == 84 | | TC == 122) PWM16_1_WritePeriod(L); else if (TC == 4 | | TC == 8 | | TC == 12 | | TC == 19 | | TC == 22 | | TC == 32 | | TC == 39 | | TC == 42 | | TC == 69 | | TC == 85 | | TC == 100) PWM16_1_WritePeriod(M); else if (TC == 123) PWM16_1_WritePeriod(M); else if(TC == 20 | | TC == 21 | | TC == 24 | | TC == 35 | | TC == 48 | | TC == 55 | | TC == 70 | | TC == 86 | | TC == 101 | | TC == 115 | | TC == 124) PWM16_1_WritePeriod(F); else if(TC == 36 | | TC == 40 | | TC == 44 | | TC == 51 | | TC == 54 | | TC == 64 | | TC == 71 | | TC == 87 | | TC == 102 | | TC == 119 | | TC == 125 | | TC == 130) PWM16_1_WritePeriod(S); else if (TC == 52 | | TC == 53 | | TC == 56 | | TC == 72 | | TC == 80 | | TC == 88 | | TC == 103 | | TC == 113 | | TC == 126) PWM16_1_WritePeriod(R); else if (TC == 112) PWM16_1_WritePeriod(RC); else if(TC == 89 | | TC == 97 | | TC == 104 | | TC == 111 | | TC == 117 | | TC == 127) PWM16_1_WritePeriod(C); else if(TC == 105 | | TC == 120 | | TC == 128 | | TC == 132) PWM16_1_WritePeriod(DD);//ド else if(TC == 14 | | TC == 31 | | TC == 47 | | TC == 63 | | TC == 79 | | TC == 96 | | TC == 109 | | TC == 129 | | TC == 131 | | TC == 134) PWM16_1_WritePeriod(SILENT); else if(TC==138) return; } // 7:ミッキーマウスマーチ if(n==7){ TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC == 13 | | TC == 41 | | TC == 48 | | TC == 77) PWM16_1_WritePeriod(D); else if(TC == 12 | | TC == 33 | | TC == 49 | | TC == 50 | | TC == 51 | | TC == 52 | | TC == 53 | | TC == 54 | | TC == 76) PWM16_1_WritePeriod(L); else if (TC == 11 | | TC == 28 | | TC == 55 | | TC == 75 | | TC == 94) PWM16_1_WritePeriod(M); else if(TC == 1 | | TC == 2 | | TC == 3 | | TC == 4 | | TC == 5 | | TC == 6 | | TC == 7 | | TC == 8) PWM16_1_WritePeriod(F); else if(TC == 10 | | TC == 17 | | TC == 18 | | TC == 19 | | TC == 21 | | TC == 22 | | TC == 23 | | TC == 26) PWM16_1_WritePeriod(F); else if(TC == 29| | TC == 31 | | TC == 32 | | TC == 39 | | TC == 40 | | TC == 56) PWM16_1_WritePeriod(F); else if(TC == 65 | | TC == 66 | | TC == 67 | | TC == 68 | | TC == 69 | | TC == 70 | | TC == 71 | | TC == 72) PWM16_1_WritePeriod(F); else if(TC == 74 | | TC == 80 | | TC == 81 | | TC == 82 | | TC == 84 | | TC == 85 | | TC == 86 | | TC == 90 | | TC == 96) PWM16_1_WritePeriod(F); else if(TC == 9 | | TC == 27 | | TC == 57 | | TC == 73 | | TC == 92) PWM16_1_WritePeriod(S); else if (TC == 25 | | TC == 88) PWM16_1_WritePeriod(R); else if(TC == 59 | | TC == 61 | | TC == 63) PWM16_1_WritePeriod(DD);//ド else if(TC == 30 | | TC == 47 | | TC == 58 | | TC == 60 | | TC == 62 | | TC == 64 | | TC == 79 | | TC == 104) PWM16_1_WritePeriod(SILENT); else if(TC==108) return; } // 8:マリオ // スーパーマリオブラザーズ if(n==8){ TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC == 7) PWM16_1_WritePeriod(M); else if (TC == 4| | TC == 17) PWM16_1_WritePeriod(S); else if(TC == 10| | TC == 15) PWM16_1_WritePeriod(R); else if(TC == 14) PWM16_1_WritePeriod(RC); else if (TC == 12| | TC == 29) PWM16_1_WritePeriod(C); else if (TC == 1| | TC == 27) PWM16_1_WritePeriod(DD); else if (TC == 28) PWM16_1_WritePeriod(LL); else if (TC == 18| | TC == 25) PWM16_1_WritePeriod(MM); else if (TC == 22) PWM16_1_WritePeriod(FF); else if (TC == 19| | TC == 23) PWM16_1_WritePeriod(SS); else if (TC == 20) PWM16_1_WritePeriod(RR); else if(TC == 2| | TC == 5| | TC == 8| | TC == 11| | TC == 16| | TC == 21| | TC == 24| | TC == 26| | TC == 30) PWM16_1_WritePeriod(SILENT); if(TC==31) return; } if(n==9)//はずれ { TC += 1; //TC = TC +1 PWM16_1_WritePulseWidth(PW); if(TC == 4) PWM16_1_WritePeriod(SR); else if (TC == 3) PWM16_1_WritePeriod(R); else if (TC == 2) PWM16_1_WritePeriod(RC); else if(TC == 1) PWM16_1_WritePeriod(S); else if(TC == 11) PWM16_1_WritePeriod(SILENT); else if(TC==12) return; } } void main(void) { char * strPtr; // Parameter pointer int i; // Random number LCD_Start(); UART_CmdReset(); // Initialize receiver/cmd buffer UART_IntCntl(UART_ENABLE_RX_INT); // Enable RX interrupts Counter8_WritePeriod(155); // Set up baud rate generator Counter8_WriteCompareValue(77); Counter8_Start(); // Turn on baud rate generator UART_Start(UART_PARITY_NONE); // Enable UART M8C_EnableGInt ; // Turn on interrupts PWM16_1_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); UART_CPutString("\r\nPSoC Music Box \r\n"); while(1) { if(UART_bCmdCheck()) { // Wait for command if(strPtr = UART_szGetParam()) { // More than delimiter? UART_CPutString("Found valid command\r\nCommand =>"); UART_PutString(strPtr); // Print out command UART_CPutString("<\r\nParamaters:\r\n"); if (*strPtr != ''){ TC = 0; srand(TC2); i = rand() % 24; i=i%20; LCD_Position(0,0); LCD_PrHexInt(i); } if(i == 1){ n=1; LCD_Position(1,0); LCD_PrCString("Frogs "); } else if (i == 2){ n=2; LCD_Position(1,0); LCD_PrCString("Twinkle Star "); } else if (i == 3){ n=3; LCD_Position(1,0); LCD_PrCString("London Bridge "); } else if (i == 4){ n=4; LCD_Position(1,0); LCD_PrCString("Happy Birthday "); } else if (i == 5){ n=5; LCD_Position(1,0); LCD_PrCString("Honey Bee "); } else if (i == 6){ n=6; LCD_Position(1,0); LCD_PrCString("Do-re-mi "); } else if (i == 7){ n=7; LCD_Position(1,0); LCD_PrCString("Mickey "); } else if (i == 8){ n=8; LCD_Position(1,0); LCD_PrCString("Mario "); } else{ n=9; LCD_Position(1,0); LCD_PrCString("Booooooooooooo!"); } } UART_CmdReset(); // Reset command buffer } } }
考察
ランダムに流す曲を選択する際、rand関数を使用した。しかし、これは疑似乱数であるため、曲の流れる順番が毎回同じになってしまう。
そこで、音の長さを指定するTCの他に、TC2を用意し、srandで乱数系列を変化させた。これによって、真のランダム設定が可能になった。
また、LCDに曲のタイトルを表示する際、前の文字列が残ったままだったので、長いタイトルの曲の後に短いタイトルの曲がくると、タイトルがごちゃごちゃになってしまった。この対策として、タイトルの後ろにスペースを入れて塗りつぶすことにした。
- 最終更新:2012-11-20 16:13:08