aa develop

開発と成長

openFrameworksのofxBeatアドオンを使ってみる

openFrameworksのofxBeatアドオンを使うことで,キック,スネア,ハイハットの認識と高速フーリエ変換が簡単にできる.

ofxBeatは以下から入手する.使い方も書いてある. darrenmothersele/ofxBeat

それを使って,簡単なビジュアライザーを作ってみた.上は左からキック,スネア,ハイハット.下はFFTbeat_detector

ビートの認識はそこまで正確ではないけと,キックとハイハットは割と区別される.スネアはキックとハイハットのどちらの音にも反応する.でも普通に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