ActionScript 3 à l'écoute du son
Adrien, samedi 13 octobre 2007 à 16:12 - RéalisationsUn petit bout d'As3 qui écoute un son et retranscrit le spectre dans un graphique.
Cliquez sur le cercle pour voir ce quoi ça à l'air.
A présent il est devenu très facile d'écouter un son avec Flash et ActionScript 3. A priori, on peut également récupérer une fréquence choisie (grave, aiguë...), ce qui peut s'avérer très utile.
Voilà le code, n'hésitez pas à me montrer vos essais, ça m'intéresse.
package {
import flash.display.*;
import flash.events.*;
import flash.media.*;
import flash.net.URLRequest;
import flash.utils.ByteArray;
public class Main extends Sprite {
var mySound:Sound = new Sound();
var myChannel:SoundChannel;
var myByteArray:ByteArray = new ByteArray();
var myArray:Array = new Array();
var iCircleWidth:int;
var nCircleAngle:Number;
var mCircle:MovieClip = new MovieClip();
public function Main() {
addChild(mCircle);
mySound.load(new URLRequest("mySound.mp3"));
myChannel = mySound.play();
stage.addEventListener(Event.ENTER_FRAME, spectrum);
}
private function spectrum(evt:Event):void {
SoundMixer.computeSpectrum(myByteArray);
mCircle.graphics.clear();
mCircle.graphics.beginFill(0x391E15);
mCircle.graphics.lineStyle(1, 0xFF017D, 0.7);
for(var i = 0; i < 256; i++) {
iCircleWidth = 50 + 50*myByteArray.readFloat();
nCircleAngle = i*20*Math.PI/256;
if (i == 0) { mCircle.graphics.moveTo(stage.stageWidth/2 + iCircleWidth * Math.cos(nCircleAngle), stage.stageHeight/2 + iCircleWidth * Math.sin(nCircleAngle)); }
mCircle.graphics.lineTo(stage.stageWidth/2 + iCircleWidth*Math.cos(nCircleAngle), stage.stageHeight/2 + iCircleWidth*Math.sin(nCircleAngle));
}
mCircle.graphics.endFill();
}
}
}11 commentaires
Haha oui du #FF017D parce que c'est le seul rose que j'ai en mémoire à cause de toi!
Tu travaillais sur ça pour en faire quoi par la suite?
Sinon le son c'est Bauchklang. Beatbox only, pas d'instruments. C'est juste la classe ^^!
Yep, BeatBox powaah ! Felix Zenger en force (même si c pas lui) :D
Pas mal, les différentes fréquences sont vraiment visible je trouve.
J'ai tenté le coup avec un spectrum plus classique dans la forme
http://labs.sakanadesign.com/labo/ex_1.html
Bien à toi,
S.
Effectivement le mien est moins conventionnel mais avec un spectre plus classique les différentes fréquences sonores sont plutôt bien réparties j'ai l'impression.
Après je ne suis pas un expert en son mais ça à l'air fidèle à la réalité ;).
Merci pour ton retour et sympa ton petit blog ^^ !
Bonjour,
c'est bluffant, par contre, je ne sais pas comment l'intégrer dans mon code. Comment dois-je faire ? Je débute en action script et je ne vois pas quoi mettre dans mon mxml...
Merci de votre réponse.
Si tu parles de mxml c'est que tu es sous Flex non ?
En l'occurrence il s'agit d'une classe AS3 que tu peux copier et coller dans un fichier à part (Main.as). Puis si tu la spécifie comme classe de document sous Flash (en bas de la fenêtre principale de Flash il y a un champs "classe du document") et en compilant cela devrait fonctionner.
Il faudra quand même faire attention que le son (mySound.mp3) soit au même endroit que le SWF ou alors changer le chemin dans le code. De même il faudrait que la classe AS soit au même endroit que le FLA, ou changer le chemin dans les paramètres de compilation.
PS : j'explique un peu rapidement mais c'est pour donner les grandes lignes. Si jamais tu veux vraiment tester sous Flash et que tu n'y parviens pas avec ces indications, on feras ça plus précisément via un IM.
En tout cas, merci pour ton commentaire et bienvenue chez toi :) !
Salut, tout d'abord, merci de ta réponse si rapide.
Oui, je suis bien sous Flex, j'ai donc copié ton code dans un fichier .as, j'ai un problème car il me sort une erreur.
public class Main() extends Sprite erreur 1131 Les classes ne peuvent être imbriqués
Petit tour sur google mais rien le site d'Adobe ne m'a rien donné.
Je t'explique pourquoi je dois passer par Flex, en fait j'ai dans l'optique de faire un lecteur qui lit un flux en streaming, jusque là tout va bien je créé un String pour mon URL et le met à la place de Mysound.mp3. Le truc c'est qu'après j'aurais besoins de changer l'URL de mon lecteur pour qu'il change de flux, voilà donc le but final.
Si tu as une idée n'hésite pas, je serai très heureux de pouvoir te montrer le projet fini, et c'est vrai que pour le player, je pensais partir sur ton anime qui est excellente.
Merci @+.
Hello ;)
J'aime beaucoup ton spectre !
Mais je n'ai pas réussi à le faire fonctionner.
J'ai bien fais gaffe au chemin du mp3, mis ton code dans une classe et relié cette classe à un document .fla, dans le même répertoire.
Mais lorsque je lance l'anim, rien ne se passe, mon mp3 ne se lit pas.
Aurait-tu une idée du problème ?
Merci ;)
Florent.
Bonjour,
félicitation pour ton script. Je bosse en ce moment sur une application qui utilise aussi le computeSpectrum mais je suis un peut bloqué. J'ai bien compris le fonctionnement en ce qui concerne le dessin du spectre mais en revanche je n'arrive pas à récupérer les fréquence dans une variable. Le but de mon programme serait de récupéré les fréquences pour savoir quelle note est jouée.
Vous avez peut-être remarqué un bug de computeSpectrum qui survient lorsqu'un autre fichier SWF est ouvert dans le même navigateur et utilise aussi du son.
Par exemple, Si vous lancez Youtube en même temps que ce billet, vous verrez que le spectre a quelques soucis à se former.
En guise de réponse, je vous invite à lire l'article suivant : http://k2xl.com/wordpress/2009/01/26/why-you-keep-getting-a-computespectrum-security-error/
Pour les moins anglophones, il est dit :
"La solution ? Il n'y a pas de solution. security.allowDomain ne fonctionnera pas. Mettre des crossdomain.xml partout sur votre serveur ne fonctionnera pas mieux. La seule chose que vous pouvez faire, c'est "catcher" l'erreur (ou utiliser areSoundsInaccessible()) et faire en sorte qu'il se passe autre chose."














Que vois-je ? #FF017D ? :D
Par Vict, samedi 13 octobre 2007 à 17:28Ce qui est marrant c'est que je bossais sur des choses équivalantes au taff y'a pas longtemps :)
Par contre c'est quoi le son STP ?