チーム1954

課題名

piano man

研究者名

土佐陽生 須藤宏晃

概要[#a6651ac0]

基本は1439を参照

自分で演奏した音楽を録音して再生することができる。
シャープの音は準備してませんが、3オクターブの音域を準備しているので、
ある程度の音楽は演奏、録音ができます。
一番下の音域が"z","x","c","v","b","n","m",
真ん中の音域が"a","s","d","f","g","h","j",
一番上の音域が"q","w","e","r","t","y","u",
がそれぞれド、レ、ミ、ファ、ソ、ラ、シになります。
"o"を押すと録音した音楽を流します。
録音再生が終わったら、また次の曲の演奏に移ることができます。

このアプリケーションを基礎に
1. 逆再生
2. 音の持続的録音
3.チャルメラのメロディー
4.説明書
を追加してより高精度なピアノマシンを作成した。

追加した機能、バグの改修

1.
Iを入力すると反対再生をできるようにした。

2.
MUSICに格納されている文字を初期化することによって、保存した音楽を二回目を流す際に配列の中に残ってしまっていた、音を取り除くことができた。

3.
音が止まらないバグの改善。リバースや録音をした後に無音を流すことによって解決した。

4.
3を入力するとチャルメラが流れるようにした。

5.
現段階までのOボタンの録音再生では、一度しかフレーズを流すことができない。そこで、今までの音楽を保存しておくstockコマンド(4)を作成することにより。5を入力すると4番をおして保存したフレーズをいつでも流せるように改良した。

6.
マニュアルの作成。音楽を演奏している最中にコマンドが分からなくなってしまうことがある。そこで3のボタンを押すとこのアプリけーしんょで使用できるコマンドを表示できるようにした。

7.
優秀な演奏者でも演奏中におんぷを忘れてしまうかもしれない。そんな時に2のコマンドを打ち込めばキーボードに対応するおとが一覧で見ることができる。

使用器具

PSoC(27443デバイス) 1個
スピーカー          1個
ジャンパ線          3個


配置とソースコード

labon_convert_1000.png

ソースコード

#include <m8c.h>
#include "PSoCAPI.h"
#pragma interrupt_handler myISR

int PW=125; // Pulse Width
int SILENT=0, D0=458, L0=408, M0=364, F0=343,S0=306, R0=273, C0=243, D1=229,
L1=204, M1=182, F1=172, S1=153, R1=136, C1=121, D2=115,L2=102, M2=91, F2=86, S2=77, R2=68, C2=61; //Scale
int TC=0;
int k = 0, h = 0;
void play(char *strPtr){//音を鳴らす。3オクターブ準備している。

  if(*strPtr=='z')
      PWM16_1_WritePeriod(D0);
  else if (*strPtr=='x')
         PWM16_1_WritePeriod(L0);
    else if (*strPtr=='c')
         PWM16_1_WritePeriod(M0);
    else if (*strPtr=='v')
         PWM16_1_WritePeriod(F0);
    else if (*strPtr=='b')
         PWM16_1_WritePeriod(S0);
    else if (*strPtr=='n')
         PWM16_1_WritePeriod(R0);
    else if (*strPtr=='m')
         PWM16_1_WritePeriod(C0);
  else if(*strPtr=='a')
         PWM16_1_WritePeriod(D1);
  else if (*strPtr=='s')
         PWM16_1_WritePeriod(L1);
    else if (*strPtr=='d')
         PWM16_1_WritePeriod(M1);
    else if (*strPtr=='f')
         PWM16_1_WritePeriod(F1);
    else if (*strPtr=='g')
         PWM16_1_WritePeriod(S1);
    else if (*strPtr=='h')
         PWM16_1_WritePeriod(R1);
    else if (*strPtr=='j')
         PWM16_1_WritePeriod(C1);      
  else if (*strPtr=='q')
      PWM16_1_WritePeriod(D2);
  else if (*strPtr=='w')
        PWM16_1_WritePeriod(L2);
    else if (*strPtr=='e')
        PWM16_1_WritePeriod(M2);
    else if (*strPtr=='r')
        PWM16_1_WritePeriod(F2);
    else if (*strPtr=='t')
        PWM16_1_WritePeriod(S2);
    else if (*strPtr=='y')
        PWM16_1_WritePeriod(R2);
    else if (*strPtr=='u')
        PWM16_1_WritePeriod(C2);      
    else if (*strPtr=='l')
        PWM16_1_WritePeriod(SILENT);
}


void myISR(void){//割り込みが入った時間を記憶する。
TC++;
}

void main(void){
char *strPtr;                        // Parameter pointer  
    char music[50];//音符の保存
    //insert new stock
    char stock[50];
    char a[50];
    // add new program 
    //int music_time[50];
    char reset;
    int i=0,j=0;
    
    a[0]='a';
    a[1]='s';
    a[2]='d';
    a[3]='s';
    a[4]='a';
    a[5]='a';
    a[6]='s';
    a[7]='d';
    a[8]='s';
    a[9]='a';
    a[10]='s';
    //insert pikuminn music 
    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(78);  
    Counter8_Start();                     // Turn on baud rate generator       
    Timer16_1_EnableInt();
    Timer16_1_Start();
    UART_Start(UART_PARITY_NONE);         // Enable UART  
    M8C_EnableGInt ;                      // Turn on interrupts  
    PWM16_1_Start();  
    UART_CPutString("\r\nRecordingPiano Start\r\n");  
  
  while(1){  
      if(UART_bCmdCheck())  { // Wait for command
          if(strPtr = UART_szGetParam()){    // More than delimiter?
              UART_PutString(strPtr);    // Print out command   
              music[i++] = *strPtr;     //音を格納する。
              //music_time[i++] = TC;
              UART_CPutString("<\r\nParamaters:\r\n");      
              play(strPtr);    //音を流す。
              if (*strPtr=='o'){//録音した音を流す。
                  UART_CPutString("\r\nThe recorded music is played.\r\n");
                  TC=0;
                     while(i>j){     
                  if(TC>1){    //一つの音を長さを決める。
                      TC=0;
                      j++;
                  }
                     play(&music[j]);
                  }
                  if(i==j){//録音し終わったので、初期化する。
                         i=0;
                          j=0;
                       for(k = 0;k < 50;k++) {
                           music[k] = '\0';

                      }
                  }
                  reset = 'l';
                  play(&reset);
                  UART_CPutString("Please play the next music. \r\n"); 
              }
              if (*strPtr=='1'){//録音した音を流す。
                  UART_CPutString("\r\nThe charumera music is played.\r\n");
                  TC=0;
                     while(11>j){     
                  if(TC>1){    //一つの音を長さを決める。
                      TC=0;
                      j++;
                  }
                     play(&a[j]);
                  }
                  if(11==j){//録音し終わったので、初期化する。
                         i=0;
                          j=0;
                  }
                  reset = 'l';
                  play(&reset);
                  UART_CPutString("Please play the next music. \r\n"); 
              }
              if (*strPtr=='2'){//録音した音をtwokai流す。
                  UART_CPutString("\r\n|-----------------------------------------|\r\n");    
                  UART_CPutString("\r\n|<z>D0 <x>L0 <c>M0 <v>F0 <b>S0 <n>R0 <m>C0|\r\n");
                  UART_CPutString("\r\n|<a>D1 <s>L1 <d>M1 <f>F1 <g>S1 <h>R1 <j>C1|\r\n");
                  UART_CPutString("\r\n|<q>D2 <w>L2 <e>M2 <r>F2 <t>S2 <y>R2 <u>C2|\r\n");
                  UART_CPutString("\r\n|<l> slient                               |\r\n");
                  UART_CPutString("\r\n|-----------------------------------------|\r\n");    
                  
              }
              if (*strPtr=='3'){//録音した音を流す。
                  UART_CPutString("\r\n|-----------HELLOWORLD-------------|\r\n");
                  UART_CPutString("\r\n|-------This is piano ver2---------|\r\n"); 
                  UART_CPutString("\r\n|<o> you can listen record music!  |\r\n");
                  UART_CPutString("\r\n|<i> you can listen reverse music! |\r\n");
                  UART_CPutString("\r\n|<1> you can listen charumer       |\r\n");
                  UART_CPutString("\r\n|<3> you can watch manual!         |\r\n");
                  UART_CPutString("\r\n|<4> you can stock your music      |\r\n");
                  UART_CPutString("\r\n|<5> you can listen stock music    |\r\n");
                  UART_CPutString("\r\n|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\r\n");
                  UART_CPutString("\r\n|If you find this app,             |\r\n");    
                  UART_CPutString("\r\n|We hope you remake and create ver3|\r\n");
                  UART_CPutString("\r\n|----------------------------------|\r\n");  
              }
              if (*strPtr=='4'){//録音した音をtwokai流す。
                  UART_CPutString("\r\nstock this music!.\r\n");
                  TC=0;
                  for(k = 0;k < 50;k++) {
                       stock[k] = '\0';
                  }
                  for(k = 0;k < 50;k++) {
                       stock[k] = music[k];
                  }
                  for(k = 0;k < 50;k++) {
                       music[k] = '\0';
                  }
                  reset = 'l';
                  play(&reset);
                  UART_CPutString("FINISH \r\n"); 
              }
              if (*strPtr=='5'){//録音した音をtwokai流す。
                  UART_CPutString("\r\nstock music!!! start.\r\n");
                  TC=0;
                     while(stock[j] != ''){     
                      if(TC>1){    //一つの音を長さを決める。
                         TC=0;
                         j++;
                      }
                      play(&stock[j]);
                  }
                  if(stock[j] == ''){//録音し終わったので、初期化する。
                          j=0;
                       i=0;
                  }
                  reset = 'l';
                  play(&reset);
                  UART_CPutString("finish \r\n"); 
              }
              if (*strPtr=='i'){//録音した音を流す。
                  UART_CPutString("\r\nThe reversed music is played.\r\n");
                  TC=0;
                  j = i;
                  reset='l';
                  play(&reset);
                     while(j>=0){     
                     if(TC>1){    //一つの音を長さを決める。
                         TC=0;
                         j--;
                     }
                     play(&music[j]);
                  }
                  if(j+1==0){//録音し終わったので、初期化する。
                         i=0;
                          j=0;
                       UART_CPutString("\r\nshokika!!!!!!.\r\n");
                       for(h = 0;h < 50;h++) {
                           music[h] = '\0';
                       }
                  }
                  reset = 'l';
                  play(&reset);
                  UART_CPutString("Please play the next music. \r\n"); 
              }
           }            
      UART_CmdReset();    // Reset command buffer      
      }  
  }
}

考察

今回はチーム番号1439の作品をベースにさらに多機能にすることを目標に作成していった。もともとの作品はとてもよくできたものだったがバグ等が散見されたのでその改善と、コマンドi, 2, 3, 4, 5を追加することによりよりアプリケーションらしい電子ピアノを目指した。更なる改善点としては、音符が入力される時間を記録しておき記録時と同じテンポで録音を流せるとより良いものになるだろう。

実行結果


teraterm画面

RecordingPiano Start
a<
Paramaters:
s<
Paramaters:
d<
Paramaters:
o<
Paramaters:

The recorded music is played.
Please play the next music.
a<
Paramaters:
s<
Paramaters:
d<
Paramaters:
i<
Paramaters:

The reversed music is played.

shokika!!!!!!.
Please play the next music.
1<
Paramaters:

The charumera music is played.
Please play the next music.
2<
Paramaters:

-----------------------------------------

<z>D0 <x>L0 <c>M0 <v>F0 <b>S0 <n>R0 <m>C0

<a>D1 <s>L1 <d>M1 <f>F1 <g>S1 <h>R1 <j>C1

<q>D2 <w>L2 <e>M2 <r>F2 <t>S2 <y>R2 <u>C2

<l> slient

-----------------------------------------
3<
Paramaters:

-----------HELLOWORLD-------------

-------This is piano ver2---------

<o> you can listen record music!

<i> you can listen reverse music!

<1> you can listen charumer

<3> you can watch manual!

<4> you can stock your music

<5> you can listen stock music

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you find this app,

We hope you remake and create ver3

----------------------------------
a<
Paramaters:
s<
Paramaters:
d<
Paramaters:
f<
Paramaters:
g<
Paramaters:
4<
Paramaters:

stock this music!.
FINISH
5<
Paramaters:

stock music!!! start.
finish
5<
Paramaters:

stock music!!! start.
finish
t<

  • 最終更新:2019-12-03 16:08:51

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

認証パスワード