チーム2142
課題名
piano woman
研究者名
Aoki Shunya
Arai Kenta
概要
基本は1954を参照
自分で演奏した音楽を録音して再生することができる。また、逆再生・テンポの変更をする機能がある。
一つの音階を入力したら、Enterを押す。(これを繰り返す)
'1'を押すと、チャルメラを演奏する。
'2'を押すと、音階の配置対応表を表示する。
'3'を押すと、マニュアルを表示する。
'4'を押すと、音楽をストックする。
'5'を押すと、ストックした音楽を演奏する。
'p'を押すと、音楽のテンポを変更する。
'i'を押すと、音楽を逆再生する。
'o'を押すと、ストックしていなくても、音楽を演奏する。
追加した要素
1.
録音した音楽のテンポを変更できるようにした。
'p'を押すたびにテンポが変更して、5回押したら最初のテンポに戻る。
2.
半音階を実装した。
使用器具
スピーカー
ジャンパ 2個
ソースコード
#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