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

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

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

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

Q&A

解決済

2回答

1078閲覧

Processing 音量が大きくなれば停止、小さくなったら再稼働するようにしたいです

KanakoS

総合スコア1

Processing

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

1グッド

0クリップ

投稿2021/11/29 16:57

前提・実現したいこと

指定の音量を超えれば、文字が表示され、カウントが止まり、指定の音量よりも下回ると文字が消え、カウントが再開するプログラミングを作りたいです。

発生している問題・エラーメッセージ

指定の音量を超えると文字は表示され、カウントは止まるのですが、音量が下回っても(静かになっても)文字がそのままで、カウントが再開されません。

該当のソースコード

Processing

import processing.sound.*; AudioIn in; Amplitude amp; float kyori=0; void setup() { fullScreen(); PFont font = createFont("Meiryo", 50); textFont(font); in = new AudioIn(this); in.start(); amp = new Amplitude(this); amp.input(in); } void draw() { background(255); float a = amp.analyze(); float sz = a * 1000; fill(0); textSize(20); text("飛行距離:"+kyori+"km", 200, 305); kyori=(millis()/15); if (a>0.1) { textSize(40); text("燃料が少ないです", 400, 305); text("下降しています。", 400, 355); text("静かにして燃料を貯めてください。", 400, 405); noLoop(); } if (a<0.1) { loop(); } } ```ここに言語を入力 コード

試したこと

loopとnoLoopの位置を変えてみたりしました。

補足情報(FW/ツールのバージョンなど)

Processing初心者です。
よろしくお願いします。

TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

どうでもいいといえばどうでもいいことですが、「プログラミング」は「プログラムを作ること」なので、プログラミングを作っちゃうと「作ることを作る」で言葉として意味がおかしくなります。作るのはプログラムにしておきましょう。

で、Processingの構造(?)として、
最初にsetup()を実行して
以降はdraw() draw() draw()...とdraw()を繰り返します。
noLoop()とすると、この繰り返しを止めます。draw()は実行されなくなるので、draw()の中にいくらloop()を書いても絶対に実行されず、再開できません。draw()の外で働く、マウスをクリックしたとかキーボードが押されたとかをきっかけに動く関数「イベントハンドラ」の中でloop()を使えば止まっていたdraw()を再開させることができるでしょう。
しかし、「音が大きくなったら動く」イベントハンドラは(頑張って作ればできるのかも知れませんが)ありませんので、noLoop()-loop()で実行を制御する手法は今回の用途では使えない、ということになります。

そもそも、今のプログラムでnoLoop()で動作を止める必要があるのでしょうか?
millis()はdraw()の実行とは無関係に進み続ける「時計」ですから止められません。これが「カウント」ではないと思うのですが、とりあえずその表示だけを止めること/再開すること、と理解するなら、

Processing

1void draw() { 2 background(255); 3 float a = amp.analyze(); 4 float sz = a * 1000; 5 6 kyori=(millis()/15); 7 fill(0); 8 9 if (a>0.1) { 10 textSize(40); 11 text("燃料が少ないです", 400, 305); 12 text("下降しています。", 400, 355); 13 text("静かにして燃料を貯めてください。", 400, 405); 14 }else{ 15 // a>0.1でない、つまりa<=0.1のとき 16 textSize(20); 17 text("飛行距離:"+kyori+"km", 200, 305); 18 } 19}

でよかったりしないかと思うのですがどうでしょう?

投稿2021/11/29 22:09

thkana

総合スコア7659

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

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

0

ベストアンサー

noLoop();とすると、draw()自体が呼ばれなくなってしまいます。
そのため一度止まるとdraw()からでは、loop();させられなくなります(mousePressed()等は呼ばれるのですが)

booleanかなんかでフラグを作り、処理を切り替えるようにしてはどうでしょう?

投稿2021/11/29 22:07

TN8001

総合スコア9401

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

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

KanakoS

2021/12/01 04:38

mousePressed()を使って再稼働させる事ができました。 ご回答ありがとうございました。
thkana

2021/12/02 00:02

音量が小さくなったら再稼働...ではなかったのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問