frocessing with SoundMixer
サウンドから生成するバイト配列をパラメータとしてfroccessingでグラフィックを描画するアプリケーションです。
入力デバイスからのインタラクションはありません。ただ眺めるだけっす。
frocessing with SoundMixer – wonderfl build flash online
以下、ちょっとした解説。
詳しくはwonderflのコードを見たほうが分かりやすいかもしれませんが・・・
frocessingでの描画処理部分のコード
import frocessing.display.*; import flash.geom.Point; import flash.utils.ByteArray; import flash.media.SoundMixer; class Canvas extends F5MovieClip2DBmp{ private var _w:Number; private var _h:Number; private var _t:Number = 0; private var _pastPos:Point; private var _px:Number = 0; private var _py:Number = 0; private var _r:Number = 0; private var _list:Array = new Array(); private var _soundPath:String; private var _waveBytes:ByteArray = new ByteArray(); private var _sound:SoundPlayStop; public function Canvas($w:Number, $h:Number, $soundPath:String) { _w = $w; _h = $h; _soundPath = $soundPath; super(); } // 初期化 public function setup():void { for(var i:uint=0; i<5; i++){ var p:Point = new Point(random(0 ,_w), random(0 ,_h)); _list.push(p); } size(_w, _h); background(0); noFill(); colorMode(HSV, 2, 1, 1); // _sound=new SoundPlayStop(); _sound.soundStart(_soundPath, 100); } // 毎フレーム描画 public function draw():void{ // SoundMixerからバイト配列を取得して現実的な値に置き換える var n:int; try{ SoundMixer.computeSpectrum(_waveBytes, true, 0); n = _waveBytes.readFloat() * 250; }catch(e:Error){ return; } // var rad = _r * .3 * Math.PI / 180; var px:Number = _w * .5 + Math.cos(rad) * n; var py:Number = _h * .5 + Math.sin(rad) * n; // var p:Point; p = new Point(px, py); //描画 if(p && _pastPos){ var distance:int = Point.distance(p, _pastPos); _pastPos = p; // var r:int = Math.random() * 10 for(var i:int; i<distance * .5 ;i++){ stroke(_t, 0.8, 1, 0.1); _px += (p.x + (Math.random() * distance-distance / 4) - _px) * Math.random() * 0.5; _py += (p.y + (Math.random() * distance-distance / 4) - _py) * Math.random() * 0.5; ellipse(_px, _py, r * distance / 4, r * distance / 4); } _pastPos = p; }else{ _pastPos = new Point(px, py); } _t += 0.1; _r += 30; } // 消す public function remove():void{ background(0, 1); _t = 0; } }
メインクラスでのエフェクト部分のコード
public function Main(){ addChild(_container); // ルート表示オブジェクト _canvas = new Canvas(WIDTH, HEIGHT, SOUNDPATH); // frocessingの表示オブジェクト _bmd = new BitmapData(WIDTH, HEIGHT, true, 0); // エフェクト用Bmd _container.addChild(_canvas); _container.addChild(_bm = new Bitmap(_bmd) as Bitmap); _bm.blendMode = "add"; // addEventListener(Event.ENTER_FRAME, update); // 描画クリア用タイマー _timer = new Timer(500); _timer.addEventListener(TimerEvent.TIMER, removedInterval); _timer.start(); } private function update(e:Event):void{ // ColorTransformで色を暗くしながらエフェクト用BmdにCanvasをDraw _bmd.draw(_canvas, null, _ctf, "add"); // エフェクト用Bmdにブラーフィルタを適用 _bmd.applyFilter(_bmd, _bmd.rect, new Point(), new BlurFilter(8, 8, 3)); } private function removedInterval(e:TimerEvent):void{ // Canvasをクリア _canvas.remove(); }