チーム2229
課題名
トランスポーズ機能搭載のキーボード
研究者名
2-15-37 Kentaro Tsuchiya
2-15-38 Ayuki Tokoi
使用した機材
PSoc
PSoc基板
MiniProg
スピーカー
16個ボタン基盤(KEYPAD-16X16)
概要
pwm_uart_2でキーボードの作成をしたが、そこではEnterキーを押さなければ音が鳴らなかった。
本来キーボードはコントローラーを押すという入力をしたら、ほぼラグがなく音が鳴るものなのでそこに関する改善を試みた。
pwm_uart_2でと同様のパソコンキー入力だとPSoCProgrammerの特性上Enterキーを押すことが必須だったため、16×16KEYPADを導入した。
モジュールの接続方法
ソースコード(main.c)
#include <m8c.h>
#include "PSoCAPI.h"
int PW=125,i=1;
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115;
int LD=243, LL=217, LM=193, LF=182, LS=162, LR=145, LC=129, LDD=121;
int HD=217, HL=193, HM=172, HF=162, HS=145, HR=129, HC=115, HDD=108;
//周波数をもとにした音階ごとの数値を変数に代入
static const keypad_LUT[256] =
{/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ /*0*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*1*/0x20, ' ', ' ', 0x20, ' ', 0x20, 0x20, 0x20, ' ', 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*2*/0x20, 'L', 'M', 0x20, 'H', 0x20, 0x20, 0x20, ' ', 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*3*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*4*/0x20, '4', '5', 0x20, '6', 0x20, 0x20, 0x20, '7', 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*5*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*6*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*7*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*8*/0x20, '0', '1', 0x20, '2', 0x20, 0x20, 0x20, '3', 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*9*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*A*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*B*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*C*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*D*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*E*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*F*/0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }; //KEYPADに対応する変数の設定
BYTE rows,cols;
unsigned char key[2] = {0x20,0}; unsigned char keypad_scan(void); void InitModules(void); void GPIOInterrupt(void);
void main(void)
{
InitModules(); M8C_EnableGInt; while(1) { key[0] = keypad_scan(); if(key[0] != 0x20) { LCD_1_Position(1, 10);
switch (key[0]){ case 'L': i=0; LCD_1_PrCString("-1"); break; case 'M': i=1; LCD_1_PrCString("0 "); break; case 'H': i=2; LCD_1_PrCString("+1"); break; } //トランスポーズ機能の処理と、その度数をLCDディスプレイ上に表示
LCD_1_Position(0,6); if(i==0){ switch(key[0]){ case '0': PWM16_1_WritePeriod(LD); LCD_1_PrCString("C "); break; case '1': PWM16_1_WritePeriod(LL); LCD_1_PrCString("D "); break; case '2': PWM16_1_WritePeriod(LM); LCD_1_PrCString("E "); break; case '3': PWM16_1_WritePeriod(LF); LCD_1_PrCString("F "); break; case '4': PWM16_1_WritePeriod(LS); LCD_1_PrCString("G "); break; case '5': PWM16_1_WritePeriod(LR); LCD_1_PrCString("A "); break; case '6': PWM16_1_WritePeriod(LC); LCD_1_PrCString("B "); break; case '7': PWM16_1_WritePeriod(LDD); LCD_1_PrCString("CC"); } }else if(i==1){ switch(key[0]){ case '0': PWM16_1_WritePeriod(D); LCD_1_PrCString("C "); break; case '1': PWM16_1_WritePeriod(L); LCD_1_PrCString("D "); break; case '2': PWM16_1_WritePeriod(M); LCD_1_PrCString("E "); break; case '3': PWM16_1_WritePeriod(F); LCD_1_PrCString("F "); break; case '4': PWM16_1_WritePeriod(S); LCD_1_PrCString("G "); break; case '5': PWM16_1_WritePeriod(R); LCD_1_PrCString("A "); break; case '6': PWM16_1_WritePeriod(C); LCD_1_PrCString("B "); break; case '7': PWM16_1_WritePeriod(DD); LCD_1_PrCString("CC"); } }else if(i==2){ switch(key[0]){ case '0': PWM16_1_WritePeriod(HD); LCD_1_PrCString("C "); break; case '1': PWM16_1_WritePeriod(HL); LCD_1_PrCString("D "); break; case '2': PWM16_1_WritePeriod(HM); LCD_1_PrCString("E "); break; case '3': PWM16_1_WritePeriod(HF); LCD_1_PrCString("F "); break; case '4': PWM16_1_WritePeriod(HS); LCD_1_PrCString("G "); break; case '5': PWM16_1_WritePeriod(HR); LCD_1_PrCString("A "); break; case '6': PWM16_1_WritePeriod(HC); LCD_1_PrCString("B "); break; case '7': PWM16_1_WritePeriod(HDD); LCD_1_PrCString("CC"); } //KEYPADからの入力に対する音階ごとの出力の処理
//LCDディスプレイ上に出力されている音名を表示
} }else{ PWM16_1_WritePeriod(SILENT); LCD_1_Position(0,6); LCD_1_PrCString(" "); } } //デフォルトの記述 }
void InitModules(void)
{
PWM16_1_Start(); LCD_1_Start(); LCD_1_Position(0,0); LCD_1_PrCString("Scale:"); LCD_1_Position(1,0); LCD_1_PrCString("transpose:0"); INT_MSK0|=0x20; PRT0DR|=0xF0;
}
//メソッドの実行
unsigned char keypad_scan(void)
{
BYTE key_result; PRT0DR = 0x0F; rows = PRT0DR; PRT0DR = 0xF0; cols = PRT0DR; key_result = rows & cols; return(keypad_LUT[key_result]);
}
#pragma interrupt_handler GPIOInterrupt
void GPIOInterrupt(void)
{
INT_MSK0&=~0x20;
}
考察
Enterキーを入力せずに音を出力するにはpwm_uart_2のプログラムでは不可能であったため、16X16KEYPADを導入することにより、その問題解決に努めた。その結果、Enterキーなしでの演奏が可能になった。しかし、キーパッドの数が限られているため実際に演奏が行えるような音階の数を実装することが出来なかった。トランスポーズ機能だけでなくオクターブシフト機能も追加できればより現実的なキーボードに近づけることができただろう。
参考文献
チーム1827 3オクターブキーボード
- 最終更新:2022-06-14 17:22:56