8月 25 2009

SiONをやってみよう・・・基本編2:MMLイベント・トリガー

Published by admin at 23:56 under ActionScript,Sound / MIDI / Video

今回は、同梱の「イベント・トリガー」サンプルです。

イベント・トリガーとは、ノートオン(発音)、ノートオフ(消音)、時のコールバック・イベントを有効にするかどうかと言うことです。

このイベントをオンにしてリスナーを設定することで発音に同期した何らかのアクションを行うことが可能です。

■ 以下は、同梱のサンプル「EventTrigger.as」のコードです。

package {
    import flash.display.*;
    import flash.events.*;
    import org.si.sion.*;
    import org.si.sion.events.*;
    public class EventTrigger extends Sprite {
        // ドライバ・インスタンスを生成
        public var driver:SiONDriver = new SiONDriver();
        // MML data(SiONData型を宣言)
        public var mainMelody:SiONData;
        // コンストラクタ
        function EventTrigger() {
            // トリガー・コマンド (%t)を付加してコンパイルする
            mainMelody = driver.compile("%t0,1,1 t100 l8 [ccggaag4 ffeeddc4 | [ggffeed4]2 ]2");
            // トリガー用のイベントリスナーを設定
            driver.addEventListener(SiONTrackEvent.NOTE_ON_FRAME,  _onNoteOn);
            driver.addEventListener(SiONTrackEvent.NOTE_OFF_FRAME, _onNoteOff);
            addEventListener("enterFrame", _onEnterFrame);
            // 再生
            driver.play(mainMelody);
        }
        // ノート・オン時のアクション
        private function _onNoteOn(e:SiONTrackEvent) : void {
            _createNoteShape(e.note);
        }
        // ノート・オフ時のアクション
        private function _onNoteOff(e:SiONTrackEvent) : void {
        }
        // シェイプを作成
        private function _createNoteShape(noteNumber:int) : Shape {
            var shape:Shape = new Shape();
            shape.graphics.beginFill([0xff8080, 0x80ff80, 0x8080ff, 0xffff80][int(Math.random()*4)]);
            shape.graphics.drawCircle(0, 0, Math.random()*20+10);
            shape.graphics.endFill();
            shape.x = (noteNumber - 60) * 30 + 100;
            shape.y = 300;
            addChild(shape);
            return shape;
        }
        // フレーム毎のアクション
        private function _onEnterFrame(e:Event) : void {
            var imax:int = numChildren;
            for (var i:int=0; i<imax ; i++) {
                var child:DisplayObject = getChildAt(i);
                child.y -= 2;
                child.alpha *= 0.98;
                if (child.y < -30 || child.alpha < 0.1) {
                    removeChild(child);
                    imax--;
                    i--;
                }
            }
        }
    }
}

前回との大きな違いは、MMLテキストをそのまま再生するのではなく、一度”SiONData型”にコンパイルしplay()メソッドに渡しているところです。
その際、MMLにイベントトリガーを設定していますが詳細は下の図解をご覧ください。
MML(イベントトリガーを設定)
SiOPM MML reference (version 0.5.6)から

“%t”が指定されると,その後シーケンス内でノート(c-b)が指定される度に,SiONTrackEevnt.NOTE_ON_STREAM, SiONTrackEevnt.NOTE_OFF_STREAM, SiONTrackEevnt.NOTE_ON_FRAME 及び SiONTrackEevnt.NOTE_OFF_FRAME イベントが発行されます.
また,第2/3引数でノートオン/オフ時に発行するイベントの種類を指定します(0=発行しない,1=NOTE_*_FRAMEを発行,2=NOTE_*_STREAMを発行,3=両方発行).
NOTE_*_STREAM イベントは,ストリーミング時に,そのノートがレンダリングされる直前に発行されます.
一方,NOTE_*_FRAME イベントは,フレーム内でそのノートが発音されるタイミング(に近いタイミング)で発行されます.
“%e”が指定されると,指定されたタイミングで1回だけノートオンイベントが発行されます.引数は同じです.

これで、イベント・トリガーが有効になるのでイベントリスナーを設定します。

driver.addEventListener(SiONTrackEvent.NOTE_ON_FRAME,  _onNoteOn);
driver.addEventListener(SiONTrackEvent.NOTE_OFF_FRAME, _onNoteOff);

このサンプルでは、1トラックのみの再生ですが、複数トラックで同じことを行いたい場合には、同梱サンプルの「EventTrigger2.as」が参考になります。

実行サンプル(PCの音量注意!!)

flash on 2009-8-26 – wonderfl build flash online

【 関連する投稿 】

No responses yet





■ スポンサードリンク  


※ コメント及びトラックバックは、複数のスパム専用プラグインによって厳しくチェックされ、場合によっては自動的に駆除されます。

Trackback URI | Comments RSS

Leave a Reply

Get Adobe Flash playerPlugin by wpburn.com wordpress themes