質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

4127閲覧

Processingで複数の図形(ピアノの鍵盤)にカーソルが触れたら、Ardiunoから音(ドからドのオクターブ)がなる。

chika__paris

総合スコア13

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/01/16 12:37

編集2019/01/16 14:24

前提・実現したいこと

「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) を加えてみた結果、各鍵盤が独立したように見えた(カーソルが触れた時それぞれの鍵盤が違う色に変わった)が、やはり各鍵盤からそれぞれの音をだすことができない。

下記の画像が回路図です。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/01/16 13:49

コードだけ出されても、実際の回路図がないとわけわかりません。 回路図を提示しましょう
chika__paris

2019/01/16 14:11

説明が不十分で申し訳ありません、、!ご丁寧にありがとうございます????‍♂️
y_waiwai

2019/01/16 14:18

シリアル通信で音を出してるようですが、そこんところの配線はどうなってますか?
chika__paris

2019/01/16 14:38

配線は上記の画像に載っているものだけで行っていました…!????
y_waiwai

2019/01/16 14:47

?ピアノの鍵盤の図形というのが意味不明ですが
chika__paris

2019/01/16 14:51

長方形が横に8つ並んでおり、ピアノの鍵盤のようになっているということです!
y_waiwai

2019/01/16 15:00

それはどこに??
chika__paris

2019/01/16 15:25

Processingで鍵盤を書きました!MyShape というのが1つ1つの鍵盤です! 分かりづらくすみません…!
guest

回答1

0

ベストアンサー

そのプログラムのやっていること、ちゃんと説明出来ますか?
いや、言ってしまうと「めちゃくちゃ」だよなぁ、と思いながら眺めているのですけれど...

for (MyShape s : shapes) {文} このfor文は、shapesに含まれている要素の一つ一つをsに入れて、それぞれ文を実行する、という意味です。このときのsとかtとかってのは、setup()内のsとかtとかってのとは何の関係もありません。で、processingのmouseX/mouseYは、マウスカーソルがウインドウの外に出てしまってもウインドウ内の(どこかに張り付いた)座標を返しますから、8つのrect()でウインドウを覆っているので、if (s.contains(mouseX, mouseY)) はshapesのどれかの要素で必ず真になり、結果としてこのプログラムはiiiiiiiaiiiiiiibiiiiiiiciiii....という出力を延々と出し続けることになります。

継承も意味のある使われ方していません。普通のクラスで自分の位置を持ったインスタンスを作れば十分でしょう。どうしてもと言うならそこで白鍵クラスと黒鍵クラスを作りわけるぐらいかな。

理解していない道具を無理して使わないで、それといろいろなことをいっぺんにやろうとしないで、一つ一つ確実に出来ることを積み上げていったほうがいいと思います。とりあえず、プログラムは今のは忘れて1から書き直したほうがいいのでは。

投稿2019/01/17 14:26

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chika__paris

2019/01/17 17:39

ご丁寧にありがとうございます…!ひとつずつ見直したらやりたいことができました????‍♂️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問