Adobe Flash: Formations & Forums: Pixel Bender Audio Mixer - Adobe Flash: Formations & Forums

Voir le contenu

Page 1 sur 1
  • Vous ne pouvez pas créer de sujet
  • Vous ne pouvez pas répondre au sujet

Pixel Bender Audio Mixer

#1 Utilisateur non-connecté   stealth35

  • Ceinture Noire
  • Groupe : Membres
  • Messages : 478
  • Inscrit : 04-August 06
  • Gender:Male
  • Version logiciel:Flash Builder 4
  • Compétences: Développeur Actionscript 3.

Posté 09 March 2009 - 06:00 PM

hello, tout le monde,
suite a un message de "fabouney" qui me demandais comment faire un mixer audio avec pixel bender,
y'a une methode ici : http://www.kaouranti...xel-bender.html

malheureusement la compilation du pbj, est faite maison en cpp (d'ailleur porter ca sous alchemy ca serai le pied icon_razz.gif )

donc voici, un ptit mixer 12 pistes, qui marche parfaitement, (bon le bargraph par sur j'ai fais tout de tete et sans "trace", mais ca c'est du bonus)

pour le code, et la source complète avec les samples (source ici)

Action Script

package  
{
import flash.display.*;
import flash.media.*;
import flash.events.*;
import flash.net.*;
import flash.utils.*;
import fl.controls.Slider;

[SWF(width='500', height='380', frameRate='24')]

public class AudioMixer extends Sprite{

[Embed(source = "wikka/track01.mp3")] private var Track1:Class;
[Embed(source = "wikka/track02.mp3")] private var Track2:Class;
[Embed(source = "wikka/track03.mp3")] private var Track3:Class;
[Embed(source = "wikka/track04.mp3")] private var Track4:Class;
[Embed(source = "wikka/track05.mp3")] private var Track5:Class;
[Embed(source = "wikka/track06.mp3")] private var Track6:Class;
[Embed(source = "wikka/track07.mp3")] private var Track7:Class;
[Embed(source = "wikka/track08.mp3")] private var Track8:Class;
[Embed(source = "wikka/track09.mp3")] private var Track9:Class;
[Embed(source = "wikka/track10.mp3")] private var Track10:Class;
[Embed(source = "wikka/track11.mp3")] private var Track11:Class;
[Embed(source = "wikka/track12.mp3")] private var Track12:Class;

[Embed(source = "AudioMixerFilter.pbj",mimeType = "application/octet-stream")]
private var EmbedShader:Class;

private var shader:Shader = new Shader(new EmbedShader());

private var sound:Vector.<Sound> = new Vector.<Sound>();
private var bytes:Vector.<ByteArray> = new Vector.<ByteArray>();
private var sliders:Vector.<Slider> = new Vector.<Slider>();
private var graph:Vector.<Shape> = new Vector.<Shape>();

private var BUFFER_SIZE:int = 0x800;

public var playback:Sound = new Sound();
public var container:Sprite = new Sprite();

public function AudioMixer():void{
container.y = stage.stageHeight * .5;
addChild(container);

sound.push(new Track1(), new Track2(), new Track3(), new Track4(), new Track5(), new Track6(), new Track7(), new Track8(), new Track9(), new Track10(), new Track11(), new Track12());

for(var i:int = 0; i < sound.length; i++){
var slider:Slider = new Slider();
slider.maximum = 1;
slider.minimum = 0;
slider.snapInterval = 0.025;
slider.value = 0.8;
slider.rotation += -90;
slider.x = i * 40 + 25;
container.addChild(slider);
sliders.push(slider);

var line:Shape = new Shape();
line.graphics.lineStyle(1, 0x888888);
line.graphics.drawRect(i * 40 + 14, 0, 5, -80);
line.graphics.endFill();
container.addChild(line);

var shape:Shape = new Shape();
shape.graphics.beginFill(0x00cc00);
shape.graphics.drawRect(i * 40 + 15, 0, 3, -80);
shape.graphics.endFill();
container.addChild(shape);
graph.push(shape);
}

playback.addEventListener(SampleDataEvent.SAMPLE_DATA, onSoundData);
playback.play();
}

private function onSoundData(event:SampleDataEvent):void {

for(var i:int = 0; i < sound.length; i++){
bytes[i] = new ByteArray();
bytes[i].length = BUFFER_SIZE * 4 * 2;
sound[i].extract(bytes[i], BUFFER_SIZE);

var volume:Number = 0;
bytes[i].position = 0;

for(var j:int = 0; j < BUFFER_SIZE; j++){
volume += Math.abs(bytes[i].readFloat());
volume += Math.abs(bytes[i].readFloat());
}

volume = (volume / (BUFFER_SIZE * .5)) * sliders[i].value;

shader.data['track' + (i + 1)].width = BUFFER_SIZE / 1024;
shader.data['track' + (i + 1)].height = 512;
shader.data['track' + (i + 1)].input = bytes[i];
shader.data['vol' + (i + 1)].value = [sliders[i].value];

graph[i].scaleY = volume;
}

var shaderJob:ShaderJob = new ShaderJob(shader,event.data,BUFFER_SIZE / 1024,512);
shaderJob.start(true);
}
}
}


Action Script

<languageVersion : 1.0;>

kernel AudioMixerFilter
< namespace : "stealth";
vendor : "stealth";
version : 1;
description : "Audio mixer with 12 tracks";
>
{
input image4 track1;
input image4 track2;
input image4 track3;
input image4 track4;
input image4 track5;
input image4 track6;
input image4 track7;
input image4 track8;
input image4 track9;
input image4 track10;
input image4 track11;
input image4 track12;

parameter float vol1;
parameter float vol2;
parameter float vol3;
parameter float vol4;
parameter float vol5;
parameter float vol6;
parameter float vol7;
parameter float vol8;
parameter float vol9;
parameter float vol10;
parameter float vol11;
parameter float vol12;

output pixel4 dst;

void
evaluatePixel()
{
pixel4 tmp1 = sampleNearest(track1,outCoord()) * vol1;
pixel4 tmp2 = sampleNearest(track2,outCoord()) * vol2;
pixel4 tmp3 = sampleNearest(track3,outCoord()) * vol3;
pixel4 tmp4 = sampleNearest(track4,outCoord()) * vol4;
pixel4 tmp5 = sampleNearest(track5,outCoord()) * vol5;
pixel4 tmp6 = sampleNearest(track6,outCoord()) * vol6;
pixel4 tmp7 = sampleNearest(track7,outCoord()) * vol7;
pixel4 tmp8 = sampleNearest(track8,outCoord()) * vol8;
pixel4 tmp9 = sampleNearest(track9,outCoord()) * vol9;
pixel4 tmp10 = sampleNearest(track10,outCoord()) * vol10;
pixel4 tmp11 = sampleNearest(track11,outCoord()) * vol11;
pixel4 tmp12 = sampleNearest(track12,outCoord()) * vol12;

pixel4 tmp_out = tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 + tmp7 + tmp8 + tmp9 + tmp10 + tmp11 + tmp12;

dst = tmp_out;
}
}


0

#2 Utilisateur non-connecté   stealth35

  • Ceinture Noire
  • Groupe : Membres
  • Messages : 478
  • Inscrit : 04-August 06
  • Gender:Male
  • Version logiciel:Flash Builder 4
  • Compétences: Développeur Actionscript 3.

Posté 09 March 2009 - 06:48 PM

j'oubliais, pour compiler :

Action Script

mxmlc -library-path+=Slider.swc AudioMixer.as

0

#3 Utilisateur non-connecté   fabouney

  • Ceinture Jaune
  • Groupe : Membres
  • Messages : 15
  • Inscrit : 10-January 08

Posté 10 March 2009 - 02:54 PM

J'ai réussi à faire mon mixer 15 pistes sans problème smile.gif
j'ai pas fait exactement comme toi, mais bon le principal c'est que cela fonctionne.

j'ai d'ailleur reporté un bug https://bugs.adobe.c.../browse/FP-1702, en fait si tu mets 16 pistes le ShaderJob.start fait crasher Flash Player, c'est assez inconfortable !.

autre chose, je ne comprend pas à 100% le rôle du buffer ici, j'ai testé en mettant une valeur de 0x1024, et j'ai des craquements dans le sons, par contre si je met 0x1000 cela fonctionne, donc ma question est "Est-ce que le buffer joue vraiment le rôle d'un buffer, où a-t-il une autre utilisé ici ? car 100 en buffer audio c'est plutôt faible, admettons je veux un buffer de 3000, comment vous feriez ?"

Merci à vous, et surtout merci à Tinic Uro pour cette astuce.

Fabien.

0

#4 Utilisateur non-connecté   stealth35

  • Ceinture Noire
  • Groupe : Membres
  • Messages : 478
  • Inscrit : 04-August 06
  • Gender:Male
  • Version logiciel:Flash Builder 4
  • Compétences: Développeur Actionscript 3.

Posté 10 March 2009 - 04:01 PM

le buffer, c'est un valeur en sample, et chaque sample a un nombre precis de bits, donc faut mettre des valeur juste, comme 1024 2048 4096 ou la valeur maximal 8192

la j'ai mis un de 0x800 donc de 2048
0

#5 Utilisateur non-connecté   stealth35

  • Ceinture Noire
  • Groupe : Membres
  • Messages : 478
  • Inscrit : 04-August 06
  • Gender:Male
  • Version logiciel:Flash Builder 4
  • Compétences: Développeur Actionscript 3.

Posté 10 March 2009 - 04:04 PM

attention au bug que tu as rapporté, la compilation de ton pbj, n'est pas officiel et donc pas supporter par adobe
0

#6 Utilisateur non-connecté   fabouney

  • Ceinture Jaune
  • Groupe : Membres
  • Messages : 15
  • Inscrit : 10-January 08

Posté 15 March 2009 - 07:52 AM

Merci pour l'histoire du buffer.
Pour mon bug reporté, mon pbj est juste optimisé, si j'utilise le tient, ça utilise beaucoup plus de CPU car il fait plein d'instruction ASM en plus des MOV dans des variables temporaires, donc voilà, sinon ça bug aussi avec ton pbj.
0

#7 Utilisateur non-connecté   stealth35

  • Ceinture Noire
  • Groupe : Membres
  • Messages : 478
  • Inscrit : 04-August 06
  • Gender:Male
  • Version logiciel:Flash Builder 4
  • Compétences: Développeur Actionscript 3.

Posté 15 March 2009 - 10:18 PM

yep, j'ai vu que enfaite c'etait rien de plus que de l'assembleur, ducoup je pense que je vai pourvoir m'eclater plus, et ce qui serai cool, c'est que ca compile le fichier assembleur direct dans flash via alchemy, je vai voir si c'est pas trop compliqué a faire
0

#8 Utilisateur non-connecté   fabouney

  • Ceinture Jaune
  • Groupe : Membres
  • Messages : 15
  • Inscrit : 10-January 08

Posté 16 March 2009 - 10:02 AM

Tient moi au courant, si tu as des bonnes nouvelles par rapport à mon "bug" car je pense que s'en est un.
0

#9 Utilisateur non-connecté   fabouney

  • Ceinture Jaune
  • Groupe : Membres
  • Messages : 15
  • Inscrit : 10-January 08

Posté 16 March 2009 - 10:41 AM

Ah oui au fait par la même occasion, quelle est, d'après toi, la meilleure méthode pour récupérer l'avancement du sons mixé par rapport au buffer ?

Ce message a été modifié par fabouney : 16 March 2009 - 10:41 AM

0

#10 Utilisateur non-connecté   stealth35

  • Ceinture Noire
  • Groupe : Membres
  • Messages : 478
  • Inscrit : 04-August 06
  • Gender:Male
  • Version logiciel:Flash Builder 4
  • Compétences: Développeur Actionscript 3.

Posté 16 March 2009 - 02:18 PM

par rapport au buffer, ca doit etre (bytes[i].position * .5) / 441000
0

#11 Utilisateur non-connecté   fabouney

  • Ceinture Jaune
  • Groupe : Membres
  • Messages : 15
  • Inscrit : 10-January 08

Posté 16 March 2009 - 05:08 PM

Bah en fait encore plus simple lol, suffit de récupérer le soundChannel du playback et de récupérer sa position smile.gif.
0

#12 Utilisateur non-connecté   stealth35

  • Ceinture Noire
  • Groupe : Membres
  • Messages : 478
  • Inscrit : 04-August 06
  • Gender:Male
  • Version logiciel:Flash Builder 4
  • Compétences: Développeur Actionscript 3.

Posté 16 March 2009 - 11:38 PM

oui mais si ta plusieurs piste qui non pas le meme longueur
0

#13 Utilisateur non-connecté   fabouney

  • Ceinture Jaune
  • Groupe : Membres
  • Messages : 15
  • Inscrit : 10-January 08

Posté 17 March 2009 - 08:41 AM

Hum ok, je vois pas trop trop bien alors.
Car sur l'exemple de Tinic Uro dans la function onSoundData il fait : sampleDataEvent.data.writeFloat(val);
il extrait une partie de chaque piste dans l'objet sound principal, donc le fait que les pistes n'ont pas de la même longeur, à la rigueur on s'en fous, puisque ce qui nous interresse c'est la position total.

Sinon, si tu pouvais donner un exemple, peut-être qu'il y a un truc que j'ai pas saisie.

Merci.
0

#14 Utilisateur non-connecté   Matthew Ulrich

  • Ceinture Blanche
  • Groupe : Membres
  • Messages : 4
  • Inscrit : 02-February 10
  • Logiciels utilisés:Flash, Photoshop
  • Gender:Male
  • Location:Le Japon, Yokohama
  • Version logiciel:CS4
  • Compétences: Développeur Actionscript 3.

Posté 02 February 2010 - 06:36 AM

Merci! Ceci est fantastique !

I`m désolé que je ne peux pas parler français! Je dois utiliser du logiciel de traduction.

J'utilise CS4, donc j'ai dû le changement certains de votre code d'actionscript. Cependant, votre code travaille parfaitement!

J'ai une question. Comment peux-je faire les sons pour faire une boucle?
J'ai essayé le fais, mais il n'a pas travaillé.

Merci beaucoup!

Matt
0

#15 Utilisateur non-connecté   çayjb

  • patate
  • Groupe : Modérateurs
  • Messages : 2107
  • Inscrit : 16-April 08
  • Logiciels utilisés:Photoshop CS3, Komodo, FD+flex sdk, FD+flash CS3
  • Gender:Male
  • Location:Brive-la-gaillarde
  • Version logiciel:fd + flex / cs3
  • Compétences: Développeur Actionscript 3.

Posté 02 February 2010 - 10:05 AM

Voir le messageMatthew Ulrich, le 02 February 2010 - 06:36 AM, a dit :

Merci! Ceci est fantastique !

I`m désolé que je ne peux pas parler français! Je dois utiliser du logiciel de traduction.

J'utilise CS4, donc j'ai dû le changement certains de votre code d'actionscript. Cependant, votre code travaille parfaitement!

J'ai une question. Comment peux-je faire les sons pour faire une boucle?
J'ai essayé le fais, mais il n'a pas travaillé.

Merci beaucoup!

Matt


Bonjour :),

peux-tu montrer ce que tu as essayé pour la boucle ?
J'adore fourrer mon nez dans les .fla des autres :-D
Mais je n'ai que CS3 comme IDE Flash :-|

Si votre .fla n'utilise pas de fonction spécifique à CS4 enregistrez en compatible CS3 avant de poster :-)
(sans écraser votre fla version CS4, j'ai constaté des ptits réaménagement bizarre parfois dans le .fla version CS3 ^^)
0

#16 Utilisateur non-connecté   Matthew Ulrich

  • Ceinture Blanche
  • Groupe : Membres
  • Messages : 4
  • Inscrit : 02-February 10
  • Logiciels utilisés:Flash, Photoshop
  • Gender:Male
  • Location:Le Japon, Yokohama
  • Version logiciel:CS4
  • Compétences: Développeur Actionscript 3.

Posté 02 February 2010 - 03:02 PM

Voici ce que j'ai ajouté au code:


private var sourcePos:Vector.<Number> = new Vector.<Number>();
...
for(var i:int = 0; i < sound.length; i++){
sourcePos[i] = 0;
}

...
private function onSoundData(event:SampleDataEvent):void {

for(var i:int = 0; i < sound.length; i++){
bytes[i] = new ByteArray();
bytes[i].length = BUFFER_SIZE * 4 * 2;
sourcePos[i] += sound[i].extract(bytes[i], BUFFER_SIZE, sourcePos[i]);

...

shader.data['track' + (i + 1)].width = BUFFER_SIZE / 1024;
shader.data['track' + (i + 1)].height = 512;
shader.data['track' + (i + 1)].input = bytes[i];
shader.data['vol' + (i + 1)].value = [sliders[i].value];

if ( sourcePos[i] >= (sound[i].bytesLoaded*2) )
{
sourcePos[i] = 0;
}


graph[i].scaleY = volume;
}

var shaderJob:ShaderJob = new ShaderJob(shader,event.data,BUFFER_SIZE / 1024,512);
shaderJob.start(true);
}

Je suis éprouvé avec ActionScript, mais je suis nouvel à l'utilisation de Pixel Bender et les buffers audio. Je m'excuse de ceci.

Merci
0

#17 Utilisateur non-connecté   Matthew Ulrich

  • Ceinture Blanche
  • Groupe : Membres
  • Messages : 4
  • Inscrit : 02-February 10
  • Logiciels utilisés:Flash, Photoshop
  • Gender:Male
  • Location:Le Japon, Yokohama
  • Version logiciel:CS4
  • Compétences: Développeur Actionscript 3.

Posté 04 February 2010 - 04:18 AM

J'ai un plus de question.

Je la production du shader un son mono ou de stéréo ?
Il ne semble pas avoir là à droite et le calcul gauche de sons dans le code de Pixel Bender.
Peut-être qu'il y a un truc que j'ai pas saisie.

Merci!
0

#18 Utilisateur non-connecté   stealth35

  • Ceinture Noire
  • Groupe : Membres
  • Messages : 478
  • Inscrit : 04-August 06
  • Gender:Male
  • Version logiciel:Flash Builder 4
  • Compétences: Développeur Actionscript 3.

Posté 05 February 2010 - 03:56 PM

c'est stereo,
pour faire des boucles, il faut, faire sound.extract sur chaques pistes, et mettre le bytearray dans un buffer type vector, ensuite on parcour le bytearray
0

#19 Utilisateur non-connecté   Matthew Ulrich

  • Ceinture Blanche
  • Groupe : Membres
  • Messages : 4
  • Inscrit : 02-February 10
  • Logiciels utilisés:Flash, Photoshop
  • Gender:Male
  • Location:Le Japon, Yokohama
  • Version logiciel:CS4
  • Compétences: Développeur Actionscript 3.

Posté 06 February 2010 - 09:45 AM

Oh! Merci!

Je comprends entièrement ce qu'arrive dans la code de Pixel Bender maintenant !

Vous faire signifie sound.extract() et extrait tout chaque « piste » mp3 son dans it`s possède grand byteArray. Alors charger chaque byteArray de « piste » dans un vecteur ? En d'autres termes, il n'y a pas d'extrait arrivant dans l'onSoundData () la fonction ? Il est tout fait quand les « pistes » sont premièrement chargées ?

Do you mean use sound.extract() and extract the whole of each "track" mp3 sound into it`s own big byteArray. Then load each "track" byteArray into a vector? In other words, there is no extract happening in the onSoundData() function? It is all being done at one time when the "tracks" are first loaded?

Matt

Ce message a été modifié par Matthew Ulrich : 06 February 2010 - 09:46 AM

0

Page 1 sur 1
  • Vous ne pouvez pas créer de sujet
  • Vous ne pouvez pas répondre au sujet

2 utilisateur(s) dans ce sujet
0 membre(s), 2 invité(s), 0 utilisateur(s) anonyme(s)