2011-12-20 2 views
1

Я пишу программу, которая отображает случайную естественную ноту и ждет, когда пользователь сыграет эту ноту на гитаре. Аудиовход обрабатывается, чтобы увидеть, был ли воспроизводится правильный тональный сигнал, и, если это было, отображается следующая нота и обновляется счет пользователя. Идея состоит в том, чтобы преподавать основные ноты гитары.распознавание и обработка тональности Qt4 и SFML

Я намерен использовать SFML для обработки звука и QT4 для gui. У меня будет виджет, полученный из соответствующих классов QObject и SFML.

Вопрос: Как определить шаг ввода микрофона с использованием SFML? Можно ли просто сохранить часть входа в объекте sf :: sound и вызвать метод getPitch()?

+0

Я удалил тег qt4, поскольку вопрос не связан с ним –

ответ

0

Как выясняется, SFML не имеет какие-либо алгоритмов для обнаружения шага, построенный в Благодаря Lbg для получения моего ума работает в правильном направлении.. SFML предоставляет только инструменты, необходимые для записи звуков и хранения их в буфере.

Я выяснил, что могу использовать быстрое преобразование Фурье для оценки буфера для частоты. Затем эту частоту можно сравнить со списком известных частот основного тона вместе с порогом тангажа.

Хотя SFML не имеет встроенного алгоритма fft, у него есть инструменты, необходимые для получения звукового буфера. Мне нужно будет проверить и посмотреть, является ли это самым кросс-платформенным способом ведения дел.

1

Возможно ли просто сохранить часть входа в объекте sf :: sound и вызвать метод getPitch()?

GetPitch() из sf::SoundSource возвращает значение, которое используется на 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

Спасибо за ввод; Я узнал о БПФ на звуковых буферах как косвенный результат этого. – Adam

Смежные вопросы