チーム1342

課題名

キーボードからの入力による音楽録音再生機

研究者名

2年14組25番 塩野 拓
2年14組26番 嶋中 翔太

概要

キーボードを鍵盤として使用し、演奏された音楽をqボタンを押すことで再生する。

使い方

キーボードから1文字入力し、Enterを押すことで音を鳴らす。
鳴らせる音は全部でドレミファソラシドと無音でそれぞれ、
a, s, d, f, g, h, j, k, lが対応する。
演奏後にqを押すとリセットボタンが押されてから演奏された音楽が再生される。

ソース(main.c)

#include <m8c.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; //Scale
int TC=0;
int tc_tmp=0;
char f=0;
int c=0;

void play(char *strPtr) //音を鳴らす
{
if (*strPtr=='a')
      PWM16_1_WritePeriod(D);
  else if (*strPtr=='s')
      PWM16_1_WritePeriod(L);
  else if (*strPtr=='d')
      PWM16_1_WritePeriod(M);
  else if (*strPtr=='f')
      PWM16_1_WritePeriod(F);
  else if (*strPtr=='g')
      PWM16_1_WritePeriod(S);
  else if (*strPtr=='h')
      PWM16_1_WritePeriod(R);
  else if (*strPtr=='j')
      PWM16_1_WritePeriod(C);
  else if (*strPtr=='k')
      PWM16_1_WritePeriod(DD);
  else if (*strPtr=='l')
      PWM16_1_WritePeriod(SILENT);
  
  tc_tmp = TC;                    //TCを一時格納する
 }


void myISR(void)
{
TC++;
  if(f==1)                //再生中はカウントする
      c++;
}


void main(void)
{
 char *strPtr;                        // Parameter pointer  
  char melody[15];                        //音符の保存
  int time[15];                        //各音符の再生時間
  int i=0,j=0;
    
  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       
  Timer16_1_EnableInt();
  Timer16_1_Start();
  UART_Start(UART_PARITY_NONE);         // Enable UART  
    
  M8C_EnableGInt ;                      // Turn on interrupts  
  PWM16_1_Start();  
  UART_CPutString("\r\nPSoC Synthesizer V1.1\r\n");  
    
  while(1) 
  {  
    if(UART_bCmdCheck()) 
    {                                         // Wait for command  
        if(i!=0)
           time[i] = TC-tc_tmp;
        if(strPtr = UART_szGetParam()) 
      {                                      // More than delimiter?  
          UART_CPutString("Found valid command\r\nCommand =>");    
             UART_PutString(strPtr);// Print out command   
          melody[i++] = *strPtr;
          UART_CPutString("<\r\nParamaters:\r\n");  
          play(strPtr);
          if (*strPtr=='q')
          { 
              for(j=0;j<15;j++)
              {    
                  f=1;                    //再生中を知らせるフラグ
                  while(time[j+1]>c)    //録音した時間ぶん再生する
                  {
                      play(&melody[j]);
                  }
                  f=0;
                  c=0;
              }
              i=0;
          }
       }            
    UART_CmdReset();                          // Reset command buffer    
    }   
 }  
}

必要な器具

PSoC
評価基盤
MiniProg
シリアルケーブル
ジャンパ線:2本
スピーカー

写真

IMG_1465.JPG

考察

 各音符が流れた時間を計測するために、実行開始時点からのタイマー割り込みごとのカウント値(TC)
と、音符が切り替わるとき(キーが押され、Enterが押されるとき)のTCの値(TC_tmp)との差を利用した。
 また、各音符を再生するときには、フラグを立て、タイマー割り込み時にカウントし、その値が記録された時間に達っするまで周波数を変更しないようにすることで音符が流れた時間を再現した。
 改善点としては、qボタンを押した後に次の入力を受け付けないことで録音した音楽の連続再生が不可能になっていること、音楽を鳴らす際に一度Enterを押されければ流れないこと、最後の音符が短く演奏されてしまうことがあげられる。
 

  • 最終更新:2014-05-20 14:18:54

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

認証パスワード