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

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

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

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

Q&A

解決済

2回答

1110閲覧

Processing スペクトログラムについて

taki_rentaro

総合スコア6

Processing

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

0グッド

0クリップ

投稿2022/02/21 23:21

実現したいこと

下記動画のように音楽の周波数をグラフにあてはめ可視化したものを作りたい
https://www.youtube.com/watch?v=mK4W_j4TfY4

わからないこと

下記サイトを参考にスペクトラム幅を保管する所まで完成した

下記サイトの 「3.1 基本的なサンプルプログラム」の棒グラフ描画では i < specSize; なっているがその場合想定より短いグラフとなるので、画面両端までグラフを伸ばしたい為 i < 1280;で作りたい

http://macromarionette.com/computergraphics/cg9.html

Processing

1PImage img; 2 3// 外部ライブラリ定義 4import ddf.minim.*; 5import ddf.minim.analysis.*; 6import ddf.minim.effects.*; 7import ddf.minim.signals.*; 8import ddf.minim.spi.*; 9import ddf.minim.ugens.*; 10 11AudioPlayer player; // 音楽ファイルを入れ るための変数 12AudioInput in; // オーディオ入力の変数 13FFT fft; // フーリエ変換用変数 14 15void setup(){ 16 size(1280,720); 17 img = loadImage("high-frequency-2_4_orig.jpg"); // 画像読み込み 18 img.resize(1280,720); // 画像リサイズ 19 surface.setLocation(1280,10); // 実行結果ウィンドウ位置指定 20 Minim minim = new Minim(this); // Minimクラスのインスタンスを生成 21 22 in = minim.getLineIn(Minim.STEREO, 512); // ステレオオーディオ入力を取得します 23 fft = new FFT(in.bufferSize(), in.sampleRate()); // ステレオオーディオ入力を FFT と関連づけます 24 25 player = minim.loadFile("schala's-theme-with-reimu-wonderland.mp3"); // 再生ファイル 26 27 player.printControls(); 28 player.setGain(-20); // ボリューム設定 29 player.play(); // 読み込んだ音楽ファイルの再生 30 31} 32 33void draw(){ 34 fft.forward(in.mix); // FFT 実行 35 int specSize = fft.specSize(); // FFTのスペクトラムの幅を変数に保管します 36 fft.getBand(0); // 指定した周波数帯の音量を取り出す 37 38 39 //棒グラフを描画しますから再開 http://macromarionette.com/computergraphics/cg9.html 40 41 // 背景 42 background(255,255,255); 43 image(img,0,0); 44 45 // 型枠 46 noStroke(); 47 fill(#000000,120); // 図形色指定&透明度 48 rect(0,0,1280,40); // 上図形 49 rect(0,680,1280,720); // 下図形 50 51 fill(#25BDF2,175); // Hzグラフカラー 52 53 for(int i = 0; i < 1280; i+=6){ // Hzグラフ 54 rect(3 + i,(height/2)+60,3,12,4); 55 } 56 57 //textFont(); 58 textSize(26); 59 60 fill(#56D1BF); // song_name_color 61 text("Schala's theme with Reimu Wonderland",10,460); // song_name 62 63 //fill(#56D1BF); // artist_name_color 64 text("3ARTh",10,490); // artist_name 65}

使用しているファイルおよびプログラムを外部アップローダーに上げているので御利用ください
pass : asdf

https://4.gigafile.nu/0301-d91e423b5fea5c97ba933e74f7e2117ac

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

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

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

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

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

guest

回答2

0

下記サイトの 「3.1 基本的なサンプルプログラム」の棒グラフ描画では i < specSize; なっているがその場合想定より短いグラフとなるので、画面両端までグラフを伸ばしたい為 i < 1280;で作りたい

この部分のことですよね?

Processing

1 // FFTのスペクトラムの幅を変数に保管します 2 int specSize = fft.specSize(); 3 4 // 棒グラフを描画します 5 for (int i = 0; i < specSize; i++) 6 { 7 // x をスペクトラム幅に応じた位置として取得します 8 float x = map(i, 0, specSize, 0, width); 9 10 // fft.getBand(i) で、個別のスペクトラムの値を取得し、 11 // 取得した値に応じた線を描きます。 12 line(x, height, x, height - fft.getBand(i) * 8); 13 }

float x = map(i, 0, specSize, 0, width);のところで、すでに画面幅に調整しています。
記事に詳しく説明を書いてくれているので、ちゃんと読んでください。

「短いグラフ」というのがよくわかりませんが、高音域が間延びしてしまうということであれば↓とかでしょうか?(200に特に根拠はありません^^;

Processing

1 for (int i = 0; i < specSize - 200; i++) { 2 float x = map(i, 0, specSize - 200, 0, width); 3 line(x, height, x, height - fft.getBand(i) * 8); 4 }

投稿2022/02/22 13:13

編集2023/08/15 10:49
TN8001

総合スコア9244

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

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

0

ベストアンサー

なにをするにしても、FFTとはなにかざっくりとした原理は理解しておきましょう。

FFTの分解能はnew FFT(in.bufferSize(), in.sampleRate())のbufferSizeつまりin = minim.getLineIn(Minim.STEREO, 512);の第2パラメータの半分(minimだとspecSizeは半分に1を足した値になるみたいだけど何でだろう?)で、かつbufferSizeは2のべき乗(2,4,8,...256,512,1024,...)にするべきです。

iというのがウインドウ幅のつもななら、周波数の分割数を画面の都合で勝手に設定することはできません。
矩形(rect)で描くつもりなら、ウインドウ幅widthのうちにspecSize個の矩形を描くわけですから、iは0からspecSize-1までのループとして、rect(i*width/specSize, y , width/specSize, fft.getBand(i)*8);のように幅をもたせて描くべきでしょう。

ところで、そのプログラムだとファイルから再生している音ではなくPCのLine入力をFFTすることになるのですが、それでよいのですか?

投稿2022/02/22 12:22

thkana

総合スコア7610

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問