Recherche

Catégories

Liens


Extras

  • Micro-blog Twitter
  • Album photo Flickr
  • Album vidéo Youtube
  • Profil Facebook
  • Profil Viadeo
  • Profil LinkedIn
  • Flux RSS du blog
  • Flux RSS des commentaires

Connexion

ActionScript 3 à l'écoute du son

Adrien, samedi 13 octobre 2007 à 16:12 - Réalisations

Un 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

Que vois-je ? #FF017D ? :D

Ce 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 ?

Par Vict, samedi 13 octobre 2007 à 17:28
Adrien

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

Par Adrien, samedi 13 octobre 2007 à 23:44
MaeviX

Yep, BeatBox powaah ! Felix Zenger en force (même si c pas lui) :D

Par MaeviX, lundi 15 octobre 2007 à 17:27
Sakana

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.

Par Sakana, mercredi 6 février 2008 à 14:25
Adrien

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

Par Adrien, mercredi 6 février 2008 à 19:28

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.

Par TheArtist, mardi 11 novembre 2008 à 11:54
Adrien

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 :) !

Par Adrien, mardi 11 novembre 2008 à 15:51

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 @+.

Par TheArtist, mardi 11 novembre 2008 à 17:19

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.

Par Bydox, jeudi 4 décembre 2008 à 12:52

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.

Par Aulren, mardi 17 février 2009 à 20:02
Adrien

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."

Par Adrien, lundi 22 mars 2010 à 10:26

Laisser un commentaire







Le blog d'Adrien est fièrement propulsé par Adrien Felsmann
Contenu sous contrat Creative Commons
Contenu (RSS) et Commentaires (RSS)