#初めに
こんにちは!
授業でARDUINOを触っているものです。現在、成果物として、パソコンのキーボードを入力するとピアノのように音楽が引けちゃうプログラムを作成中です。シリアル通信で対応したキーを入力するとドレミが出力するシステムが出来上がっているのですが、連続で鳴らしたいときにどうすれば良いのか分からずに困っています。
#プログラムコード
以下がプログラムコードになります。
// 12番ピンをスピーカーに接続する const int pin = 12; int melo =200; // 10番,8番ピンをLEDに接続する const int LED = 10; const int LGD = 8; // ここで初期化する void setup() { // スピーカーをつないだピンを出力に設定する pinMode(pin, OUTPUT); pinMode(LED, OUTPUT); // 9600bpsでシリアル通信を始めます Serial.begin(9600); } // ここからループに入る void loop() { // シリアル通信でパソコンから入力された文字を変数に保存する int sw = Serial.read(); // もしaという文字が送られてきたら if (sw == 'a') { // ドを鳴らす tone(pin,262,melo); digitalWrite(LED,HIGH); delay(500); digitalWrite(LED,LOW); // もしsという文字が送られてきたら } else if (sw == 's') { // レを鳴らす tone(pin,294,melo); digitalWrite(LGD,HIGH); delay(500); digitalWrite(LGD,LOW); // dが送られたら } else if (sw == 'd') { //ミを鳴らす tone(pin,330,melo); digitalWrite(LED,HIGH); delay(500); digitalWrite(LED,LOW); // もしfという文字が送られてきたら } else if (sw == 'f') { // ファを鳴らす tone(pin,349,melo); digitalWrite(LGD,HIGH); delay(500); digitalWrite(LGD,LOW); // gが送られたら } else if (sw == 'g') { //ソを鳴らす tone(pin,392,melo); digitalWrite(LED,HIGH); delay(500); digitalWrite(LED,LOW); // もしhという文字が送られてきたら } else if (sw == 'h') { // ラを鳴らす tone(pin,440,melo); digitalWrite(LGD,HIGH); delay(500); digitalWrite(LGD,LOW); // jが送られたら } else if (sw == 'j') { //シを鳴らす tone(pin,494,melo); digitalWrite(LED,HIGH); delay(500); digitalWrite(LED,LOW); } }
#このコードで実行したいこと
現在、シリアル通信を使っています。
パソコンのキーボードを入力し、対応したキーを押すとドレミファソラシドの内の一つを出力します。同時にキーを押すと同時に音だけでなくLEDが光るように設定されています。
しかし、シリアル通信だと、入力したキーを逐一送信してあげないと音が出力されません。そのため、ピアノのように連続した状態で鳴らすのが困難になっています。
#最終的に達成したいこと
現在はシリアル通信でキーボードの入力を音と光で出力するように設計していますが、最終的にはシリアル通信を使わずにキーボード入力でそのままピアノのように音楽を演奏できるプログラムを設計したいです。課題の提出が1週間程度しかないので焦っています。