Post date: May 13, 2013 1:26:45 PM
フィルターというよりエフェクト?
Minimでは、音にいろいろなフィルターをかけて加工することができる。
例えばローパスフィルターとは、音のうち高い周波数の部分を逓減させたりすることができる。
ここで、今回、例えば曲のうち、ボーカルの声のみ抽出しようと考えた。そのようなフィルタは存在しないため、新しく作る必要がある。
Minimで新しくフィルターを作成するにはAudioEffectクラスを継承すれば良い。
オーバーライドするべきメソッドはvoid process(float samp[])とvoid process(float left[],float right[])の2つのみである。
今回は、ある周波数(highとlow)の間のみ残して、残りの周波数を0にするフィルタを作ってみた。
これもどこからかとってきたプログラムを魔改造したものである。(上の2行のコメントはその名残り)
/* OpenProcessing Tweak of *@*http://www.openprocessing.org/sketch/45145*@* */
/* !do not delete the line above, required for linking your tweak if you re-upload */
import ddf.minim.*;
import ddf.minim.effects.*;
Minim minim;
AudioPlayer song;
TestEffect test;
void setup()
{
size(512, 512, P3D);
minim = new Minim(this);
song = minim.loadFile("1.mp3");
song.play();
song.loop();
test = new TestEffect();
song.addEffect(test);//フィルタ適用?
test.setFFT(new FFT(song.bufferSize(), song.sampleRate()));
}
void draw()
{
background(0);
stroke(255);
//波形の表示
for (int i = 0; i < test.fft.specSize(); i++)
{
line( i, height/2, i, height/2 - test.fft.getBand(i)*10 );
}
//周波数の表示
stroke(0, 0, 255);
for (int i = 0; i < song.left.size()-1; i++)
{
line(i, height/2 + song.mix.get(i)*100, i+1, height/2 + song.mix.get(i+1)*100); //左の音声の波形を画面上に描く
}
}
void mouseDragged()
{
test.setBand(mouseX, mouseX+mouseY/3);
}
void stop()
{
// the AudioPlayer you got from Minim.loadFile()
song.close();
minim.stop();
super.stop();
}
class TestEffect implements AudioEffect
{
FFT fft;
int high, low;//high~lowの周波数を残し、残り全部の周波数を0にする。
void setFFT(FFT fft) {
this.fft=fft;
}
void process(float[] samp)
{
//引数のsampは波の形が入れられる。
//今回は一旦FFTして周波数の集計の形に変更して、
//周波数ごとに処理を行い、
//再びFFTの逆変換を行なっている。
fft.forward(samp);
for (int i=0;i<(int)min(low,fft.specSize());i++) {
fft.setBand(i, 0);
}
for (int i=(int)max(high,0);i<fft.specSize();i++) {
fft.setBand(i, 0);
}
fft.inverse(samp);
}
void setBand(int low, int high) {
this.low=low;
this.high=high;
}
void process(float[] left, float[] right){
process(left);
process(right);
}
}
このプログラムを起動してみればわかるが、highとlowの差が小さくすると特に、ノイズがぶつぶつと走ってしまう。
多分、FFT→FFT逆変換を行うと、元の波形情報が欠落してしまうのが原因ではないかと推測する。