チーム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

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

認証パスワード