チーム1233
課題名
PSoCの同期による演奏
研究者名
高木 芙美花
中島 樂
概要
ジャンパー線を利用してPSoC同士を同期させることで、2台のPSoCが同時に演奏できるようになった。
左がデータを受け取るPSoCで、右がデータを送るPSoCである。
使用した器具
PSoC 2台
ストレート通信ケーブル 1本
ジャンプワイヤー 10本
スピーカー 2つ
MiniProg 2本
ソースコード
●主旋律
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
int PW=125; //Pilse Width
int SILENT=0,
D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, //C-dur Scale D1=214, L1=193, F1=162, S1=144, R1=128; //半音階 H=241, B=255, A=275, G1=287, G=310, FF1=335;
int i;
void sound(int x,int y){
int i=0; for(i=0;i<y;i++){ PWM16_1_WritePeriod(x); } }
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. char *strPtr; //Patrameter pointer 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 band rate generator 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(strPtr = UART_szGetParam()){ //More than delimiter? UART_CPutString("Found vailid command\r\nCommand=>"); UART_PutString(strPtr); //Print out command UART_CPutString("\r\nParameters:\r\n"); 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 == 'w') PWM16_1_WritePeriod(D1); else if(*strPtr == 'e') PWM16_1_WritePeriod(L1); else if(*strPtr == 't') PWM16_1_WritePeriod(F1); else if(*strPtr == 'y') PWM16_1_WritePeriod(S1); else if(*strPtr == 'u') PWM16_1_WritePeriod(R1);
else if(*strPtr == '1'){ //「森のくまさん」演奏開始 sound(S,5000); sound(F1,5000); sound(S,5000); sound(M,25000); sound(SILENT,500);
sound(M,5000); sound(L1,5000); sound(M,5000); sound(D,25000); sound(SILENT,500); sound(M,5000); sound(L,5000); sound(D,5000); sound(L,25000); sound(SILENT,500); sound(S,5000); sound(R,5000); sound(S,5000); sound(M,25000); sound(SILENT,500); sound(S,5000); sound(R,5000); sound(C,5000);
sound(DD,10000); sound(S,10000); sound(M,10000); sound(D,10000); sound(R,25000); sound(SILENT,500);
sound(R,5000); sound(C,5000); sound(R,5000); sound(S,10000); sound(F,10000); sound(M,10000); sound(L,10000); sound(D,25000);
PWM16_1_WritePeriod(SILENT); } else if(*strPtr == '2'){//「かえるのうた(輪唱)」演奏開始 sound(D,10000); sound(L,10000); sound(M,10000); sound(F,10000); sound(M,10000); sound(L,10000); sound(D,10000); sound(SILENT,10000); sound(M,10000); sound(F,10000); sound(S,10000); sound(R,10000); sound(S,10000); sound(F,10000); sound(M,10000); sound(SILENT,10000); sound(D,20000); sound(SILENT,500); sound(D,20000); sound(SILENT,500); sound(D,20000); sound(SILENT,500); sound(D,20000); sound(SILENT,500); sound(D,5000); sound(SILENT,100); sound(D,5000); sound(L,5000); sound(SILENT,100); sound(L,5000); sound(M,5000); sound(SILENT,100); sound(M,5000); sound(F,5000); sound(SILENT,100); sound(F,5000); sound(M,10000); sound(SILENT,100); sound(L,10000); sound(SILENT,100); sound(D,20000); sound(SILENT,500); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); PWM16_1_WritePeriod(SILENT); } else if(*strPtr == 'l') PWM16_1_WritePeriod(SILENT); } UART_CmdReset(); //Reset command buffer } } }
●副旋律
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
int PW=125; //Pilse Width
int SILENT=0,
D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, //C-dur Scale D1=214, L1=193, F1=162, S1=144, R1=128; //半音階 H=241, B=255, A=275, G1=287, G=310, FF1=335;
int i;
void sound(int x,int y){
int i=0; for(i=0;i<y;i++){ PWM16_1_WritePeriod(x); } }
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. char *strPtr; //Patrameter pointer 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 band rate generator 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(strPtr = UART_szGetParam()){ //More than delimiter? UART_CPutString("Found vailid command\r\nCommand=>"); UART_PutString(strPtr); //Print out command UART_CPutString("\r\nParameters:\r\n"); 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 == 'w') PWM16_1_WritePeriod(D1); else if(*strPtr == 'e') PWM16_1_WritePeriod(L1); else if(*strPtr == 't') PWM16_1_WritePeriod(F1); else if(*strPtr == 'y') PWM16_1_WritePeriod(S1); else if(*strPtr == 'u') PWM16_1_WritePeriod(R1);
else if (*strPtr=='1'){//「森のくまさん」演奏開始 sound(M ,5000); sound(L1,5000); sound(M,5000); sound(D,25000); sound(SILENT,500);
sound(D,5000); sound(H,5000); sound(D,5000); sound(G,25000); sound(SILENT,500); sound(D,5000); sound(H,5000); sound(A,5000); sound(H,25000); sound(SILENT,500); sound(M,5000); sound(F,5000); sound(M,5000); sound(D,25000); sound(SILENT,500); sound(M,5000); sound(F,5000); sound(S,5000);
sound(S,10000); sound(M,10000); sound(D,10000); sound(G,10000); sound(F,25000); sound(SILENT,500);
sound(F,5000); sound(S,5000); sound(F,5000); sound(M,10000); sound(L,10000); sound(D,10000); sound(G,10000); sound(D,25000);
PWM16_1_WritePeriod(SILENT); } else if(*strPtr == '2'){//「かえるのうた(輪唱)」演奏開始 sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(SILENT,10000); sound(D,10000); sound(L,10000); sound(M,10000); sound(F,10000); sound(M,10000); sound(L,10000); sound(D,10000); sound(SILENT,10000); sound(M,10000); sound(F,10000); sound(S,10000); sound(R,10000); sound(S,10000); sound(F,10000); sound(M,10000); sound(SILENT,10000); sound(D,20000); sound(SILENT,500); sound(D,20000); sound(SILENT,500); sound(D,20000); sound(SILENT,500); sound(D,20000); sound(SILENT,500); sound(D,5000); sound(SILENT,100); sound(D,5000); sound(L,5000); sound(SILENT,100); sound(L,5000); sound(M,5000); sound(SILENT,100); sound(M,5000); sound(F,5000); sound(SILENT,100); sound(F,5000); sound(M,10000); sound(SILENT,100); sound(L,10000); sound(SILENT,100); sound(D,20000); sound(SILENT,500); PWM16_1_WritePeriod(SILENT); } else if(*strPtr == 'l') PWM16_1_WritePeriod(SILENT); } UART_CmdReset(); //Reset command buffer } } }
考察
演奏を行うようにTeraTermで命令を行う際、どうしても文字化けが発生してしまうことがある。
これは、データを受け取る側のPSoCの動く速度がどうしても遅くなるためデータを受け取れなくなってしまい、送る側のPSoCの表示が間に合わなくなってしまうからだと考えられる。
改善するには、受ける側のPSoCの動作をバッファーなどを用いて高速にしなければならない。
また、ジャンパー線の方法を使うことで、2台だけでなく3台、4台...とたくさんのPSoCを同期させることができる。
- 最終更新:2012-07-10 15:46:04