openFrameworksのofxBeatアドオンを使ってみる
openFrameworksのofxBeatアドオンを使うことで,キック,スネア,ハイハットの認識と高速フーリエ変換が簡単にできる.
ofxBeatは以下から入手する.使い方も書いてある. darrenmothersele/ofxBeat
それを使って,簡単なビジュアライザーを作ってみた.上は左からキック,スネア,ハイハット.下はFFT.
ビートの認識はそこまで正確ではないけと,キックとハイハットは割と区別される.スネアはキックとハイハットのどちらの音にも反応する.でも普通にFFTだけを使うよりも面白いものが作れそうな気がする.
キック,スネア,ハイハットの認識は音量の変化と周波数を見てるのかな?
以下,コード.
main.cpp
#include "ofMain.h"
#include "ofApp.h"
//========================================================================
int main( ){
ofSetupOpenGL(800,700,OF_WINDOW); // <-------- setup the GL context
// this kicks off the running of my app
// can be OF_WINDOW or OF_FULLSCREEN
// pass in width and height too:
ofRunApp(new ofApp());
}
ofApp.h
#pragma once
#include "ofMain.h"
#include "ofxBeat.h"
class ofApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void mouseEntered(int x, int y);
void mouseExited(int x, int y);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
ofxBeat beat;
void audioReceived(float*, int, int);
};
ofApp.cpp
#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup(){
ofBackground(30);
ofEnableSmoothing();
ofSetCircleResolution(64);
ofSoundStreamSetup(0, 1, this, 44100, beat.getBufferSize(), 4);
}
//--------------------------------------------------------------
void ofApp::update(){
beat.update(ofGetElapsedTimeMillis());
}
//--------------------------------------------------------------
void ofApp::draw(){
ofSetColor(0, 139, 139);
float kick = beat.kick();
float kickRadious = ofMap(kick, 0, 1, 0, 100);
ofDrawCircle(150, 200, kickRadious);
ofDrawBitmapString("kick", 150 - 20, 50);
float snare = beat.snare();
float snareRadious = ofMap(snare, 0, 1, 0, 100);
ofDrawCircle(400, 200, snareRadious);
ofDrawBitmapString("snare", 400 - 20, 50);
float hihat = beat.hihat();
float hihatRadious = ofMap(hihat, 0, 1, 0, 100);
ofDrawCircle(650, 200, hihatRadious);
ofDrawBitmapString("hihat", 650 - 20, 50);
ofDrawBitmapString("fft", 100, 330);
for(int i = 0; i < 32; i++){
float band = beat.getBand(i);
float height = band * 100 < 300 ? band * 100: 300;
ofDrawRectangle(80 + i * 20, 650 - height, 20, height);
}
}
void ofApp::audioReceived(float * input, int bufferSize, int nChannels){
beat.audioReceived(input, bufferSize, nChannels);
}
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
}
//--------------------------------------------------------------
void ofApp::keyReleased(int key){
}
//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){
}
//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mouseEntered(int x, int y){
}
//--------------------------------------------------------------
void ofApp::mouseExited(int x, int y){
}
//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){
}
//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg){
}
//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){
}
openFrameworks/beatDetector at master · aa-debdeb/openFrameworks