0

この問題について、私は調査を行いましたが、正しい用語を検索しているかどうかわかりませんか?多分誰かが助けることができます...

私は基本的にサウンドビジュアライザーであるopenframeworksでアプリを書いています。私がやろうとしているのは、プログラムに特定のポイントで長方形を作成して描画させることです。その高さは、長方形の作成時のオーディオ入力の周波数によって決まります。次に、プログラムにその横に別の長方形を描画させます。その高さは、その瞬間の頻度などによって決まります。(これを毎回左にパンすることも計画しているので、非常に長い長方形のチェーンが作成されます)。長方形は建物のように見えるので(都市の景観を描く)、位置や高さなどの非常に単純な属性を持つクラスを作成しました。主な作業(間違っている場合は修正してください)は次のとおりです。アプリケーションの主要部分になります。私が抱えている問題は、オブジェクトの描画と、その高さが周波数に対応することです。また、作成した長方形の高さを変更したくないので、正しく設定するのに問題があります。今のところ、サウンド入力で上下にちらつく大きな長方形を1つだけ作成できました。毎秒正しい属性を持つオブジェクトをベクトルに追加し、オブジェクトのプロパティのそのインスタンスを静的に保つ方法が完全にはわかりません。正しい質問をしているのかどうかはわかりませんが、誰かが助けてくれるかもしれません。サウンド入力で上下にちらつく大きな長方形を1つだけ作成できました。毎秒正しい属性を持つオブジェクトをベクトルに追加し、オブジェクトのプロパティのそのインスタンスを静的に保つ方法が完全にはわかりません。正しい質問をしているのかどうかはわかりませんが、誰かが助けてくれるかもしれません。サウンド入力で上下にちらつく大きな長方形を1つだけ作成できました。毎秒正しい属性を持つオブジェクトをベクトルに追加し、オブジェクトのプロパティのそのインスタンスを静的に保つ方法が完全にはわかりません。正しい質問をしているのかどうかはわかりませんが、誰かが助けてくれるかもしれません。

アプリコードのトップレベルは次のとおりです。

#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup(){

    ofSetFrameRate(60);
    ofBackground(0,30,60);

    //sound stream setup and such
    ofSoundStreamSetup(0,2,this, 44100, BUFFER_SIZE, 4);
    left = new float[BUFFER_SIZE];
    right = new float[BUFFER_SIZE];

    FFTanalyzer.setup(44100, BUFFER_SIZE/2, 1);
    FFTanalyzer.peakHoldTime = 15; // hold longer
    FFTanalyzer.peakDecayRate = 0.95f; // decay slower
    FFTanalyzer.linearEQIntercept = 0.9f; // reduced gain at lowest frequency
    FFTanalyzer.linearEQSlope = 0.01f; // increasing gain at higher frequencies
    numOctaves=1;


    //control panel setup
    panel.setup("control", 770, 0, 300, 150);
    panel.addPanel("fft settings", 1, false);
    panel.setWhichPanel("fft settings");
    panel.addSlider("Number of Sub Octaves","NUM_OCT",  1, 1,12, false);

    //set up buildings
    for (int i = 0; i <  bldgs.size() ; i+= 20){

    }

}

//--------------------------------------------------------------
void testApp::update(){
    panel.update();
    if(numOctaves != panel.getValueI("NUM_OCT")){
        numOctaves = panel.getValueI("NUM_OCT");
        panel.setValueI("NUM_OCT", numOctaves,0);
        FFTanalyzer.setup(44100, BUFFER_SIZE/2, numOctaves);
    }



}

//--------------------------------------------------------------
void testApp::draw(){

    panel.draw();
    static int index=0;
    float avg_power = 0.0f;

    /* do the FFT   */
    myfft.powerSpectrum(0,(int)BUFFER_SIZE/2, left,BUFFER_SIZE,&magnitude[0],&phase[0],&power[0],&avg_power);


    for (int i = 0; i < (int)(BUFFER_SIZE/2); i++){
        freq[i] = magnitude[i];
    }
    FFTanalyzer.calculate(freq);
    float binDrawWidth = (ofGetWidth()-20)/FFTanalyzer.nAverages;



//float bldgHeighTemp;
for (int i = 0; i <  1000 ; i+=30){
    for (int f = 0; f < (int)(BUFFER_SIZE/2); f++){
        bldg temp;

        freqs[i] = freq[f]*-6;
        temp.bldgPosX = i;
        temp.bldgPosY = ofGetHeight()/2;
        temp.bldgWidth = 30;
        temp.bldgHeight = freqs[i];
        temp.draw();

        bldgs.push_back(temp);
    }
}






}

//--------------------------------------------------------------
void testApp::keyPressed(int key){

}

//--------------------------------------------------------------
void testApp::keyReleased(int key){

}

//--------------------------------------------------------------
void testApp::mouseMoved(int x, int y ){

}

//--------------------------------------------------------------
void testApp::mouseDragged(int x, int y, int button){
    panel.mouseDragged(x,y,button);
}

//--------------------------------------------------------------
void testApp::mousePressed(int x, int y, int button){
    panel.mousePressed(x,y,button);
}

//--------------------------------------------------------------
void testApp::mouseReleased(int x, int y, int button){
    panel.mouseReleased();
}

//--------------------------------------------------------------
void testApp::windowResized(int w, int h){

}
//--------------------------------------------------------------
void testApp::audioReceived     (float * input, int bufferSize, int nChannels){
    // samples are "interleaved"
    for (int i = 0; i < bufferSize; i++){
        left[i] = input[i*2];
        right[i] = input[i*2+1];
    }
}

[編集]testapp.h

#ifndef _TEST_APP
#define _TEST_APP


#include "ofMain.h"
#include "fft.h"
#include "FFTOctaveAnalyzer.h"
#include "ofxControlPanel.h"
#include "bldg.h"

#define BUFFER_SIZE 512

class testApp : 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 windowResized(int w, int h);

        void audioReceived  (float * input, int bufferSize, int nChannels);

        ofxControlPanel  panel;
        int numOctaves;


        FFTOctaveAnalyzer FFTanalyzer;

        float * left;
        float * right;
        int     bufferCounter;
        fft     myfft;

        float magnitude[BUFFER_SIZE];
        float phase[BUFFER_SIZE];
        float power[BUFFER_SIZE];
        float freq[BUFFER_SIZE/2];

        vector <float> freqs;
        vector <bldg> bldgs;
};

#endif

動作していないのは、オブジェクトの単一のインスタンスを作成していないか、各インスタンスの属性が頻度に応じて絶えず変化していることです。これは、私が達成しようとしている動作ではありません。私が欲しいのは、各オブジェクトを特定の高さで作成し、その状態を維持してから、その隣に新しいオブジェクトを作成するなど、毎秒などです。

意味がありますか?私はまだ正しい質問をする方法を見つけようとしています。ありがとう、ブリー

4

1 に答える 1

0

あなたの問題を理解している限り、これを行う必要があります。おそらくこれが役立ちます:

bldgsベクトルにポインターを格納してみてください

vector<bldg*> bldgs;

新しいオブジェクトをそれに追加します

    bldg* temp;

    freqs[i] = freq[f]*-6;
    temp->bldgPosX = i;
    temp->bldgPosY = ofGetHeight()/2;
    temp->bldgWidth = 30;
    temp->bldgHeight = freqs[i];

    bldgs.push_back(temp);

ここから draw メソッドを削除し、bldgすべてのフレームですべてを描画します。これを draw メソッドに追加します。

for(int i = 0; i < bldgs.size(); i++)
{
    bldgs[i]->draw();
}

draw に直接関係しないものはすべて移動して、testApp の update メソッドに入れることをお勧めします。たとえば、作成を移動し、ベクターのものを更新メソッドに入力します。

于 2011-08-15T13:29:27.923 に答える