FMOD Spectrum auslesen



  • Guten Abend alle zusammen,

    bin gerade dabei ein kleines Spiel zu proggen, welches die Landschaft abhängig von der Musik generiert die eingespielt wird.

    Nun stehe ich aber vor einem kleinen Problem. Das Audio-Spectrum welches ich auslese, wird recht komisch angezeigt, und ich weiß nicht so recht wieso.

    ein teil meines Codes sieht wie folgt aus:

    #define SPECLEN 256
    
    // Zwei 2D Vektoren die das Spectrum abbekommen werden
    vector <vector <float> > freqL;
    vector <vector <float> > freqR;
    
    // System Sound und Co ( schon alles eingerichtet )
    System *system;
    Sound *sound;
    Channel *channel;
    
    // länge des Songs (bereits bestimmt)
    unsigned int len;
    
    using namespace FMOD;
    void readFreqs() {
    
            float *L = NULL,*R = NULL;
    
            // reserviert speicher
            L = (float*) malloc (SPECLEN*sizeof(float));
            R = (float*) malloc (SPECLEN*sizeof(float));
            int k = 0;
            channel->setPaused(false);
    
            // soll im 100ms Abstand das volle Spectrum abtasten
            for (unsigned int x = 0; x <= len; x+=100) {
    
                    // setzt Position
                    channel->setPosition(x, FMOD_TIMEUNIT_MS);
                    // nimmt das Spectrum von linken und rechten channel und speichert die in Float Arrays
                    channel->getSpectrum(L, SPECLEN, 0, FMOD_DSP_FFT_WINDOW_BLACKMAN);
                    channel->getSpectrum(R, SPECLEN, 1, FMOD_DSP_FFT_WINDOW_BLACKMAN);
    
                    // schiebt unseren Vector einmal weiter
                    freqL.push_back(vector <float>() );
                    freqR.push_back(vector <float>() );
    
                    // wandelt das Float Array in einen Float Vector um
                    for(int z = 0;z <= SPECLEN;z++){
                            freqR[k].push_back(R[z]);
                            freqL[k].push_back(L[z]);
                    }
                    k++;
            }
    
            // gibt wieder alles frei und setzt alles auf den anfang zurück
            free(L);
            free(R);
            channel->setPaused(true);
            channel->setPosition(0,FMOD_TIMEUNIT_MS);
    }
    

    An sich funktioniert alles, nur irgendwie entsprechen die Spektren nicht denen, des Liedes, bzw wenn ich mir eine der 256 Lines anschaue, dann ist die ganze Line mit nur vllt 3 verschiedenen Werten beschrieben.

    Habt ihr vllt eine andere Idee wie man es lösen kann ? Das Problem liegt darin, dass ich alle Spektren noch vor der Weltgenerierung haben muss.

    Kann es aber auch daran liegen, dass die er bei der Position einfach mal keinen Ton findet ?

    Also ich habe in der Hinsicht wenig Ahnung und würde mich über eure Hilfe freuen.

    mfg
    akoww

    //edit

    Ich muss selber sagen, dass es eine wirklich hässliche Funktion zum auslesen des Spektrums ist, und dazu noch recht ineffektiv.
    Gibt es eine andere Möglichkeit das Spectrum auszulesen, ohne z.B. den Song abzuspielen. Vllt mit einer anderen API ?



  • Naja, da es hier keine Hilfe gab, habe ich mich nun ein wenig umgeschaut. Mit Fmod ist dieses leider nicht möglich, daher greife ich nun auf die BASS Api zurück.

    Dort habe ich die Möglichkeit mit der Erweiterung BASS FX das Abspieltempo zu erhöhen. Wenn man das um den Faktor 50 erhöht kann man mit einer Hilfsfunktion das Spektrum auslesen.

    Leider ist die API etwas komplexer aufgebaut und man muss einiges mehr an Zeit dafür aufbringen, aber das Ergebnis lässt sich dann sehen.

    mfg
    Akoww


Anmelden zum Antworten