チーム2142

課題名

piano woman

研究者名

Aoki Shunya
Arai Kenta

概要

基本は1954を参照

自分で演奏した音楽を録音して再生することができる。また、逆再生・テンポの変更をする機能がある。


一つの音階を入力したら、Enterを押す。(これを繰り返す)

'1'を押すと、チャルメラを演奏する。
'2'を押すと、音階の配置対応表を表示する。
'3'を押すと、マニュアルを表示する。
'4'を押すと、音楽をストックする。
'5'を押すと、ストックした音楽を演奏する。
'p'を押すと、音楽のテンポを変更する。
'i'を押すと、音楽を逆再生する。
'o'を押すと、ストックしていなくても、音楽を演奏する。


追加した要素
1.
録音した音楽のテンポを変更できるようにした。

'p'を押すたびにテンポが変更して、5回押したら最初のテンポに戻る。

2.
半音階を実装した。


使用器具

スピーカー
ジャンパ 2個

ソースコード

PSoC20220111.png
001.png002.png
003.png004.png
005.png

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

int PW=125; // Pulse Width
int SILENT=0, C=229, C1=217, D=204, D1=193, E=181, F=172, F1=162, G=153, G1=145, A=136, A1=129, B=121, CC=115; //Scale
int TC=0;
int k = 0, h = 0;
void play(char *strPtr){

if(*strPtr=='a')
     PWM16_1_WritePeriod(C);
 else if (*strPtr=='w')
        PWM16_1_WritePeriod(C1);
   else if (*strPtr=='s')
        PWM16_1_WritePeriod(D);
   else if (*strPtr=='e')
        PWM16_1_WritePeriod(D1);
   else if (*strPtr=='d')
        PWM16_1_WritePeriod(E);
   else if (*strPtr=='f')
        PWM16_1_WritePeriod(F);
   else if (*strPtr=='t')
        PWM16_1_WritePeriod(F1);
 else if(*strPtr=='g')
        PWM16_1_WritePeriod(G);
 else if (*strPtr=='y')
        PWM16_1_WritePeriod(G1);
   else if (*strPtr=='h')
        PWM16_1_WritePeriod(A);
   else if (*strPtr=='u')
        PWM16_1_WritePeriod(A1);
   else if (*strPtr=='j')
        PWM16_1_WritePeriod(B);
   else if (*strPtr=='k')
        PWM16_1_WritePeriod(CC);
   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;
   int kkk = 0;
   int t = TMP;
   
   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_WritePeriod(TMP);
   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'){
                 UART_CPutString("\r\n|-----------------------------------------|\r\n");
                 UART_CPutString("\r\n|  <w>C# <e>D#    <t>F# <y>G# <u>A#       |\r\n");  
                 UART_CPutString("\r\n|<a>C <s>D <d>E <f>F <g>G <h>A <j>B <k>CC|\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 ver3---------|\r\n"); 
                 UART_CPutString("\r\n|<o> play recorded music           |\r\n");
                 UART_CPutString("\r\n|<i> play reversed music           |\r\n");
                 UART_CPutString("\r\n|<1> play charumer                 |\r\n");
                 UART_CPutString("\r\n|<2> node conversion table         |\r\n");
                 UART_CPutString("\r\n|<3> operating manual              |\r\n");
                 UART_CPutString("\r\n|<4> stock the music               |\r\n");
                 UART_CPutString("\r\n|<5> play stock music              |\r\n");
                 UART_CPutString("\r\n|<p> change the tempo              |\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 ver4|\r\n");
                 UART_CPutString("\r\n|----------------------------------|\r\n");  
             }
             if (*strPtr=='4'){
                 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'){
                 UART_CPutString("\r\nstock music!!! start.\r\n");
                 TC=0;
                    //while(stock[j] != ''){  
                    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"); 
             }
             if (*strPtr == 'p') {
                 UART_CPutString("\r\nTempo is changed\r\n");
                 if (kkk == 4) {
                     kkk = 0;
                     t = t * 16;
                     Timer16_1_WritePeriod(t);
                 }
                 else {
                     kkk++;
                     t = t / 2;
                     Timer16_1_WritePeriod(t);
                 }
               }            
     UART_CmdReset();    // Reset command buffer      
     }  
 }
 }
 }

考察

テンポは今のところ決められた値にしか変更できないので、ユーザーが入力した整数値のテンポを受け取って柔軟な変更ができるようにしたい。
半音の導入によって音域が狭まったので、オクターブの変更ができるような機能を実装すれば、幅広い音楽を演奏できると考えた。
また、単音での演奏しかできないので、複数のスピーカーを用いるなどして和音を奏でることができればなお面白いと思った。

  • 最終更新:2022-01-11 17:28:06

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

認証パスワード