2009-07-08 8 views
3

Salut, il aimerait savoir si c'est dans la mesure du possible créer un égaliseur "paramétrique" en flash. Pas seulement les effets graphiques habituels mais un outil pour modifier la sortie du son qui passe par l'application. Toute référence, idée de conseils bien accueillie. MerciCréer un Egaliseur Flash (modifier le son de sortie)

Répondre

6

Il ne va pas être terriblement facile ... mais voici peut-être un moyen:

var parameters:Array = [1,1,1,1,0.5] 
var sound:Sound = new Sound(); 
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, filter); 
sound.load(soundURLRequest); 
sound.play(); 

private function filter(event:SampleDataEvent):void 
{ 
    var freqDomain:Array = FFT(event.data, parameters.length); // You will need to find a FFT(Fast Fourier Transform) function to generate an array. 
    for(var i:int = 0; i < freqDomain.length; i++) 
    { 
     freqDomain[i] = freqDomain[i] * parameters[i]; // This is where your EQ parameters get applied. 
    } 
    var timeDomain:Array = IFFT(freqDomain, event.data.length); // Inverse FFT 

    for(value:Number in timeDomain) 
    { 
     event.data.writeFloat(value); 
    } 
} 

Certains sur la FFT et les fonctions IFFT, FFT sorties généralement des valeurs complexes (réelles + de composants complexes), qui peut être converti en composants de magnitude et de phase. Ce dont vous avez vraiment besoin, c'est seulement la grandeur, qui a une formule = (sqrt (real^2 + complex^2)). Les oreilles des humains ne sont PAS sensibles à la phase (contrairement aux yeux, qui sont TRÈS sensibles à la phase), donc quand vous faites la FFT inverse, vous pouvez insérer une phase aléatoire ou plate avec peu de différence. Notez que mon approche est très faible en termes d'implémentation de filtres.

Voici une fonction de transformation de Fourier (pas rapide cependant, c'est juste une convolution (O (n^2)) vs FFT O (nlogn)) juste pour référence (erreur .. c'est hors de ma tête si pourrait être mal avec les constantes):

// Note that this only returns the magnitude, I am discarding the phase. 
function FFT(sample:Array, size):Array 
{ 
    var frequencies = new Array(size); 
    for(int i = 0; i < sample.size; i++) 
    { 
     for(int j = 0; i < frequencies.size; j++) 
     { 
      var real:Number = sample[i] * Math.cos(Math.PI/2 * i * j); 
      var complex:Number = sample[i] * Math.sin(Math.PI/2 * i * j); 
      frequencies[j] += Math.sqrt(real * real + complex * complex); 
     } 
    } 
    return frequencies; 
} 
+0

l'objet event.data passé par SampleDataEvent est un bytearray, pas un tableau. Toutes les recommandations pour mettre à jour le code pour gérer un bytearray. Aussi, qu'est-ce qui est nécessaire pour faire l'IFFT? – klamping

+1

ByteArrays permet l'indexation (en utilisant [i] pour saisir des parties), donc vous l'utilisez essentiellement comme un tableau. Vous pouvez trouver les algorithmes IFFT en ligne, mais il s'agit essentiellement de la FFT, mais avec des facteurs de magnitude et de phase différents. – CookieOfFortune

1

Découvrez Andre Michelle's labs page. Il fait beaucoup de boulot avec audo en Flash ... probablement l'un des meilleurs. Je ne suis pas sûr de ce qu'est un eq paramétrique, mais vous devriez être capable de trouver de bonnes informations sur cette page.

0

probablement un ensemble de digital filters serait votre meilleur pari. Contrairement à la FFT, avec le filtre numérique, vous n'avez pas besoin de conserver toute la forme d'onde en mémoire, car les filtres numériques sont causaux et ne regardent que quelques points dans le passé et/ou le futur. Aussi, si vous pouvez diffuser le son, vous pouvez simplement les appliquer à la volée. Les filtres simples peuvent être facilement enchaînés pour créer des filtres plus compliqués.

Il ya un free book on digital filters qui a une théorie de base, mais où l'on peut aussi juste parcourir et lever des formules. Par exemple, une lecture rapide de Ch. 19 répertorie des formules simples pour les filtres récursifs passe-haut, passe-bas et passe-bande qui feront probablement l'affaire, mais si vous voulez être plus chic, il y a beaucoup d'autres filtres dans le livre.

+0

Le problème avec les filtres FIR et IIR est qu'il n'est pas trivial de les faire fonctionner sur des paramètres de fréquence arbitraires. – CookieOfFortune

+0

@Cookie - Ceci est vrai pour certains filtres numériques mais pas tous. La référence que j'ai mentionnée répertorie plusieurs filtres faciles à calculer à la volée, en quelques lignes de code très simples. – tom10

1

Mise à jour: Je trouve un exemple de 3-band equalizer using Flash 10. Il utilise des maths différentes de celles de CookieOfFortune, mais cela fonctionne (enfin, c'est le cas). En utilisant cela, j'ai mis à jour l'exemple pour 5 bandes et l'ai converti pour fonctionner dans Flex. Vous pouvez see the code on GitHub.

Si quelqu'un a des suggestions sur la façon dont les maths sont exécutées, je serais plus qu'heureux d'en entendre parler. Je ne sais vraiment pas beaucoup en termes de modification sonore.


Original post: Je ne sais pas à quel point cela vous aidera, mais c'est un pis-aller pour obtenir l'effet de l'égaliseur sonore sans la douleur de la FFT et tel.

http://www.webdesign.org/web/flash/tutorials/sound-equalizer.5020.html

Fondamentalement, vous créez plusieurs versions du fichier son, chaque jeu à un réglage de l'égaliseur pré-faites. Ensuite, lorsque l'utilisateur ajuste les graves ou les aigus, il suffit d'ajuster le volume sonore du fichier respectif.

Vous trouverez peut-être aussi la fonction extract() utile sur la variable du son: http://livedocs.adobe.com/flex/3/langref/flash/media/Sound.html#extract

+0

Il semble qu'ils utilisent FFT. Vous pouvez assez facilement généraliser ces instructions pour créer des bandes arbitraires (au prix d'avoir à augmenter la longueur de votre buffer). – CookieOfFortune

Questions connexes