SiONの練習

Filed under AS3, SiON



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

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

Post a Comment

Your email is never published nor shared.