チーム1229

課題名

メロディーボックス

研究者名

2年15組9番  川村優花
2年15組18番 佐藤紘之

概要

シリアルポート通信を使ってPCキーボードからの入力で
PSoCに接続してあるスピーカーから音楽を演奏したり
曲のスピードを操作できる装置である。
授業でやったpwm_uart_2とtimer_pwm2を参考にして作った。
リセットを押すと曲名リストが表示される。
曲の選択、曲の停止、スピードアップ、スピードダウン、スピードを元に戻す
これらの操作をキーボードからの入力によって行えるようにした。

操作方法
1:マルマルモリモリ
2:ヘビーローテーション
3:小さな世界
s:ストップ
u:スピードアップ
d:スピードダウン
m:スピードを戻す

ソース(main.c)


#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; // Pulse Width
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, OD=115, OL=102, OM=91, OF=86, OS=77, OR=68, OC=61, OOD=57; //音階
int Ds=217,Ls=193,Fs=162,Ss=145,Rs=129,ODs=108,OLs=96,OFs=81,OSs=72,ORs=64,OODs=54;//シャープ
int TC = 0;
int sel = 0;


void myISR(void)
{
if(sel==0){
TC=0;
  PWM16_1_WritePeriod(SILENT);
  }
else if(sel==1){ //マルマルモリモリ
TC+=1;
  PWM16_1_WritePulseWidth(PW);
  if(TC==1)
      PWM16_1_WritePeriod(OSs);
  else if(TC==2)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==3)
      PWM16_1_WritePeriod(OSs);
  else if(TC==5)
      PWM16_1_WritePeriod(OM);
  else if(TC==7)
      PWM16_1_WritePeriod(C);    
  else if(TC==9)
      PWM16_1_WritePeriod(ODs);
  else if(TC==11)
      PWM16_1_WritePeriod(C);
  else if(TC==13)
      PWM16_1_WritePeriod(ODs);
  else if(TC==15)
      PWM16_1_WritePeriod(OM);
  else if(TC==17)
      PWM16_1_WritePeriod(OFs);
  else if(TC==19)
      PWM16_1_WritePeriod(OM);
  else if(TC==21)
      PWM16_1_WritePeriod(OFs);
  else if(TC==23)
      PWM16_1_WritePeriod(OSs);
  else if(TC==25)
      PWM16_1_WritePeriod(OFs);
  else if(TC==27)
      PWM16_1_WritePeriod(OM);
  else if(TC==28)
      PWM16_1_WritePeriod(OSs);
  else if(TC==30)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==34)
      PWM16_1_WritePeriod(OSs);
  else if(TC==35)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==36)
      PWM16_1_WritePeriod(OSs);
  else if(TC==38)
      PWM16_1_WritePeriod(OM);
  else if(TC==40)
      PWM16_1_WritePeriod(C);    
  else if(TC==42)
      PWM16_1_WritePeriod(ODs);
  else if(TC==44)
      PWM16_1_WritePeriod(C);
  else if(TC==46)
      PWM16_1_WritePeriod(ODs);
  else if(TC==48)
      PWM16_1_WritePeriod(OM);
  else if(TC==50)
      PWM16_1_WritePeriod(OFs);
  else if(TC==52)
      PWM16_1_WritePeriod(OM);
  else if(TC==54)
      PWM16_1_WritePeriod(OFs);
  else if(TC==56)
      PWM16_1_WritePeriod(OSs);
  else if(TC==58)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==62)
      PWM16_1_WritePeriod(OFs);
  else if(TC==63)
      PWM16_1_WritePeriod(OSs);
  else if(TC==64)
      PWM16_1_WritePeriod(OFs);
  else if(TC==65)
      PWM16_1_WritePeriod(OM);
  else if(TC==66)
      PWM16_1_WritePeriod(OM);
  else if(TC==68)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==72)
      PWM16_1_WritePeriod(OSs);
  else if(TC==74)
      PWM16_1_WritePeriod(C);
  else if(TC==76)
      PWM16_1_WritePeriod(ODs);    
  else if(TC==78)
      PWM16_1_WritePeriod(OM);
  else if(TC==80)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==84)
      PWM16_1_WritePeriod(OFs);
  else if(TC==86)
      PWM16_1_WritePeriod(OM);
  else if(TC==88)
      PWM16_1_WritePeriod(OFs);
  else if(TC==90)
      PWM16_1_WritePeriod(OSs);
  else if(TC==92)
      PWM16_1_WritePeriod(SILENT);   
  else if(TC==98)
      PWM16_1_WritePeriod(OSs);
  else if(TC==100)
      PWM16_1_WritePeriod(C);
  else if(TC==102)
      PWM16_1_WritePeriod(ODs);    
  else if(TC==104)
      PWM16_1_WritePeriod(OM);
  else if(TC==106)
      PWM16_1_WritePeriod(SILENT);   
  else if(TC==110)
      PWM16_1_WritePeriod(OFs);
  else if(TC==112)
      PWM16_1_WritePeriod(OM);
  else if(TC==114)
      PWM16_1_WritePeriod(OFs);
  else if(TC==116)
      PWM16_1_WritePeriod(OSs);
  else if(TC==118)
      PWM16_1_WritePeriod(SILENT);   
  else if(TC==119)
      PWM16_1_WritePeriod(OM);
  else if(TC==120)
      PWM16_1_WritePeriod(SILENT);   
  else if(TC==121)
      PWM16_1_WritePeriod(OM);
  else if(TC==123)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==125)
      TC=1;    
 }
  
  else if(sel==2){  //ヘビーローテーション
 TC+=1;
  PWM16_1_WritePulseWidth(PW);
  
  if(TC==1)
      PWM16_1_WritePeriod(OM);
  else if(TC==3)
      PWM16_1_WritePeriod(OFs);
  else if(TC==5)
      PWM16_1_WritePeriod(OSs);
  else if(TC==10)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==14)
      PWM16_1_WritePeriod(OM);
  else if(TC==16)
      PWM16_1_WritePeriod(OFs);
  else if(TC==18)
      PWM16_1_WritePeriod(OSs);
  else if(TC==23)
      PWM16_1_WritePeriod(SILENT); 
  else if(TC==27)
      PWM16_1_WritePeriod(OM);
  else if(TC==29)
      PWM16_1_WritePeriod(OFs);
  else if(TC==31)
      PWM16_1_WritePeriod(OSs);  
  else if(TC==36)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==39)
      PWM16_1_WritePeriod(OSs);
  else if(TC==41)
      PWM16_1_WritePeriod(OR);
  else if(TC==43)
      PWM16_1_WritePeriod(OC);
  else if(TC==47)
      PWM16_1_WritePeriod(OSs);    
  else if(TC==51)
      PWM16_1_WritePeriod(OFs);
  else if(TC==55)
      PWM16_1_WritePeriod(OM);
  else if(TC==57)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==59)
      PWM16_1_WritePeriod(OODs);
  else if(TC==61)
      PWM16_1_WritePeriod(OODs);
  else if(TC==63)
      PWM16_1_WritePeriod(OODs);
  else if(TC==65)
      PWM16_1_WritePeriod(OR);
  else if(TC==67)
      PWM16_1_WritePeriod(OFs);
  else if(TC==69)
      PWM16_1_WritePeriod(OFs);
  else if(TC==71)
      PWM16_1_WritePeriod(OSs);
  else if(TC==73)
      PWM16_1_WritePeriod(OR);
  else if(TC==75)
      PWM16_1_WritePeriod(OC);
  else if(TC==77)
      PWM16_1_WritePeriod(OC);       
  else if(TC==79)
      PWM16_1_WritePeriod(OC);
  else if(TC==81)
      PWM16_1_WritePeriod(OSs);
  else if(TC==83)
      PWM16_1_WritePeriod(OM);
  else if(TC==86)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==89)
      PWM16_1_WritePeriod(OSs);    
  else if(TC==91)
      PWM16_1_WritePeriod(OR);
  else if(TC==95)
      PWM16_1_WritePeriod(ODs);
  else if(TC==99)
      PWM16_1_WritePeriod(OM);
  else if(TC==101)
      PWM16_1_WritePeriod(OLs);
  else if(TC==103)
      PWM16_1_WritePeriod(ODs);
  else if(TC==105)
      PWM16_1_WritePeriod(OLs);
  else if(TC==107)
      PWM16_1_WritePeriod(OM);
  else if(TC==112)
      PWM16_1_WritePeriod(SILENT);
 }
 
  else if(sel==3){  //小さな世界
 TC+=1;
  PWM16_1_WritePulseWidth(PW);
  if(TC==1)
      PWM16_1_WritePeriod(M);
  else if(TC==3)
      PWM16_1_WritePeriod(F);
  else if(TC==5)
      PWM16_1_WritePeriod(S);
  else if(TC==9)
      PWM16_1_WritePeriod(OM);
  else if(TC==13)
      PWM16_1_WritePeriod(OD);
  else if(TC==17)
      PWM16_1_WritePeriod(OL);
  else if(TC==19)
      PWM16_1_WritePeriod(OD);
  else if(TC==21)
      PWM16_1_WritePeriod(OD);
  else if(TC==25)
      PWM16_1_WritePeriod(C);
  else if(TC==29)
      PWM16_1_WritePeriod(C);
  else if(TC==32)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==33)
      PWM16_1_WritePeriod(L);
  else if(TC==35)
      PWM16_1_WritePeriod(M);
  else if(TC==37)
      PWM16_1_WritePeriod(F);
  else if(TC==41)
      PWM16_1_WritePeriod(OL);
  else if(TC==45)
      PWM16_1_WritePeriod(C);
  else if(TC==49)
      PWM16_1_WritePeriod(OD);
  else if(TC==51)
      PWM16_1_WritePeriod(C);
  else if(TC==53)
      PWM16_1_WritePeriod(R);
  else if(TC==57)
      PWM16_1_WritePeriod(S);
  else if(TC==61)
      PWM16_1_WritePeriod(S);
  else if(TC==64)
      PWM16_1_WritePeriod(SILENT);
      
  else if(TC==66)
      PWM16_1_WritePeriod(M);
  else if(TC==68)
      PWM16_1_WritePeriod(F);
  else if(TC==70)
      PWM16_1_WritePeriod(S);
  else if(TC==72)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==74)
      PWM16_1_WritePeriod(OD);
  else if(TC==76)
      PWM16_1_WritePeriod(OL);
  else if(TC==78)
      PWM16_1_WritePeriod(OM);
  else if(TC==80)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==82)
      PWM16_1_WritePeriod(OL);
  else if(TC==84)
      PWM16_1_WritePeriod(OD);
  else if(TC==86)
      PWM16_1_WritePeriod(R);
  else if(TC==88)
      PWM16_1_WritePeriod(SILENT);
  else if(TC==90)
      PWM16_1_WritePeriod(OL);
  else if(TC==92)
      PWM16_1_WritePeriod(OM);
  else if(TC==94)
      PWM16_1_WritePeriod(OF);
  else if(TC==96)
      PWM16_1_WritePeriod(SILENT);
      
  else if(TC==98)
      PWM16_1_WritePeriod(OM);
  else if(TC==100)
      PWM16_1_WritePeriod(OL);
  else if(TC==102)
      PWM16_1_WritePeriod(S);
  else if(TC==106)
      PWM16_1_WritePeriod(OF);    
  else if(TC==110)
      PWM16_1_WritePeriod(OM);
  else if(TC==114)
      PWM16_1_WritePeriod(OL);    
  else if(TC==118)
      PWM16_1_WritePeriod(OD);
  else if(TC==124)
      PWM16_1_WritePeriod(SILENT);
      }
      
 }
void main()
{
{
char * strPtr; // Parameter pointer <=Char型変数の宣言
  int temp = 9999;
  UART_CmdReset(); // Initialize receiver/cmd buffer <=コマンドバッファのリセット
  UART_IntCntl(UART_ENABLE_RX_INT); // Enable RX interrupts <=RX割込のイネーブル
  Counter8_WritePeriod(155); // Set up baud rate generat
  Counter8_WriteCompareValue(77);
  Counter8_Start(); // Turn on baud rate generator
  UART_Start(UART_PARITY_NONE); // Enable UART <=UARTのモード設定
  M8C_EnableGInt ; // Turn on interrupts
  PWM16_1_Start();
  Timer16_1_EnableInt();
  Timer16_1_Start();
  UART_CPutString("*曲名リスト*");
  UART_CPutString("\n\r");
  UART_CPutString("1:マルマルモリモリ");
  UART_CPutString("\n\r");
  UART_CPutString("2:ヘビーローテーション");
  UART_CPutString("\n\r");
  UART_CPutString("3:小さな世界");
  UART_CPutString("\n\r");
  UART_CPutString("s:ストップ");
  UART_CPutString("\n\r"); 
  UART_CPutString("u:スピードアップ");
  UART_CPutString("\n\r");
  UART_CPutString("d:スピードダウン");
  UART_CPutString("\n\r");
  UART_CPutString("m:スピードを戻す");
  UART_CPutString("\n\r");
  UART_CPutString("キーを押して曲を演奏してください♪");
 
while(1) {
if(UART_bCmdCheck()) { // Wait for command
      if(strPtr = UART_szGetParam()) { // More than delimiter?
          UART_CPutString("Found valid commandCommand =>");
         UART_PutString(strPtr); // Print out command
          UART_CPutString("<Paramaters:");
         
              if (*strPtr=='1'){
              TC=0;
              sel=1;
              }
              else if (*strPtr=='s'){
              TC=0;
              sel=0;
              }
              else if (*strPtr=='2'){
              TC=0;
              sel=2;
              }
              else if (*strPtr=='3'){
              TC=0;
              sel=3;
              }
              else if (*strPtr=='d'){
                  if(temp < 39999)
                      temp +=3000;
              Timer16_1_WritePeriod(temp);
              }
              else if (*strPtr=='u'){
                  if(temp > 2499)
                      temp -= 3000;
              Timer16_1_WritePeriod(temp);
              }
              else if (*strPtr=='m'){
                      temp = 9999;
              Timer16_1_WritePeriod(temp);
              }
              /*
              else if (*strPtr=='j')        
              PWM16_1_WritePeriod(C);
              else if (*strPtr=='k')
              PWM16_1_WritePeriod(DD);
              else if (*strPtr=='l')
              PWM16_1_WritePeriod(SILENT);*/ }
          UART_CmdReset(); // Reset command buffer}
}
}
}
}

使用部品

・PSoC
・PSoC MiniProg
・ジャンパ線×4本
・スピーカー
・シリアルポート通信ケーブル

考察

みんなの知っている曲を作ろうと思ったが、
リズムなどが難しい曲は時間がたりずに作ることができなかった。
また、今回の曲は音がつながっても不自然ではなかったが、
難しくまた早いテンポの曲のときに
音がつながってしまうとおかしくなってしまうと考えられる。

  • 最終更新:2012-06-12 17:22:25

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

認証パスワード