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.


Messages - Tero

Pages: [1] 2 Suivante »
1
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Novembre 17, 2015, 02:10:38 am »
ça fonctionne depuis un petit moment maintenant mais j'ai quelque-fois des erreur au moment de seek le buffer (ça n'arrête pas le programme pour autant) :



ça ressemble à si vous êtes un peu curieux :^)



En ce moment je me penche sur un problème un peu agaçant que le debbuger ne veut pas digérer même avec toutes les options du monde (le call stack est corrompu sans raison). pour résumer le programme plante de façon random à cause de la soudwave. Enfin, pas vraiment, ça plante au bout de 2 minutes ou alors ça ne plantera pas (vérifié plusieurs fois sur +5h à chaque fois).

mon code pour l'update ressemble à ça sachant que BUFFER_SIZE vaut 256
seulement je me suis rendu compte que cette version de FFT (piquée chez audacity) date de 2007 :

(click to show/hide)

J'aimerai adapter mon utilisation de la fonction powerSpectrum à l'implémentation qu'il en est faite aujourd'hui (voir : >ici<

Le sample passe en *In et en *Out je m'attend à recevoir quoi ? J'ai vraiment du mal à bien comprendre ce qu'il renvoit au final. Surtout pour savoir quel taille allouer pour le float* -> *Out histoire de pas faire de bétises.


//la vieille méthode que j'aimerai changer :
avg_power = 0.0f;
    _cSample = static_cast<std::size_t>(c_s.asSeconds() * _sampleRate * _channelCount) - ((int64_t)_bSample -3*50000); //!< -_bSample make it relatively to the Chunk
    //std::cout <<_cSample << std::endl; //there is 3 buffer before the one
    if(_cSample >= 0 && _cSample < 50000)
        _fft.powerSpectrum(0,BUFFER_SIZE/2,&chunkList.front()[_cSample],BUFFER_SIZE,&magnitude[0],&phase[0],&power[0],&avg_power); //!< compute data

Pour info "&chunkList.front()[_cSample]" c'est juste le sample que je souhaite envoyer à la fonction, j'ai dû faire un queue pour stocker 3 chunks, vu qu'il y a un décalage entre le chargement en mémoire et le moment où il est joué.

Je pense très sincèrement que mon plantage vien de là, à trop jouer avec les pointeurs je fais surement des erreurs :/

2
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Novembre 05, 2015, 11:28:33 pm »
Merci beaucoup, je vais essayer d'implémenter ce qui me posait problème en fonction de ça :)

edit : Implémentation sans faites sans aucun soucis !
Je lâcherai le git du projet quand il sera à jour si vous voulez voir le code source.

3
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Novembre 05, 2015, 09:04:22 pm »
du coup ?

4
Audio / Re : Re : FFT à partir d'un sf::SoundBuffer
« le: Novembre 03, 2015, 03:15:45 pm »
Citer
Citer
- Pour préciser ma question, le m_currentSample au moment du OnGetData est t'il le sample actuel relativement au flux en entier ? (et non relativement au chunk)
C'est quoi m_currentSample ?

c'est ça.

5
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Novembre 02, 2015, 11:34:27 pm »
nouvelle méthode..

Pas très concluant cette dernière du coup j'ai réfléchis à autre chose, au lieu de récupérer juste le chunk j'ai fais un observer avec deux méthodes update, une qui met à jour le chunk et le sample rate (vu que j'ai aucune idée de s'il peut varier au cours du temps) et une autre qui est appelée depuis l'interface pour forcer le soundStream à notifier  ma classe soundwave avec le "time elapsed" afin de pouvoir calculer avec précision le sample actuel.

J'ai une petite question vis à vis de ça d’ailleurs, depuis ma classe soundStream custom la fonction getplayingOffset() me donne le temps écoulé depuis le début du fichier audio, mais il n'y a qu'un chunk au mieux dans cette classe, le problème est que je peux calculer le sample auquel le flux est arrivé avec précision mais je n'ai aucun moyen de savoir à quel sample commence le chunk.

J'ai pensé à une solution mais elle me semble un peu tordue et bricolé de nul part.. Si au moment du onGetdata je passais à ma fonction update (pour le chunk et le time elapsed) le sample actuel (sample rate * playingOffset) ça me permettrait de faire le calcul depuis mon autre classe relativement à cette valeur et donc de déterminer la sample jouée dans le chunk précisément.

Du coup pour résumer les questions :

- Le sample rate d'un flux peut-il changé au court du temps (pendant sa lecture) ?
- Pour préciser ma question, le m_currentSample au moment du OnGetData est t'il le sample actuel relativement au flux en entier ? (et non relativement au chunk)

Merci d'avance !

6
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Octobre 19, 2015, 11:45:12 pm »
Re-bonjour !

Après avoir pas mal galéré à avoir implémenter un pattern Observer pour la fonction j'ai enfin réussis à avoir ce que je voulais (enfin je crois)
J'ai bel et bien les données mais le buffer n'est pas toujours (voir jamais) remplit, j'ai un buffer de 256 bytes et les donnée que je récupère occupe entre 150 & 200 bytes le plus souvent, c'est normal ?

J'ai aussi remarqué qu'avec ce procédé je n'appelais ma fonction qu'à chaque changement de chunk, ce qui n'est pas forcément cool vu que les données changes toutes les secondes/demi/secondes, ma sortie va paraître saccadée ?

Y'a-t-il un autre moyen de faire ça mieux ? Une fois le chunk arrivé dans le onGetData j'aimerai bien savoir comment après les données extraites il est lu.. Comment ça se passe concrètement pour passer d'un sample à l'autre, le lire et passer au suivant.
Est-ce que je devrais aussi passer en paramètre le sampleRate et le m_currentsample ? J'essaye de trouver un moyen pour synchroniser la lecture du buffer par ma classe SoundStream et ma classe SoundWave qui ne le lit pas directement mais via le chunk.

Bref, ça fait un peu pavé, je me suis pas très bien exprimé, j'espère que vous avez saisis l'idée, si c'est pas le cas faite le moi savoir, j'essayerai de reformuler ça :)

(click to show/hide)

7
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Octobre 15, 2015, 04:08:29 pm »
Voilà voilà :)

J'ai pas encore eu le temps de tester, je reviens vers vous si ça coince, merci !

void SoundWave::conversionChunk(const sf::Int16* samples, size_t sampleCount)
{
    int sampleC = static_cast<int>(sampleCount);
    _chunkf = new float[sampleC];
    for(int i=0; i< sampleC; i++)
            _chunkf[i] = (float) samples[i] / std::numeric_limits<sf::Int16>::max(); // signed to unsigned
}

8
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Octobre 15, 2015, 03:02:34 pm »
Un truc du genre ?

float* SoundWave::conversionChunk(const sf::Int16* samples, size_t sampleCount)
{
    int sampleC = static_cast<int>(sampleCount);
    float chunkf[sampleC];
    for(int i=0; i< sampleC; i++)
        {
            chunkf[i] = (float) samples[i];
            chunkf[i] = chunkf[i] / pow(2.0,15.0) -1;
        }
    return chunkf;
}

mais ça me fait un petit warning :

/home/tero/Documents/c++Folder/oggMaster/src/SoundWave.cpp:42:11: warning: address of local variable ‘chunkf’ returned [-Wreturn-local-addr]
     float chunkf[sampleC];
           ^

sinon la méthode est bonne, je devrais avoir accès aux données avec ça ?

9
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Octobre 15, 2015, 01:13:02 am »
C'est pas bête du tout ça, je me disais bien que getSampleRate() pouvait m'être utile mais j'avais pas pensé à utiliser getPlayingOffset(), j'essayerais ça !

Pour ce qui est de la fonction fft, je vais essayer de caster le int16* en float*, je sais pas si c'est très légal par contre xD (et puis je ne sais pas non plus si les données sont belles et bien contenu là):

(float*)_stream->getLastChunk().samples

La fonction getLastChunk renvoie le Chunk du OnGetData(Chun& data) de ma classe SoundStream. (qui hérite de la classe sf::SoundStream).

10
Audio / Re : FFT à partir d'un sf::SoundBuffer
« le: Octobre 14, 2015, 11:39:32 pm »
Pour le setPlayingOffset(), un gros merci, je sais pas comment j'ai fais pour la raté en lisant la doc Oo, merci !

Par contre pour ce qui est du fft j'aimerai vraiment avoir un seul objet à gérer, mon buffer pour être synchro entre ce qui est joué et le spectre, histoire que ce soit cohérent.  J'aimerai juste réussir à faire le lien entre les données contenues dans les samples via la méthode :
const Int16* sf::SoundBuffer::GetSamples        ()  const
Je cherche juste à savoir comment extraire les donnée de chaque sample pour les envoyer à la fonction powerSpectrum de la class fft d'audacity pour le coup.

A vrai dire ça fait depuis début septembre que je cherche une solution et celle de se servir de la classe FFT d'audacity semble la plus simple à mettre en oeuvre !

Après le coup d'envoyer les chunk de données ça peut marcher mais en 2012 la sfml ne donnait aucun moyen de savoir à quel moment tel ou tel sample allait être joué. Du coup il n'y pas de synchronisation..
src : http://en.sfml-dev.org/forums/index.php?topic=7642.0

et en 2014 : http://en.sfml-dev.org/forums/index.php?topic=14815.0
Toujours ce même problème. Je me demande donc s'il y a aujourd'hui un moyen quelconque de visualiser un flux audio tout pendant qu'il est joué en synchronisation.

Si il n'y a vraiment pas moyen de faire quelque-chose simplement j'abandonnerai l'idée pour le moment, ce n'est pas ma priorité non plus.
Néanmoins si vous voyez une solution au problème faites moi signe ! :)

EDIT : Je pense (je peux me tromper, et je me trompe souvent :^) ) que le soucis vient de là, du fait que la lecture des sample n'est pas "Time based", mais aucune idée de comment faire ça proprement.

bool SoundStream::onGetData(Chunk& data)
{
    // number of samples to stream every time the function is called;
    // in a more robust implementation, it should be a fixed
    // amount of time rather than an arbitrary number of samples
    const int samplesToStream = 50000;

    // set the pointer to the next audio samples to be played
    data.samples = &m_samples[m_currentSample];

    // have we reached the end of the sound?
    if (m_currentSample + samplesToStream <= m_samples.size())
    {
        // end not reached: stream the samples and continue
        data.sampleCount = samplesToStream;
        m_currentSample += samplesToStream;
        return true;
    }
    else
    {
        // end of stream reached: stream the remaining samples and stop playback
        data.sampleCount = m_samples.size() - m_currentSample;
        m_currentSample = m_samples.size();
        return false;
    }
}

11
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 !

12
vous inquiétez pas, j'ai tout bien bind et la sfml fonctionne comme sur des roulettes, ogg, flac et tout ;)

place à sfgui :|

On va éviter le double post, c'est bon tout est réglé, j'ai généré et bind sfgui tout marche bien et c'est la fête :D


13
Général / Re : problème de génération (cmake) & binding (codeblocks)
« le: Septembre 15, 2015, 03:44:36 pm »
J'ai la forte impression qu'il me manque encore des lib ^^

Tout à bien marché après le make (désolé, j'ai pas lu jusqu'au bout :pastaper:) il me manque juste 2 libs que j'avais sous la SFML-2.2 et qui font mal à mon compilo : glew et sndfile, un simple copier coller et c'est bon ou je risque d'avoir des problèmes de compatibilité un jour ?

14
Général / Re : problème de génération (cmake) & binding (codeblocks)
« le: Septembre 15, 2015, 02:30:35 pm »
du coup pour être moins bête dans ma vie, à quoi ça sert un makefile du coup ?
Là j'ai généré pour copdeblocks, j'ai compilé le projet mais j'ai pas vu beaucoup de modifications dans mon dossier '-'

Alors ma théorie c'est que pour les includes c'est le dossier source include et les libs sont celles créé après le coup compilo dans le dossier lib du build ?

Si c'est ça c'est plutôt chouette.

Ma seconde "théorie" (oui je suis stupide) c'est que le MingW Makefile servait en fait à build dirctement via MingW sans l'intermédiaire d'un ide.

En tout cas merci, je reviens vers vous si j'ai un autre soucis !

15
En ce qui concerne CMake, es-tu certain qu'il est capable de trouver ton MinGW ? En l'occurence, est-ce que le chemin <.../MinGW/bin> se trouve dans la variable d'environnement PATH ? Il se passe quoi si tu renseignes la variable CMAKE_MAKE_PROGRAM manuellement ? Est-ce que d'autres exécutables de MinGW sont trouvés ou aucun ?

Merci beaucoup !

Pour ce qui est de la config et la génération, renseigner la variable a réglé le problème pour la SFML et SFGUI.
Bon, par contre j'ai pas bien compris comment à partir du makefile généré on créé un projet codeblocks pour compiler tout ça ^^
Pour ce qui est du linkage, j'ai bien vérifié, les chemins sont bons, pas de différence avec l'ancienne version de, la sfml que j'utilisais. Je pense que ça vient du compilo, j'attend de voir une fois de nouveau la sfml compilée ! :)

En tout cas merci beaucoup Laurent, voilà déjà une bonne chose de faite.

Pages: [1] 2 Suivante »