AS3用ライブラリの1つである、SiONの練習です。
「かえるの歌」の輪唱をSiONで演奏しています。
サンプルはこちら。
以下、ソースです。
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import org.si.sion.SiONData;
import org.si.sion.SiONDriver;
import org.si.sion.SiONVoice;
import org.si.sion.effector.SiEffectStereoReverb;
import org.si.sion.events.SiONTrackEvent;
import org.si.sion.utils.SiONPresetVoice;
[SWF(backgroundColor="0xffffff")]
public class sion_sample extends Sprite
{
private static const W:int=640;
private static const H:int=400;
private var bmp:Bitmap;
private var bmpd:BitmapData;
private var canvas:Sprite;
private var container:Array;
private var driver:SiONDriver;
private var mainMelody:SiONData;
private var effect:SiEffectStereoReverb;
public function sion_sample()
{
// ステージ
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
stage.quality=StageQuality.MEDIUM;
stage.frameRate=40;
// 変数の初期化
canvas=new Sprite;
bmpd=new BitmapData(W, H, false, 0x000000);
bmp=new Bitmap(bmpd);
driver=new SiONDriver;
effect=new SiEffectStereoReverb;
container=[];
addChild(bmp);
onResize();
// MMLコマンドを作成(かえるの歌を3つで輪唱)
var str:String="";
str+="%t0,1,1 t100 %6@0cdefedcr %6@0efgagfer %6@0crcrcrcr l8 %6@0ccddeeff l4 %6@0edc;";
str+="%t0,1,1 t100 rrrrrrrr %6@0cdefedcr %6@0efgagfer %6@0crcrcrcr l8 %6@0ccddeeff l4 %6@0edc;";
str+="%t0,1,1 t100 rrrrrrrr %6@0rrrrrrrr %6@0cdefedcr %6@0efgagfer %6@0crcrcrcr l8 %6@0ccddeeff l4 %6@0edc;";
// compile() メソッドであらかじめ SiONData を作っておく
mainMelody=driver.compile(str);
// 音色を変更
var presetVoice:SiONPresetVoice=new SiONPresetVoice;
var voice:SiONVoice=presetVoice["valsound.guitar1"];
mainMelody.setVoice(0, voice);
// エフェクトの設定
effect.initialize();
driver.effector.initialize();
driver.effector.connect(0, effect);
// 音が鳴るときのイベント
driver.addEventListener(SiONTrackEvent.NOTE_ON_FRAME, onNoteOn);
// 再生開始
driver.play(mainMelody, false);
// 各種イベントの追加
stage.addEventListener(Event.RESIZE, onResize);
addEventListener(Event.ENTER_FRAME, onFrame);
}
// note on(音が鳴る時)
private function onNoteOn(e:SiONTrackEvent):void
{
var ball:Ball=new Ball(e.note - 65);
canvas.addChild(ball);
container.push(ball);
ball.x=W / 2;
ball.y=H / 2 - 50;
}
// リサイズイベント関数
private function onResize(e:Event=null):void
{
bmp.x=(stage.stageWidth - W) / 2;
bmp.y=(stage.stageHeight - H) / 2;
}
// 毎フレーム実行する関数
private function onFrame(e:Event):void
{
var len:int=container.length - 1;
while(len >= 0)
{
var ball:Ball=container[len]as Ball;
ball.render();
if (ball.alpha <= 0)
{
container.splice(len, 1);
canvas.removeChild(ball);
ball=null;
}
len--;
}
bmpd.fillRect(bmpd.rect, 0x000000);
bmpd.draw(canvas);
}
}
}
// ボールクラス
import flash.display.Shape;
import flash.filters.GlowFilter;
class Ball extends Shape
{
private static const COLOR:Array=[0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff, 0xffffff];
private static const COLOR_N:int=7;
private var param:int;
private var yVel:Number;
private var drag:Number;
private var shrink:Number;
private var gravity:Number;
public function Ball(param:int)
{
// パラメータの初期化
this.param=param * 1.5;
drag=0.99;
shrink=0.99;
gravity=1;
yVel=20 * Math.random() - 10;
// 円を書く
var c_index:int=COLOR_N * Math.random() >> 0;
var color:uint=COLOR[c_index];
graphics.beginFill(color, 1);
graphics.drawCircle(0, 0, 10);
graphics.endFill();
filters=[new GlowFilter(color, 1, 16, 16, 4, 2)];
}
// 計算用関数
public function render():void
{
alpha-=0.01;
x+=param;
y+=yVel;
yVel*=drag;
yVel+=gravity;
scaleX=scaleY*=shrink;
// バウンド処理
if (y > 360)
{
y=360;
yVel=-yVel * 0.5;
}
}
}

One Trackback
[...] SiONの練習 – Sakef Bloghttp://sakef.jp/blog/2010/09/sion01/ [...]