前提・実現したいこと
「Processingでピアノ」
Processingで複数の図形(ピアノの鍵盤)を書き、それぞれの鍵盤にカーソルが触れた時にArdiunoから音(ドからドのオクターブまで)がなるというプログラムを書いています。
発生している問題・エラーメッセージ
鍵盤ごとの場合分けがうまくできていないのか、ドの鍵盤を押しているのにド以外の他の音まで鳴ってしまいまい、カーソルが離れてからも音が鳴り止みません。
さらに、黒い鍵盤を書こうとしても鍵盤の色を変えられないため、現状では白い鍵盤しか書けておらず困っています。
該当のソースコード
int melo = 200; //音の長さを指定 #define PIN 8 //ブザーを接続したピン番号 void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { int data = Serial.read(); if (data == 'a') { //ド tone(PIN, 262, 600); delay(300); } if (data == 'b') { //レ tone(PIN, 294, 300); delay(300); } if (data == 'c') { //ミ tone(PIN, 330, 300); delay(300); } if (data == 'd') { //ファ tone(PIN, 344, 600); delay(300); } if (data == 'e') { //ソ tone(PIN, 392, 300); delay(300); } if (data == 'f') { //ラ tone(PIN, 440, 600); delay(300); } if (data == 'g') { //シ tone(PIN, 494, 600); delay(300); } if (data == 'h') { //ド tone(PIN, 262, 600); delay(300); } else if (data == 'i') { } } }
Ardiuno側のコードです。
import processing.serial.*; boolean didTouch = false; Serial serial; ArrayList<MyShape> shapes = new ArrayList<MyShape>(); // 任意の図形を表す抽象クラス abstract class MyShape { int selectedFill; // 画面上へこの図形を描画するメソッド abstract void draw(); // 指定位置がこの図形に含まれるかどうか判定するメソッド abstract boolean contains(float x, float y); } // 長方形を表すクラス class MyRect extends MyShape { float x, y, w, h; MyRect(float x, float y, float w, float h) { this.x = x; this.y = y; this.w = w; this.h = h; } void draw() { rect(x, y, w, h); } boolean contains(float mx, float my) { return mx >= x && mx <= (x + w) && my >= y && my <= (y + h); } } void setup() { size(800, 500); serial = new Serial(this, Serial.list()[1], 9600); stroke(0); strokeWeight(1); MyShape s; MyShape t; MyShape u; MyShape v; MyShape w; MyShape x; MyShape y; MyShape z; s = new MyRect(0, 0, 100, 500); t = new MyRect(100, 0, 100, 500); u = new MyRect(200, 0, 100, 500); v = new MyRect(300,0, 100, 500); w = new MyRect(400, 0, 100, 500); x = new MyRect(500, 0, 100, 500); y = new MyRect(600,0, 100, 500); z = new MyRect(700, 0, 100, 500); shapes.add(s); shapes.add(t); shapes.add(u); shapes.add(v); shapes.add(w); shapes.add(x); shapes.add(y); shapes.add(z); } void draw() { for (MyShape s : shapes) { if (s.contains(mouseX, mouseY)) { if(!didTouch){ fill(s.selectedFill); didTouch = true; //カーソルが触れたら赤くなる serial.write('a'); } } else { fill(255); serial.write('i'); didTouch = false; //カーソルが触れなかったら白のまま } s.draw(); } for (MyShape t : shapes) { if (t.contains(mouseX, mouseY)) { if(!didTouch){ fill(#CE2828); didTouch = true; //カーソルが触れたら赤くなる serial.write('b'); } } else { fill(255); serial.write('i'); didTouch = false; //カーソルが触れなかったら白のまま } t.draw(); } for (MyShape u : shapes) { if (u.contains(mouseX, mouseY)) { if(!didTouch){ fill(#CE2828); didTouch = true; //カーソルが触れたら赤くなる serial.write('c'); } } else { fill(255); serial.write('i'); didTouch = false; //カーソルが触れなかったら白のまま } u.draw(); } for (MyShape v : shapes) { if (v.contains(mouseX, mouseY)) { if(!didTouch){ fill(#CE2828); didTouch = true; //カーソルが触れたら赤くなる serial.write('d'); } } else { fill(255); serial.write('i'); didTouch = false; //カーソルが触れなかったら白のまま } v.draw(); } for (MyShape w : shapes) { if (w.contains(mouseX, mouseY)) { if(!didTouch){ fill(#CE2828); didTouch = true; //カーソルが触れたら赤くなる serial.write('e'); } } else { fill(255); serial.write('i'); didTouch = false; //カーソルが触れなかったら白のまま } w.draw(); } for (MyShape x : shapes) { if (x.contains(mouseX, mouseY)) { if(!didTouch){ fill(#CE2828); didTouch = true; //カーソルが触れたら赤くなる serial.write('f'); } } else { fill(255); serial.write('i'); didTouch = false; //カーソルが触れなかったら白のまま } x.draw(); } for (MyShape y : shapes) { if (y.contains(mouseX, mouseY)) { if(!didTouch){ fill(#CE2828); didTouch = true; //カーソルが触れたら赤くなる serial.write('g'); } } else { fill(255); serial.write('i'); didTouch = false; //カーソルが触れなかったら白のまま } y.draw(); } for (MyShape z : shapes) { if (z.contains(mouseX, mouseY)) { if(!didTouch){ fill(#CE2828); didTouch = true; //カーソルが触れたら赤くなる serial.write('h'); } } else { fill(255); serial.write('i'); didTouch = false; //カーソルが触れなかったら白のまま } z.draw(); } }
Processing側のコードです。
試したこと
各鍵盤を独立させようと fill(shape.selectedFill) を加えてみた結果、各鍵盤が独立したように見えた(カーソルが触れた時それぞれの鍵盤が違う色に変わった)が、やはり各鍵盤からそれぞれの音をだすことができない。
回答1件
あなたの回答
tips
プレビュー