2010-12-22 2 views
5

Je suis en train de concevoir une application de visualisation de musique pour l'iPhone. Je pensais faire cela en récupérant des données via le micro de l'iPhone, en y exécutant une Transformée de Fourier et ensuite en créant des visualisations.Créer un iPhone Music Visualiser basé sur la transformation de Fourier

Le meilleur exemple que j'ai pu obtenir est aurioTuch qui produit un graphe parfait basé sur les données FFT. Cependant, j'ai eu du mal à comprendre/reproduire aurioTouch dans mon propre projet.

Je n'arrive pas à comprendre où exactement aurioTouch capte les données du microphone avant de faire la FFT?

Y a-t-il d'autres exemples de code que je pourrais utiliser pour faire cela dans mon projet? Ou d'autres conseils?

+0

Désolé de demander l'évidence, mais avez-vous essayé de suivre le programme étape par étape en mode débogage? Quelles sont les difficultés exactes que vous avez rencontrées? –

+0

Oui J'ai suivi le code du programme. Pourrait juste moi être épais ici, mais je suis incapable de déterminer où exactement il obtient les données du microphone. Un aperçu de cela? – Dave

Répondre

3

Depuis que je me prévois d'utiliser l'entrée du micro, je pense que votre question est une bonne occasion de se familiariser avec un exemple de code pertinent.

Je retracer les étapes de lecture à travers le code:

  1. En partant en SpectrumAnalysis.cpp (car il est évident que l'audio doit arriver à cette classe en quelque sorte), vous pouvez voir que la méthode de classe SpectrumAnalysisProcess a un deuxième argument d'entrée const int32_t* inTimeSig --- semble un point de départ prometteur, puisque le signal d'entrée est ce que nous cherchons.
  2. Utilisation de l'élément de menu contextuel Find in project sur cette méthode, vous pouvez voir qu'à l'exception de la définition évidente & déclaration, cette méthode est utilisée uniquement dans la méthode FFTBufferManager::ComputeFFT, où il obtient mAudioBuffer comme 2ème argument (la inTimeSig de l'étape 1). La recherche de ce membre de données de classe donne plus de 2 ou 3 résultats, mais la plupart d'entre eux sont simplement des définitions/allocation mémoire etc. Le résultat de recherche intéressant est mAudioBuffer est utilisé comme argument à memcopy, à l'intérieur de la méthode FFTBufferManager::GrabAudioData.
  3. Toujours en utilisant l'option de recherche, nous voyons que FFTBufferManager::GrabAudioData est appelée qu'une seule fois, à l'intérieur d'une méthode appelée PerformThru. Cette méthode a un argument d'entrée appelé ioData (semble prometteur) de type AudioBufferList.
  4. En recherchant PerformThru, nous voyons qu'il est utilisé dans la ligne suivante: inputProc.inputProc = PerformThru; - nous y sommes presque: cela ressemble à l'enregistrement d'une fonction de rappel. Vous cherchez le type de inputProc, nous voyons en effet qu'il est AURenderCallbackStruct - c'est tout. Le rappel est appelé par le cadre audio, qui est chargé de le nourrir avec des échantillons.

Vous aurez probablement à lire la documentation pour AURenderCallbackStruct (ou mieux, le Audio Unit Hosting) pour obtenir une compréhension plus profonde, mais j'espère que cela vous a donné un bon point de départ.

+0

Merci beaucoup pour l'aide Itamar. Cependant, j'ai maintenant rencontré un autre problème où je ne peux pas sembler enregistrer des données de microphone et lire de la musique à partir de la bibliothèque de l'iPod simultanément. Un aperçu de cela? – Dave

+0

Peut-être que ces liens seront utiles: http: // atastypixel.com/blog/en utilisant-remoteio-audio-unit/et http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html –

Questions connexes