Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - Tero

Pages: [1]
1
Audio / FFT à partir d'un sf::SoundBuffer
« le: Octobre 14, 2015, 09:49:01 pm »
Bonsoir !

Je bosse en ce moment sur un petit logiciel audio qui se base sur la librairie audio de la SFML. J'essaye depuis quelques temps d'implémenter le spectre audio à partir du buffer mais sans succès. Je me suis tourné vers la classe FFT d'audacity mais le problème est que pour faire fonctionner l'algo il faut lui passer le buffer sous forme de float* et je ne vois aucun moyen de récupérer un tel tableau à partir du buffer :/

De plus j'ai quelques doutes quand à la taille du buffer à passer à la fonction dans l'exemple sur lequel je me base cette taille était de 256, c'est acceptable ? (l'exemple en question)

Voilà ma classe :

#ifndef SOUNDWAVE_H
#define SOUNDWAVE_H

#include <iostream>
#include <memory>
#include "SFML/Audio.hpp"
#include "FFT.h"

#define BUFFER_SIZE 256
#define NUM_WINDOWS 80

class SoundWave
{
    public:
        SoundWave();
        SoundWave(std::shared_ptr<sf::SoundBuffer> buffer); //!< must be the default ctor
        virtual ~SoundWave();

        void update();
    private:
    /**
           * Initialize the freq array.
           * @see SoundWave()
    */

    void init();

    std::shared_ptr<sf::SoundBuffer> _buffer; //!< audio buffer to work with

    FFT _fft;
    float magnitude[BUFFER_SIZE]; //!< contain the magntiude data from buffer once _fft.powerSpectrum() method is called
    float phase[BUFFER_SIZE]; //!< contain the phase data from buffer once _fft.powerSpectrum() method is called
    float power[BUFFER_SIZE]; //!< contain the power data from buffer once _fft.powerSpectrum() method is called

    float* freq[NUM_WINDOWS][BUFFER_SIZE/2];
    float* freq_phase[NUM_WINDOWS][BUFFER_SIZE/2];
};

#endif // SOUNDWAVE_H
 

#include "../header/SoundWave.h"

SoundWave::SoundWave()
{
    //ctor
}

SoundWave::SoundWave(std::shared_ptr<sf::SoundBuffer> buffer)
{
    _buffer = buffer;
    init();
}

SoundWave::~SoundWave()
{
    //dtor
}

void SoundWave::update()
{
    float avg_power = 0.0f;
    static int index = 0;

    if(index < NUM_WINDOWS)
        index += 1;
    else
        index = 0;

    _fft.powerSpectrum(0,BUFFER_SIZE/2,,BUFFER_SIZE,&magnitude[0],&phase[0],&power[0],&avg_power) //!< manque le buffer ici

    for (j=1; j<BUFFER_SIZE/2; j++)
    {
        freq[index][j] = magnitude[j]; //!< fill the array with corresponding data from the magnitude array
    }
}


void SoundWave::init()
{
    for(int i=0; i < NUM_WINDOWS; i++)
    {
        for(int j=0; j < NUM_WINDOWS; j++)
        {
            freq[i][j] = 0;
        }
    }
}
 


J'ai également vu pas mal de topic sur le même sujet ([1], [2]) et j'ai vu qu'ils utilisaient la structure sf::SoundBuffer::Chunk  sauf que je ne vois aps trop comment l'implémenter.

En clair j'aimerai que depuis mon pointeur vers le buffer je puisse jouer la musique et afficher le spectre !

Et pour pas faire deux topics j'ai une secondes question moins importantes :
Pour seek à un certain moment de la musique, y'a un meilleur moyen que celui-là ? :
m_currentSample = static_cast<std::size_t>(timeOffset.asSeconds() * getSampleRate() * getChannelCount());
Le soucis avec cette méthode c'est qu'il y a un décalage de 1 secondes entre l'appel de la méthode et le changement de sample réel, du coup c'est un peu bizarre..

merci d'avance !

2
Bonsoir,

Pour vous expliquer d'où vient mon problème je vais d'abord vous expliquer les changement récents :
J'avais déjà la sfml (2.2) d'installée, sans soucis avec un vieux compilo (4.7 de gcc je crois) mais voulant utiliser une librairie qui réclamait au moins une version 4.9 pour compiler (SFGUI) j'ai mis à jour mon compilo vers la 5.1.
Jusque là aucun soucis, mon code ne compile plus, normal, mon compilo à changé, ça doit venir de ça.
Dans un premier temps j'ai dl les sources pour les "compiler" avec cmake mais j'ai eu les erreurs suivantes :


J'ai donc laissé de côté pour me tourner vers la version précompilé, 32bit, pour MingW (DW2), et là j'ai la même erreur qu'au moment du changement de compilo :


je dois vous avouer être très nul pour comprendre tout ça, ça fait pourtant plus d'un an que j'utilise la sfml sans soucis :/

Dans le même temps si ça peut aider, voilà les erreurs que j’obtenais quand j'essayais de faire la même manip mais pour SFGUI :


sur openclassroom on m'a conseillé pour cmake de réaliser le bidouillage suivant :
Citer
Généralement mingw32-make n'est qu'une copie "renommée" de make sous windows.

La raison de cette copie est assez obscure, mais, en gros, comme on compile Gcc pour windows avec MSYS( Minimalist System) il fallait absolument veiller à ce que le make d'une installation de Gcc (mingw, en fait) n'aille pas entrer en conflit avec le make de MSYS.

Fut un temps, en tout cas, où cela posait problème ;).  Si une installation correcte de Gcc ne vient qu'avec make et non mingw32-make, cela veut sans doute dire que le problème est résolu ;)

Enfin, si tu éprouves des problèmes de compatibilité au niveau de tes Makefile à cause de ce changement (aussi bienvenu soit-il), il "suffit" rajouter une copie (nommée ming32-make.exe) de make dans le dossier bin.  Cela résoudra tous les problèmes ;)

Mais je n'ai pas bien compris de quel sous dossier bin il parlait (celui de MingW probablement ?) j'ai essayé mais j'ai toujours les mêmes erreurs.

Le fait est que j'ai vraiment besoin de la SFML d'autant plus pour utiliser SFGUI pour un projet d'étude. Je code sous windows 10 mais à l'issu du projet, je recompilerai les sources sous linux (je sent que je vais m'amuser..). Enfin bref, si quelqu'un peut me donner deux trois pistes, je suis preneur, je compte plus les heures passées à chercher des réponses sur google et farfouiller dans les fichiers :)

Pages: [1]
anything