computeSpectrum au chargement ?

computeSpectrum au chargement ? - Flash/ActionScript - Programmation

Marsh Posté le 27-08-2007 à 23:53:55    

Bonjours, j'ai cru apercevoir sur un player en flash, la courbe du son se dessiner au chargement de la musique,
mais bon je croi que la class SoundMixer ne creer le bytesarray de se qu'on entend uniquement,  
donc comment faire, comme dans tout bon logiciel de musique, le graphisme du son, genre SpliceMusic (creer en flash )
 
visuel de SpliceMusic
 
http://media.splicemusic.com/img/makemusic_intro.jpg
 
j'ai bien essayer un code du genre :  
 

Code :
  1. function graph(e:Event) {
  2. var array:Array = new Array;
  3. var l:Number = sound.length;
  4. var p:Number = channel.position;
  5. for (var i:uint = 0; i<l; i++) {
  6.  channel = sound.play(i);
  7.  SoundMixer.computeSpectrum(bytes,false,0);
  8.  for (var j:uint = 0; j<256; j++) {
  9.   array[i] = bytes[j];
  10.  }
  11.  SoundMixer.stopAll();
  12. }
  13. }


 
et ensuite dessiner par rapport a l'array
 
des idées ?
 
Merci  :sarcastic:  ;)

Reply

Marsh Posté le 27-08-2007 à 23:53:55   

Reply

Marsh Posté le 28-08-2007 à 09:19:51    

easy : http://www.nicoptere.net/blog/inde [...] -plus-fort


---------------
"Il y a vraiment aucun patelin qui s'appelle 'undefined' en France ?"
Reply

Marsh Posté le 28-08-2007 à 19:06:56    

je comprend pas, y'a rien de se que je veu faire dans le lien

Reply

Marsh Posté le 28-08-2007 à 19:20:50    

si tu fais pas la relation entre le code donné et ton problème, c'est que tu as qques lacunes qu'il faudra accepter de combler avant de te lancer là-dedans.
 
en gros il faut faire des tas de petites lignes verticales parallèles et mapper les valeurs du ByteArray sur leur yscale.


---------------
"Il y a vraiment aucun patelin qui s'appelle 'undefined' en France ?"
Reply

Marsh Posté le 28-08-2007 à 20:41:56    

ah mais enfaite ta pas compris, le probleme
 
je sais utiliser le computeSectrum, mon code ne sert pas a afficher, l'onde en temps reel
 
il sert a precharger l'onde au charmement ca a rien a voir
 
je veu toute l'onde du son,  pas l'onde a un moment donner

Reply

Marsh Posté le 28-08-2007 à 20:46:58    

et ben, parcours ton byteArray avec une boucle for


---------------
"Il y a vraiment aucun patelin qui s'appelle 'undefined' en France ?"
Reply

Marsh Posté le 28-08-2007 à 20:47:44    

En fait, computeSpectrum ne fais tout simplement pas du tout ce que tu veut, toi tu veut la "hauteur de l'onde sonore" à chaque instant, alors que lui te donne la FFT sur un instant.  
Les deux ressemblent à des courbes qui bougent avec le son, mais ne sont pas du tout la même chose (un peu comme si tu voulais une image et qu'on te file un histogramme en quelque sorte...).
 
Tu peut théoriquement recalculer la courbe du son à partir des spectrums de chaque instant, mais je doute que ce soit faisable en un temps raisonnable en flash et/ou sans savoir exactement ce qu'on doit faire comme calcul.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 28-08-2007 à 21:18:00    

ah tu veux faire une transformée de Fourier inverse en Flash ???


---------------
"Il y a vraiment aucun patelin qui s'appelle 'undefined' en France ?"
Reply

Marsh Posté le 28-08-2007 à 21:20:44    

craps_youpla a écrit :

ah tu veux faire une transformée de Fourier inverse en Flash ???


 
Me semble que c'est ce qu'il lui faudrait pour résoudre son pb, je connais pas flash c'est peut-être déjà integré mais si c'est pas le cas ça risque d'être amusant à faire.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 28-08-2007 à 21:23:59    

le FFT et l'onde c'est les harmonique par rapport au signal,  
 
computeSpectrum   fait le FFT ou l'onde
 
en gros je veu faire ca, j'ai vu c'est faisable, et ca c'est juste l'onde de la musique a tout les instants en version applatie
 
vous etes allez  faire un tour sur SpliceMusic ?
 
http://stealth35.free.fr/music.jpg


Message édité par stealth35 le 28-08-2007 à 21:25:08
Reply

Marsh Posté le 28-08-2007 à 21:23:59   

Reply

Marsh Posté le 29-08-2007 à 00:06:16    

la routine c'est ça :
 

Code :
  1. import com.xxx.Line;
  2. import flash.display.MovieClip;
  3. import flash.events.Event;
  4. import flash.events.TimerEvent;
  5. import flash.media.Sound;
  6. import flash.media.SoundMixer;
  7. import flash.net.URLRequest;
  8. import flash.utils.ByteArray;
  9. import flash.utils.Timer;
  10. var _holder:MovieClip = new MovieClip();
  11. this.addChild(_holder);
  12. var _line:Line = new Line();
  13. _holder.addChild(_line);
  14. var _s:Sound = new Sound();
  15. var _wave:ByteArray = new ByteArray();
  16. var _beacon:Timer = new Timer(1);
  17. _beacon.addEventListener( 'timer' , onTimer );
  18. var _bytesCount:Number;
  19. _s.addEventListener(Event.COMPLETE, onSoundLoaded);
  20. var req:URLRequest = new URLRequest('foobar');
  21. _s.load(req);
  22. function onSoundLoaded(event:Event):void {
  23.     var localSound:Sound = event.target as Sound;
  24. localSound.play();
  25. SoundMixer.computeSpectrum(_wave);
  26. _bytesCount = _wave.length;
  27. for( var i:Number = 0 ; i < _bytesCount / 2 ; i++ ) {
  28.  var __line:Line = new Line();
  29.  _holder.addChild(__line);
  30.  __line.x = i;
  31.  __line.name = 'line_mc' + i;
  32. }
  33. _beacon.start();
  34. }
  35. function onTimer(event:TimerEvent):void {
  36. SoundMixer.computeSpectrum(_wave);
  37. for( var i:Number = 0 ; i < this._bytesCount / 2 ; i++ ) {
  38.  _wave.position = i;
  39.  var theLine:DisplayObject = _holder.getChildAt(i);
  40.  var theLineMC:Line = theLine as Line;
  41.  theLine.height = _wave.readByte();
  42. }
  43. }


 
Le problème c'est que le ByteArray _wave fait 2048 slices :( Donc la résolution est pourrie/trop élévée et on voit rien -> le Flash Player est techniquement limité, tu devrais combler avec un vieil effet de flou, ou ne dessiner que 50 slices reliés par des béziers, la méthode de SpliceMusic, à vue de nez.
 
Avec SoundMixer.computeSpectrum(_wave,true); , on applique une Transformée de Fourier à la volée, et on a le spectre (et c'est très joli par contre :) ).
 
Nécessite un clip "Line" attachable depuis la bibliothèque.


Message édité par craps_youpla le 29-08-2007 à 00:10:08

---------------
"Il y a vraiment aucun patelin qui s'appelle 'undefined' en France ?"
Reply

Marsh Posté le 29-08-2007 à 00:38:18    

merci je test ca je te tien au courant

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed