2011-12-20 5 views
1

임의의 자연 메모를 표시하고 사용자가 기타에서 해당 메모를 재생할 때까지 기다리는 프로그램을 작성하고 있습니다. 오디오 입력은 올바른 피치가 연주되었는지 확인하기 위해 처리되고, 그렇다면 다음 음표가 표시되고 사용자의 점수가 업데이트됩니다. 아이디어는 기본적인 기타 음을 가르치는 것입니다.Qt4 및 SFML 피치 인식 및 처리

음성 처리에는 SFML을, GUI에는 QT4를 사용하려고합니다. 관련 QObject 및 SFML 클래스에서 파생 된 위젯을 갖습니다.

질문 : SFML을 사용하여 마이크 입력의 피치를 어떻게 감지합니까? 단순히 입력의 일부를 sf :: sound 객체에 저장하고 getPitch() 메소드라고 부를 수 있습니까?

+0

qt4 태그를 삭제했습니다. 관련 질문이 없습니다. –

답변

0

은, SFML가 내장 피치를 검출하기위한 어떤 알고리즘이없는 감사를 LBG에 올바른 방향으로 작업하는 내 마음을 얻기 위해.. SFML은 소리를 녹음하고 버퍼에 저장하는 데 필요한 도구 만 제공합니다.

주파수에 대한 버퍼를 평가하기 위해 고속 푸리에 변환을 사용할 수 있다는 것을 알게되었습니다. 이 주파수는 피치 임계 값과 함께 알려진 피치 주파수 목록과 비교할 수 있습니다.

SFML에는 fft 알고리즘이 내장되어 있지 않지만 사운드 버퍼를 확보하는 데 필요한 도구가 있습니다. 나는 이것이 일을하는 가장 교차 플랫폼 방식인지 확인하고 확인해야 할 것입니다.

1

입력의 일부를 sf :: sound 객체에 저장하고 getPitch() 메소드를 호출 할 수 있습니까? sf::SoundSource에서

GetPitch()SetPitch(pitch) 또는 TEH 기본 1.0f에 사용 된 값을 반환합니다. 사운드를 편집하는 것이지 정보를 얻는 것이 아닙니다. 사운드 샘플의 배열을 가져 와서 어떤 종류의 알고리즘으로 처리하는 것이 유일한 방법이라고 생각합니다. 당신은 그것으로이 배열을 얻을 수 있습니다 : 그것은 밝혀으로

sf::SoundBufferRecorder recorder; 
recorder.Start(); 
// ... 
recorder.Stop(); 
const sf::SoundBuffer& buffer = recorder.GetBuffer(); 

size_t   sample_count  = buffer.GetSamplesCount(); 
const sf::Int16* samples   = buffer.GetSamples(); 
unsigned int  samples_per_second = buffer.GetSampleRate(); 
+0

입력 해 주셔서 감사합니다. 사운드 버퍼의 FFT에 대한 간접적 인 결과가 나왔습니다. – Adam