Posts Tagged ‘pitch’

Implementando um Detector de Pitch com Processing

Já faz um tempo que havia prometido algum trabalho com áudio mas estava sem tempo/’motivação’ xD. Então vamos lá: Em todo som, existe uma frequencia que possui uma amplitude maior que as outras, ou seja, que se sobressai. É a chamada frequencia fundamental ou Pitch. O objetivo da implementação aqui descrita é detectar que frequencia é essa. Vamos lá:

Primeiro criamos uma classe que contem as notas e um método que verifica se uma frequencia passada é uma das notas ou não.

Ok. Feito isso, vamos à implementação dos outros métodos:

Imports/Variáveis:

import ddf.minim.*;
import ddf.minim.analysis.*;

Minim minim;
AudioInput in;
FFT fft;
SoundIdentify si = new SoundIdentify();

Método drawLines():

void drawLines() {

for (int i = 0; i < 12; i ++) {
line( 50, 50 + 50 * i, 350, 50 + 50 * i);
fill(0, 102, 153);
switch(i) {

case 0:
text("Lá", 370, 50 + 50 * i);
break;
case 1:
text("Lá #", 370, 50 + 50 * i);
break;
case 2:
text("Si", 370, 50 + 50 * i);
break;
case 3:
text("Dó", 370, 50 + 50 * i);
break;
case 4:
text("Dó #", 370, 50 + 50 * i);
break;
case 5:
text("Ré", 370, 50 + 50 * i);
break;
case 6:
text("Ré #", 370, 50 + 50 * i);
break;
case 7:
text("Mi", 370, 50 + 50 * i);
break;
case 8:
text("Fá", 370, 50 + 50 * i);
break;
case 9:
text("Fá #", 370, 50 + 50 * i);
break;
case 10:
text("Sol", 370, 50 + 50 * i);
break;
case 11:
text("Sol #", 370, 50 + 50 * i);
break;

}
}
}

Método drawCircle():

void drawCircle(int index) {

if (index != -1) {
ellipse(200, 50 + 50 * index, 30, 30);
}
}

setup():

void setup(){

size(500, 650, P2D);
minim = new Minim(this);
minim.debugOn();
in = minim.getLineIn(Minim.STEREO, 1024);
fft = new FFT(in.bufferSize(), in.sampleRate());
background(255);
stroke(0);

line(50, height/2, width-50, height/2);
int i = 1;

frameRate(60);

}

stop():

void stop() {

in.close();
minim.stop();
super.stop();

}

e, por fim, o método draw():

void draw() {

background(255);
drawLines();
fft.forward(in.mix);
float maiorFreq = 0;
float maior = 0;
int index = 0;

for (int i = 0; i maior) {
maior = maiorFreq;
index = i;
}

}

fill(255, 0, 0);
drawCircle(si.checkNotas(fft.indexToFreq(index)));

}

O resultado:

Anúncios