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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Arduino

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

Processing

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

Q&A

解決済

4回答

4712閲覧

Arduinoの感圧センサからProcessingで複数の音を再生したいです。

Shinchama

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Arduino

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

Processing

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

0グッド

0クリップ

投稿2020/02/05 04:02

編集2020/02/06 14:09

当方、processingとarduinoを連携させて作品を作ろうと考えております。

【構想】
arudino側のブレッドボードに感圧センサ(使用:ALPHA-MF01-N-221-A01)を接続し、検知した数値(arduinoのシリアルモニターでは0~350位は値が動きました)によって、複数の音声データを再生したいです。

値が100のときは〇〇〇.mp3、200のときは△△△.mp3が再生されるようなイメージです。
また、値が200→100に戻った時には、再生している音声データも△△△.mp3→〇〇〇.mp3へと戻るようにしたいと考えています。

現状で、感圧センサの値→音声データ再生すらできていない状況で、リファレンスや似たようなスケッチを参考にしているのですが、まったく回答がわかっていません・・・。

******************************************
以下、作成しているスケッチ

【arduino側】

int

1 2void setup() { 3 Serial.begin(9600); 4} 5 6void loop() { 7 // センサーの値を取得 8 val = analogRead(0); 9 10 // 一度に送れるデータ(1byte)に変換 11 map(val, 0, 1023, 0, 255); 12 13 // シリアルデータ送信 14 Serial.write(val); 15 16 delay(50); 17}

【processing側】

import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; import ddf.minim.signals.*; import ddf.minim.spi.*; import ddf.minim.ugens.*; import processing.serial.*; Serial port; Minim minim = new Minim(this); AudioPlayer player; void setup() { size(480, 240); port = new Serial(this, "COM3", 9600); player = minim.loadFile("〇〇〇.mp3"); } void draw() { if (port.available() > 0 ) { // シリアルデータ受信 in_data = port.read(); player.play();  } }

こういった質問の仕方は良くないと思うのですが、どなたか知恵をお貸しいただければ幸いです。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11219716691

↑上記サイト【yahoo知恵袋】にても、ご意見をいただきたかったため、マルチポストを行っておりますので、ご了承ください。

何卒宜しくお願い致します。

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

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

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

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

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

Shinchama

2020/02/05 22:45

承知致しました。マルチポストの件、申し訳ございません。
thkana

2020/02/06 13:58

謝ればいいという話ではなくて、然るべき処置をしてください。
Shinchama

2020/02/06 14:11

マルチポストの件に関し、teratailのルールに則り、質問内容を変更しております。
guest

回答4

0

ベストアンサー

Processing

1 // 一度に送れるデータ(1byte)に変換 2 map(val, 0, 1023, 0, 255);

の部分は

Processing

1 // 一度に送れるデータ(1byte)に変換 2 val = map(val, 0, 1023, 0, 255);

の間違いじゃないでしょうか?(Arduinoが手元にないので確認できませんが)

201~300=Cと割り当てたとして

送受信処理を簡略化させるため、データを1バイト(0~255)に圧縮(センサーの値が0だったら0 1023だったら255 512だったら127に)している(ちょうど↑のコードのところ)ので、256以上は来ません。

arduinoのシリアルモニターでは0~350位は値が動きました

これがセンサーの値なら、Processing側は0~87くらいしか変動しないことになります(数段階の音を出すなら十分すぎですが)

気になった点は以上です。


参考コード
Arduinoがないのでセンサーの代わりに、マウスX座標にさせていただきました(画面内でマウスを左右に動かすと曲が変わります)
データ受信のところをコメント化しましたが、元に戻せばおそらく動くと思います。

素直に書いてみた場合

Processing

1import ddf.minim.Minim; 2import ddf.minim.AudioPlayer; 3import processing.serial.Serial; 4 5Serial port; 6Minim minim; 7AudioPlayer sound0; // 曲 いっこ目 8AudioPlayer sound1; // 曲 にこ目 9AudioPlayer sound2; // 曲 さんこ目 10 11void setup() { 12 size(480, 240); 13 // ↓コメント解除 14 //port = new Serial(this, "COM3", 9600); 15 minim = new Minim(this); 16 sound0 = minim.loadFile("groove.mp3"); 17 sound1 = minim.loadFile("jingle.mp3"); 18 sound2 = minim.loadFile("groove.mp3"); 19} 20 21void draw() { 22 // ↓コメント解除 23 //if (port.available() > 0 ) { 24 // // シリアルデータ受信 25 // int in_data = port.read(); 26 int in_data = int(map(mouseX, 0, width, 0, 255)); // これは削除 27 28 if (in_data < 100) { // sound0の範囲だったら... 29 if (!sound0.isPlaying()) { // sound0を再生中でなかったら...(再生中ならそのまま何もしない) 30 sound1.pause(); // 他をポーズ(再生していなくてもポーズを呼ぶこと自体は問題ない) 31 sound2.pause(); 32 sound0.loop(); // ポーズ位置から再度ループ再生 33 } 34 } else if (in_data < 200) { // 以下同じように 35 if (!sound1.isPlaying()) { 36 sound0.pause(); 37 sound2.pause(); 38 sound1.loop(); 39 } 40 } else { 41 if (!sound2.isPlaying()) { 42 sound0.pause(); 43 sound1.pause(); 44 sound2.loop(); 45 } 46 } 47 //} // ここもコメント解除 48}

配列と関数を使ってみた場合

Processing

1import ddf.minim.Minim; 2import ddf.minim.AudioPlayer; 3import processing.serial.Serial; 4 5Serial port; 6Minim minim; 7AudioPlayer[] sounds; // 曲の配列 8AudioPlayer playing; // 再生中の曲(最初はnull) 9 10void setup() { 11 size(480, 240); 12 // ↓コメント解除 13 //port = new Serial(this, "COM3", 9600); 14 minim = new Minim(this); 15 sounds = new AudioPlayer[]{ 16 minim.loadFile("groove.mp3"), // 曲 いっこ目(配列の番号は0) 17 minim.loadFile("jingle.mp3"), // 曲 にこ目(1) 18 minim.loadFile("groove.mp3"), // 曲 さんこ目(2) 19 }; 20} 21 22void draw() { 23 // ↓コメント解除 24 //if (port.available() > 0 ) { 25 // // シリアルデータ受信 26 // int in_data = port.read(); 27 int in_data = int(map(mouseX, 0, width, 0, 255)); // これは削除 28 29 if (in_data < 100) { // sounds[0]の範囲だったら... 30 changeSound(sounds[0]); // changeSound関数にsounds[0]を渡して呼ぶ 31 } else if (in_data < 200) { // 以下同じように 32 changeSound(sounds[1]); 33 } else { 34 changeSound(sounds[2]); 35 } 36 //} // ここもコメント解除 37} 38 39void changeSound(AudioPlayer sound) { 40 if (playing == sound) return; // 再生中の曲と同じならそのまま何もしない 41 42 if (playing != null) playing.pause(); // 再生中の曲がnullでない(何か再生している)ならポーズ 43 playing = sound; // 再生中の曲を引数で渡された曲に変更 44 if (playing != null) playing.loop(); // その曲がnullでないならポーズ位置から再度ループ再生(changeSound(null);とすれば何も再生されないようになる) 45}

微妙にやっている内容が違うのがなんですが^^; 2,3曲ならどちらでもいい気がします。

投稿2020/02/06 21:53

編集2023/07/18 22:04
TN8001

総合スコア9321

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

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

0

感圧センサの値→音声データ再生すらできていない

全然そういう動作をするプログラムになってませんから当然でしょう。

arudinoの感圧センサからprocessingへの値の反映ですが、感圧センサを押すと、押す強さによって図形の大きさが変わるプログラムには成功しました。

ちょっとそのプログラム見せていただけますか?

投稿2020/02/05 13:43

thkana

総合スコア7639

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

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

Shinchama

2020/02/05 22:44

そうですよね…。 感圧センサの検知する値の強弱→図形の大きさが変わるプログラム 【arduino側】 int val = 0; void setup() { Serial.begin(9600); } void loop() { // センサーの値を取得 val = analogRead(0); // 一度に送れるデータ(1byte)に変換 map(val, 0, 1023, 0, 255); // シリアルデータ送信 Serial.write(val); delay(50); } 【processing側】 import processing.serial.*; Serial port; float x; float y; int in_data; void setup() { size(300, 300); port = new Serial(this, "COM3", 9600); background(0, 0, 0); } void draw() { // 描画エリア設定 fill(255, 10); noStroke(); rect(0, 0, width, height); // シリアルポートからデータを受け取ったら if (port.available() > 0 ) { // シリアルデータ受信 in_data = port.read(); // 描画 x = width / 2 + random(-3, 3); y = height / 2 + random(-3, 3); noFill(); stroke(random(255), random(255), 255); ellipse(x, y, in_data, in_data); } } 圧力センサを押すと、何もない画面から強弱によって円が描画されるプログラムです。 https://l-w-i.net/t/arduino/processing_001.txt ↑こちらのサイトのものを使用させていただき、手元のarduinoとproccessingでも成功しました。 ちなみに複数の音を)processing上で再生することには昨夜成功しております。(圧力センサの検知した値によって指定した音声ファイルが再生される…というところまでは到達しておりませんが…。)
thkana

2020/02/06 14:00

通信は問題なさそうですね。 つまり、「ある変数がある値のときにある動作をする」というプログラムの構造がわからない、ということですか? (わからないことが悪いというわけじゃありません。あなたがわからないところがはっきりしないとどういう説明をすべきかが変わるということです)
Shinchama

2020/02/06 14:21

おっしゃる通りです。 具体的には、圧力センサにて検知した値(1~100、101~200、201~300)といったくくりを、1~100=A、101~200=B、201~300=Cと割り当てたとして、Aの範囲でセンサが値を検知した場合は〇〇〇.mp3を再生する、Bの場合は△△△.mp3を再生する…といった実行結果を得たく、そのプログラム構造(できれば具体的なスケッチ)が知りたいところです。
thkana

2020/02/07 14:02

「条件で分岐する」といえば、まずはif文を思い出して下さい。 とりあえず、 if(圧力センサで検知した値が1~100の範囲){ (再生中の他の音源を停止する) 〇〇〇.mp3を再生する } if(圧力センサで検知した値が101~200の範囲){ (再生中の音源を停止する) △△△.mp3を再生する } if(圧力センサで検知した値が200~255の範囲){ //1byteのデータが持てる値は0~255の範囲。300はありえない (再生中の音源を停止する) xxx.mp3を再生する } いろいろと無駄があったりしますが、これを考えられないようだと先に進めませんから。
guest

0

質問にもありますのでシリアルで値は正常に受信できていると考えます。
従って値によってMp3のどれを再生するか?という質問と理解します。
また値は常に受信されているので、その切替のタイミングを考慮する必要があると思います。
恐らく希望の動作は複数のチェックポイント(値)を用意、例えば0-100までを範囲0、101-200までを範囲1、201-300までを範囲2の様に条件式を用意して現在の範囲の値が別の範囲に変わった時にmp3のデータを変えて再生で良いのでは?

投稿2020/02/05 07:44

MasahikoHirata

総合スコア3747

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

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

0

まずは受信側で、再生どーこーは考えないで受信した数値を表示させるなりして、感圧センサの値がきちんと通信で表示されるのをしっかり確認しましょう。
それが出来なければ考え直す必要が出てきます。

はなしはそれからですねー

投稿2020/02/05 05:24

y_waiwai

総合スコア87774

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

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

Shinchama

2020/02/05 06:16

有難うございます。 arudinoの感圧センサからprocessingへの値の反映ですが、感圧センサを押すと、押す強さによって図形の大きさが変わるプログラムには成功しました。 通信はできていると思うので、あとは【特定の値になる】→【音が再生される】状況にできればと思っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問