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

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

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

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

Q&A

解決済

1回答

757閲覧

Processing FFT 差分の取り方について

taki_rentaro

総合スコア6

Processing

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

1グッド

0クリップ

投稿2022/03/10 14:17

編集2022/03/10 14:23

起こっていること

音の可視化する事は出来たが、グラフの長短が極端になってしまっている

実現したいこと

なめらかに動かすために現在のgetBandで得られた音量と直前2フレームのgetBandで得られた音量の平均をグラフで描画したい

PImage img; // Minimライブラリ読み込み import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; import ddf.minim.signals.*; import ddf.minim.spi.*; import ddf.minim.ugens.*; AudioPlayer player; // 音楽ファイルを入れるための変数 AudioInput in; // オーディオ入力の変数 FFT fft; // フーリエ変換用変数 void setup(){ size(1280,720); img = loadImage("high-frequency-2_4_orig.jpg"); // 画像読み込み img.resize(1280,720); // 画像リサイズ surface.setLocation(1280,10); // 実行結果ウィンドウ位置指定 Minim minim = new Minim(this); // Minimクラスのインスタンスを生成 player = minim.loadFile("schala's-theme-with-reimu-wonderland.mp3"); // 再生ファイル //読み込んだ曲の音声をFFTと結びつける fft = new FFT(player.bufferSize(), player.sampleRate()); player.printControls(); player.setGain(-15); // ボリューム設定 player.play(); // 読み込んだ音楽ファイルの再生 } void draw(){ fft.forward(player.mix); //FFTの実行部も曲ファイルの音データに int specSize = fft.specSize(); // FFTのスペクトラムの幅を変数に保管します // 背景 background(255,255,255); image(img,0,0); // 型枠 noStroke(); fill(#000000,120); // 図形色指定&透明度 rect(0,0,1280,40); // 上図形 rect(0,680,1280,720); // 下図形 fill(#25BDF2,175); // Hzグラフカラー for(int i = 0, j = 0; i < 1275 ; i+=6, j++){ rect(3 + i,(height/2)+60,3,-8 + fft.getBand(j)*-5,4); //高さにgetBand(j)の値を使用 } //textFont(); textSize(26); fill(#56D1BF); // song_name_color text("Schala's theme with Reimu Wonderland",10,460); // song_name //fill(#56D1BF); // artist_name_color text("3ARTh",10,490); // artist_name }

以下URLは使用しているデータです
https://55.gigafile.nu/0317-d831afe4d6abaff114ee1e924eecc61b4

FFT関連で差分を得る事に触れている記事が無かったので質問させていただきました。
お願いいたします。

TN8001👍を押しています

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

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

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

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

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

TN8001

2022/03/10 14:38

いつも質問をするときに前の質問をベストアンサーしておられます。 その間一切確認していないわけじゃないんですよね? 回答を確認して解決したなら、その際にベストアンサーしてください。 うまくいかないあるいは回答に疑問があれば、コメントするなりしてください。 「閉じないで複数質問をすると突っ込まれるからとりあえずBAしておこう」のように感じます。 あまりに不誠実な対応が続くと、回答する気が失せます。 [ヘルプ / 質問する時のヒント](https://teratail.com/help/question-tips#questionTips41)
taki_rentaro

2022/03/10 19:50

失礼致しました。気を付けます。
guest

回答1

0

ベストアンサー

なめらかに動かすために現在のgetBandで得られた音量と直前2フレームのgetBandで得られた音量の平均をグラフで描画したい

配列かなんかに保存しておけばいいのでは?そんなに難しいことはないですよね?

あるいは最大値バー(なんていうんでしょうか?^^;)のような(上りは早く下がるのはゆっくり)実装もありかもしれません。

Processing

1import ddf.minim.*; 2import ddf.minim.analysis.*; 3 4Minim minim; 5AudioPlayer player; 6FFT fft; 7float[] spectrum1; 8float[] spectrum2; 9float[] spectrum; 10 11void setup() { 12 size(1280, 720); 13 14 minim = new Minim(this); 15 player = minim.loadFile("schala's-theme-with-reimu-wonderland.mp3"); 16 player.printControls(); 17 player.setGain(-15); 18 fft = new FFT(player.bufferSize(), player.sampleRate()); 19 20 spectrum1 = new float[fft.specSize()]; 21 spectrum2 = new float[fft.specSize()]; 22 spectrum = new float[fft.specSize()]; 23 24 player.play(); 25} 26 27void draw() { 28 background(255); 29 noStroke(); 30 31 fft.forward(player.mix); 32 33 // オリジナル(青) 34 fill(#25BDF2, 175); 35 for (int i = 0, j = 0; i < 1275; i+=6, j++) { 36 rect(3 + i, (height/2)+60, 3, -8 + fft.getBand(j)*-5, 4); 37 } 38 39 // 直近3つの平均(赤) 40 fill(#ff0000, 175); 41 int specSize = fft.specSize() - 300; // 513 - 300 = 213 42 for (int i = 0; i < specSize; i++) { 43 float x = map(i, 0, specSize, 3, width - 3); 44 float s = (spectrum1[i] + spectrum2[i] + fft.getBand(i)) / 3; 45 rect(x, height*0.3, 3, -8 + s * -5, 4); 46 spectrum1[i] = spectrum2[i]; 47 spectrum2[i] = fft.getBand(i); 48 } 49 50 // 最大からゆっくり目で下がる(緑) 51 fill(#00ff00, 175); 52 for (int i = 0; i < specSize; i++) { 53 float x = map(i, 0, specSize, 3, width - 3); 54 if (spectrum[i] < fft.getBand(i)) spectrum[i] = fft.getBand(i); 55 rect(x, height*0.85, 3, -8 + spectrum[i] * -5, 4); 56 spectrum[i] *= 0.95; 57 } 58}

結局音楽プレイヤーで出るのと同じようなものが欲しいということでしょうか?
java - How to filter FFT data (for audio visualisation)? - Stack Overflow

投稿2022/03/12 10:40

TN8001

総合スコア9321

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

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

taki_rentaro

2022/03/14 19:06 編集

回答ありがとうございます。 はい、音楽プレイヤーのような物を作りたいと考えていました。 楽曲によって特定の周波数帯に音が溜まって動きがなくなってしまうので、今回は赤のグラフを利用したいと思います。 加えて質問になってしまうのですが、使用する楽曲の殆どで低音の音量が強く出ています。 人の耳の特性上高い音の方が聞き取りやすい為、自然な表現にする為一定以上の音量を超えるとグラフの伸びに減衰を掛けたいなと思いました。この場合はどのように記述するべきなのでしょうか?
TN8001

2023/12/26 17:02 編集

> 加えて質問になってしまうのですが、使用する楽曲の殆どで低音の音量が強く出ています。 > 人の耳の特性上高い音の方が聞き取りやすい為、自然な表現にする為一定以上の音量を超えるとグラフの伸びに減衰を掛けたいなと思いました。この場合はどのように記述するべきなのでしょうか? 雰囲気でいいなら適当に対数をとるなりでいいんじゃないですかね? もうちょっとちゃんとやるなら、デシベル(dB)に変換するのがいいと思います。 回答のリンクや↓でlog10がなんちゃらってやってるところです(わたしはよくわかりません^^; [BGMの周波数を分析する(minim編) | 自己啓発。人生について考える](https://web.archive.org/web/20230815192228/https://mslabo.sakura.ne.jp/WordPress/make/processing%E3%80%80%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/bgm%E3%81%AE%E5%91%A8%E6%B3%A2%E6%95%B0%E3%82%92%E5%88%86%E6%9E%90%E3%81%99%E3%82%8B%EF%BC%88minim%E7%B7%A8%EF%BC%89/) logAveragesやWindowFunctionなんかも、ちょっとは効果があるかもしれません。
taki_rentaro

2022/03/18 23:50

ありがとうございます。 試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問