チーム1268

課題名

ジブリ音楽クイズ

研究者名

2年14組35番 新山 沙也加
2年14組36番 西角 知佳

概要

ランダムに流れるジブリの音楽を当てるクイズ。
TeraTerm上に選択肢が表示されるので、1~3のいずれかをキーボードから入力する。
答えられるのは3回。あなたはどれだけ答えられるか・・・

実行画面
実行画面.png

ソースコード

#include <m8c.h>
#include <stdlib.h>

#include "PSoCAPI.h"
#pragma interrupt_handler myISR
int PW=125; // Pulse Width

int SILENT=0, D=229, L=204,M=182, F=172, S=153, R=136, C=121, DD=115, LL=102, MM=91, FF=86, SS=77;//Scale
int R1=129, S1 = 145;
int TC = 0; //Time Count
int n = 0;

void myISR(void){
  
   if(n == 1){
       TC += 1;
       PWM16_1_WritePulseWidth(PW);
       //千と千尋の神隠し
       if(TC == 1)        PWM16_1_WritePeriod(F);
       else if(TC == 2)    PWM16_1_WritePeriod(S);
       else if(TC == 3)    PWM16_1_WritePeriod(R);
       else if(TC == 4)    PWM16_1_WritePeriod(F);
       else if(TC == 5)    PWM16_1_WritePeriod(DD);
       else if(TC == 8)    PWM16_1_WritePeriod(R);
       else if(TC == 9)    PWM16_1_WritePeriod(S);
       else if(TC == 11)    PWM16_1_WritePeriod(DD);
       else if(TC == 13)    PWM16_1_WritePeriod(S);
       else if(TC == 15)    PWM16_1_WritePeriod(F);
       else if(TC == 16)    PWM16_1_WritePeriod(L);
       else if(TC == 17)    PWM16_1_WritePeriod(R);
       else if(TC == 20)    PWM16_1_WritePeriod(F);
       else if(TC == 21)    PWM16_1_WritePeriod(M);
       else if(TC == 23)    PWM16_1_WritePeriod(SILENT);
       else if(TC == 24)    return;
   }
   
   else if(n == 2){
       TC += 1;
       PWM16_1_WritePulseWidth(PW);
       //となりのトトロ
       if(TC == 1)                PWM16_1_WritePeriod(F);
       else if(TC == 2)        PWM16_1_WritePeriod(S);
       else if(TC == 3)        PWM16_1_WritePeriod(R);
       else if(TC == 4)        PWM16_1_WritePeriod(R1);
       else if(TC == 5)        PWM16_1_WritePeriod(DD);
       else if(TC == 6)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 7)        PWM16_1_WritePeriod(R);
       else if(TC == 8)        PWM16_1_WritePeriod(F);
       else if(TC == 9)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 10)        PWM16_1_WritePeriod(DD);
       else if(TC == 11)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 12)        PWM16_1_WritePeriod(R1);
       else if(TC == 14)        PWM16_1_WritePeriod(S);
       else if(TC == 15)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 16)        PWM16_1_WritePeriod(R1);
       else if(TC == 17)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 18)        PWM16_1_WritePeriod(S);
       else if(TC == 19)        PWM16_1_WritePeriod(M);
       else if(TC == 20)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 21)        PWM16_1_WritePeriod(R1);
       else if(TC == 22)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 23)        PWM16_1_WritePeriod(R);
       else if(TC == 25)        PWM16_1_WritePeriod(F);
       else if(TC == 26)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 29)        return;
   }
   
       else if(n == 3){
       TC += 1;
       PWM16_1_WritePulseWidth(PW);
       // ラピュタ
       if(TC == 1)                PWM16_1_WritePeriod(F);
       else if(TC == 2)        PWM16_1_WritePeriod(S);
       else if(TC == 3)        PWM16_1_WritePeriod(S1);
       else if(TC == 5)        PWM16_1_WritePeriod(F);
       else if(TC == 6)        PWM16_1_WritePeriod(S);
       else if(TC == 7)        PWM16_1_WritePeriod(DD);
       else if(TC == 8)        PWM16_1_WritePeriod(F);
       else if(TC == 11)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 12)        PWM16_1_WritePeriod(L);
       else if(TC == 13)        PWM16_1_WritePeriod(S);
       else if(TC == 15)        PWM16_1_WritePeriod(F);
       else if(TC == 16)        PWM16_1_WritePeriod(S);
       else if(TC == 17)        PWM16_1_WritePeriod(S1);
       else if(TC == 18)        PWM16_1_WritePeriod(F);
       else if(TC == 21)        PWM16_1_WritePeriod(SILENT);
       else if(TC == 24)        return;
   }
}


void main(void) {
      int i;
       char * strPtr;                                 // Parameter pointer
       int random;
       
       int chihiro;
       int totoro;
       int mononoke;
       
       int q = 1;
       
       M8C_EnableGInt;
       
       // 出題順の決定
       random = rand();
       if(random % 6 == 0){
           chihiro = 1;    totoro = 2;    mononoke = 3;
       }
       else if(random % 6 == 1){
           chihiro = 1;    totoro = 3;    mononoke = 2;
       }
       else if(random % 6 == 2){    
           chihiro = 2;    totoro = 1;    mononoke = 3;
       }
       else if(random % 6 == 3){    
           chihiro = 2;    totoro = 3;    mononoke = 1;
       }
       else if(random % 6 == 4){    
           chihiro = 3;    totoro = 1;    mononoke = 2;
       }
       else if(random % 6 == 5){    
           chihiro = 3;    totoro = 2;    mononoke = 1;
       }
       
       PWM16_1_Start();
       Timer16_1_EnableInt();
       Timer16_1_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
        
       while(1){    
           
           // 1問目
           if((q == 1 && chihiro == 1) | | (q == 2 && chihiro == 2) | | (q == 3 && chihiro == 3)){
               n = 1;        
               UART_Start(UART_PARITY_NONE);                 // Enable UART        
               UART_CPutString("\r\n---------------------------------------------------\r\n");
               UART_CPutString("\r\n");
               UART_CPutString("何の曲名でしょう?\r\n");    
               UART_CPutString("1:やさしさに包まれたなら\r\n");    
               UART_CPutString("2:いつも何度でも\r\n");
               UART_CPutString("3:いのちの名前\r\n");
               UART_CPutString("\r\n");                 
               
               while(1){   
                   if(UART_bCmdCheck()) {   
                       if(strPtr = UART_szGetParam()) {     
                           UART_PutString(strPtr);               
                           UART_CPutString("\r\n");
                           
                           // true
                           if(atoi(strPtr) == 2){
                               UART_CPutString("正解!\r\n");
                               UART_CPutString("\r\n");
                               break;
                           }                    
                           // false
                           else{
                               UART_CPutString("残念…\r\n");
                               UART_CPutString("\r\n");
                               break;
                           }            
                       }
                   UART_CmdReset();
                   }
               }
               q++;
               if (q == 4){
                   UART_CPutString("\r\n-----------------------END-------------------------\r\n");
                   break;
               }
               TC = 0;
           }            
           
           // 第2問
           else if ((q == 1 && totoro == 1) | | (q == 2 && totoro == 2) | | (q == 3 && totoro == 3)){
               n = 2; 
               
               UART_Start(UART_PARITY_NONE);                 // Enable UART        
               UART_CPutString("\r\n---------------------------------------------------\r\n");
               UART_CPutString("\r\n");
               UART_CPutString("何の曲名でしょう?\r\n");    
               UART_CPutString("1:カントリー・ロード\r\n");    
               UART_CPutString("2:もののけ姫\r\n");
               UART_CPutString("3:となりのトトロ\r\n"); 
               UART_CPutString("\r\n");             
               while(1){   
                   if(UART_bCmdCheck()) {                        
                       if(strPtr = UART_szGetParam()) {     
                           UART_PutString(strPtr);               
                           UART_CPutString("\r\n");
                           
                           // true
                           if(atoi(strPtr) == 3){
                               UART_CPutString("正解!\r\n");
                               UART_CPutString("\r\n");
                               break;
                           }
                           
                           // false
                           else{
                               UART_CPutString("残念…\r\n");
                               UART_CPutString("\r\n");
                               break;
                           }            
                       }
                   UART_CmdReset();
                   }
               }
               q++;
               if (q == 4){
                   UART_CPutString("\r\n-----------------------END-------------------------\r\n");
                   break;
               }
               TC = 0;
           }
           
           
           // 第3問
           else if((q == 1 && mononoke == 1) | | (q == 2 && mononoke == 2) | | (q == 3 && mononoke == 3)){
               n = 3; 
               
               UART_Start(UART_PARITY_NONE);                 // Enable UART        
               UART_CPutString("\r\n---------------------------------------------------\r\n");
               UART_CPutString("\r\n");
               UART_CPutString("何の曲名でしょう?\r\n");    
               UART_CPutString("1:ラピュタ\r\n");    
               UART_CPutString("2:もののけ姫\r\n");
               UART_CPutString("3:やさしさに包まれたなら\r\n"); 
               UART_CPutString("\r\n");             
               while(1){   
                   if(UART_bCmdCheck()) {                        
                       if(strPtr = UART_szGetParam()) {     
                           UART_PutString(strPtr);               
                           UART_CPutString("\r\n");
                           
                           // true
                           if(atoi(strPtr) == 1){
                               UART_CPutString("正解!\r\n");
                               UART_CPutString("\r\n");

                              break;
                           }
                           
                           // false
                           else{
                               UART_CPutString("残念…\r\n");
                               UART_CPutString("\r\n");

                              break;
                           }            
                       }
                   UART_CmdReset();
                   }
               }
               q++;
               if (q == 4){
                   UART_CPutString("\r\n-----------------------END-------------------------\r\n");
                   break;
               }
               TC = 0;
           }
           
       }
       
}

考察

当初は光センサーを使用して、光の量によって流す音楽をランダムに変えるという仕様だった。
これを実現するには、uartとAD変換を両方実現しなくてはならず、その兼ね合いがうまくいかなかったため完成することはできなかった。
原因としてはユーザーモジュールの設定が挙げられる。
この代替として乱数発生にrand()を用いようとしたが、これもうまく機能せず毎回同じ出題順になってしまった。

光センサーに時間を要したため、音楽も3曲しか作成できなかった。

  • 最終更新:2012-12-18 16:49:48

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

認証パスワード