MML テキスト変換補助

by Sharakusai forked from flash on 2010-4-3 (diff: 555)
MML用ツールからニコニコ大百科
ピコカキコMMLに変換するための補助ツール

・Oコマンド変換o1,o2...→ [<,>]  完了。
まきまびしーくからの変換時、先にOコマンド除去→オクターブ反転で使用

SiONのVolume設定値がよくわからない。
Nコマンド、調べてみると色々面倒。マビノギでこんなの使ったか?

詳細はこちらで
ニコニコ大百科 ユーザー記事 HAL
http://dic.nicovideo.jp/u/7256003
♥0 | Line 163 | Modified 2013-07-10 13:50:21 | MIT License
play

ActionScript3 source code

/**
 * Copyright Sharakusai ( http://wonderfl.net/user/Sharakusai )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/tnlD
 */

<?xml version="1.0" encoding="utf-8"?>
<!-- forked from Sharakusai's flash on 2010-4-3 -->
<mx:Application   
	paddingTop="8" paddingLeft="8" paddingRight="8" paddingBottom="8"
	xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
<mx:Script><![CDATA[

/*
	MML テキスト変換

        まきまびしーく、3ML Editor などのツールからニコニコ大百科ピコカキコ用
        MMLに変換するための補助ツールです


    ※注意事項

    ・オクターブ反転

        逐次変換ではなく一括置換しているので「オクターブ反転」時に一時的に
        コマンドで使われていないであろう文字[j]に置換
        コメント中やマクロなどで使用されると誤変換されます。


        詳細:ニコニコ大百科 ユーザー記事
        http://dic.nicovideo.jp/u/7256003
 
*/
	
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.desktop.Clipboard;
	import flash.desktop.ClipboardFormats;
	import flash.desktop.ClipboardTransferMode;
        import org.si.sion.*;
        import org.si.sion.utils.SiONPresetVoice;
        import org.si.sion.events.*;
	import mx.collections.ArrayCollection;
	import mx.controls.*;	

	// SiONDriverクラスのインスタンスを生成
	public var driver:SiONDriver = new SiONDriver();
	// SiONPresetVoiceクラスのインスタンスを生成
	public var presetVoice:SiONPresetVoice = new SiONPresetVoice();
	// SiONVoice型変数を宣言
	public var voice1:SiONVoice;
	// SiONData型変数を宣言
	public var mainMelody:SiONData;



	// 初期化			
	private function init():void {
            driver.autoStop = true;
            driver.addEventListener(SiONEvent.STREAM_STOP,  _onStopStream);  
	}

	// Play Button
	private function onButtonClick() : void {
		
	    var melody:String = myText.text;

	    playButton.enabled = false;	
	    mainMelody    = driver.compile(melody)
			
	    //SiONVoice型変数にプリセットボイス(ギター)を設定
		
	    voice1 = presetVoice["valsound.guitar1"];
	    driver.play();
			
	    // 第一引数にSiONData、第二引数にSiONVoice、
	    // 第三引数以降は、length=0(play all of sequence), 
	    //			delay=0(no delay), quantize=2(8th beat)
		
	    driver.sequenceOn(mainMelody, voice1, 0, 0, 2);
	}

	// Stop Button
	private function onStopButtonClick() : void {
		
	    driver.stop();
	    playButton.enabled = true;	
	}

	//テキストエリア MML文字数カウント
	public function onText1Change():void{
	    var tmp:String = myText.text;
		
	    strCount1.text = String(myText.text.length) + "文字";
		
	}
	
	//クリップボードに書き出し
	public function onCopyButtonClick():void{
	    var mmltext:String;
	    mmltext = myText.text;		
	    Clipboard.generalClipboard.clear();
	    Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, mmltext);
	}

	//テキストエリアのクリア
	public function onClearButtonClick():void{
	    myText.text = "";
	}


        //	以下変換コマンド
	
        private function demo1_click():void{

            var mmltext:String = myText.text;

	    // replaceで
	    // 文字列置換します。
		
	    var myPattern:RegExp = />/g;  
	    mmltext = mmltext.replace(myPattern, "j");	// > を一旦*に変更
	    myPattern = /</g;
	    mmltext = mmltext.replace(myPattern, ">");
	    myPattern = /j/g;
	    mmltext = mmltext.replace(myPattern, "<");
		
            myText.text = mmltext;
            }
		
        private function demo2_click():void{            // オクターブの修正ルーチン
            var i:Number = 0;
            var srcindex:Number = 0;                     //source index
            var n:Number;
            var m:Number;
            var defaultOctave:Number = 4;               // オクターブ初期値4
            var srctext:String = myText.text;
            var tmpText:String;
            var nString:String;
            var myPattern:RegExp;


            while( i < srctext.length) {                                    // 先頭からチェック

                nString = srctext.charAt(i);
                if ((nString == "o")||(nString =="O")) {                          // o コマンドが見つかった
                // 次の文字が数字である  (スペースや改行の場合などあるのか?疑問)
                if ((srctext.charAt(i+1) > "0") && (srctext.charAt(i+1) < "9")) { 
                    n = Number(srctext.charAt(i+1));                             // 文字を数値に変換
                      m = n - defaultOctave;                                       // オクターブ差分を保存

                    tmpText = srctext.substring( 0 , i );

                    if (m > 0){                                                    //差分の分だけオクターブシフト追加
                     for (var j:Number = 0; j < m ; j++) { tmpText =tmpText + ">";}   
                        defaultOctave += m;                  //オクターブ更新
                        i++;                                 // 数字の分加算しておく
                    } else
                    if (m < 0){
                        for (var k:Number = 0; k > m ; k--) {tmpText =tmpText + "<";}  //  
                        defaultOctave += m;
                        i++;                                 // 数字の分加算しておく
                      } else                                   // 変化のないオクターブ指定
                    if (m == 0){
                        i++;                                 // 数字の分加算しておく
                        }



                    tmpText =tmpText + srctext.substring( i+1 , myText.text.length ); //未処理の文字列
                    srctext = tmpText;

                } // oコマンド数字処理終了
                } // End of if
else{
                // オクターブ変動のチェック
                  if (srctext.charAt(i) == ">") {defaultOctave ++;};
                if (srctext.charAt(i) == "<") {defaultOctave --;};
};
                i++;

            }; // End of While

                myText.text = srctext; // テキスト欄更新

        } // End of function

        //N(音高コマンド)を取ってしまう		
        private function demo3_click():void{
            var mmltext:String = myText.text;	
            var myPattern:RegExp = /[n|N]\d*/g;
  
	    mmltext = mmltext.replace(myPattern, "");
              myText.text = mmltext;

	    }
		
        // 小文字に変換
        private function demo4_click():void{
            var mmltext:String = myText.text;
            
            mmltext = mmltext.toLocaleLowerCase();
            myText.text = mmltext;  
	    }

        // 大文字に変換
        private function demo5_click():void{
            var mmltext:String = myText.text;
            
            mmltext = mmltext.toUpperCase();
            myText.text = mmltext;  
	    }

        // ボリューム変更 マスターボリューム設定がよくわからない。
        private function onchVolume_Change():void{

//            driver.volume = chVolume.value;
            driver.volume = 1;

	    }


        // 演奏終了
        protected function _onStopStream(e:SiONEvent) : void {
            driver.stop();
            playButton.enabled = true;
        }
	
]]></mx:Script>
<mx:Panel title="MML テキスト変換補助ツール" backgroundColor="0xC0D0D0" width="100%" height="100%" fontSize="12">
    <mx:HBox paddingTop="8" paddingLeft="8" paddingRight="8">
        <mx:Button id="playButton" label="PLAY" click="onButtonClick();" width="80" height="30" toolTip="SiON MML準拠で演奏します"/>
        <mx:Button label="STOP" click="onStopButtonClick();" width="80" height="30" toolTip="演奏中止"/>
        <mx:Button label="Copy" click="onCopyButtonClick();" toolTip="クリップボードに書き出します"/>
        <mx:Button label="Clear" click="onClearButtonClick();" toolTip="MMLテキストエリアを消去します"/>
<mx:VBox>
<mx:Label text="Volume"/>
        <mx:HSlider id="chVolume"
                    minimum="0" maximum="8" value="4"
                    dataTipPlacement="top" 
                    tickColor="black" 
                    snapInterval="1" tickInterval="1"
                    labels="[0,127]" 
                    allowTrackClick="true"
                    change="onchVolume_Change();"
                    enabled="false"  
                    liveDragging="true"/>
</mx:VBox>
    </mx:HBox>
    <mx:Label text="コマンド変換" paddingLeft="8" />
    <mx:HBox paddingLeft="8">
        <mx:Button id="demo1" label="オクターブ反転" click="demo1_click()" toolTip="オクターブ命令を反転"/>
        <mx:Button id="demo2" label="Oコマンド除去" click="demo2_click()" enabled="true" toolTip="まきまびしーく → 他ツール"/>
        <mx:Button id="demo3" label="Nコマンド除去" click="demo3_click()" enabled="false" toolTip="3MLE → 他ツール"/>	
        <mx:Button id="demo4" label="小文字" click="demo4_click()" toolTip="小文字に置換"/>	
        <mx:Button id="demo5" label="大文字" click="demo5_click()" toolTip="大文字に置換"/>	
    </mx:HBox>
    <mx:VBox paddingLeft="8" paddingRight="8" paddingBottom="8" width="100%" height="100%">
    <mx:HBox>
        <mx:Label text="MML テキストエリア"/>
        <mx:Label text="0文字" id="strCount1" />
        <mx:Label text="(演奏はSiON MML仕様準拠 大文字不可)"/>
    </mx:HBox>
    <mx:TextArea id="myText" change="onText1Change();" width="100%" height="100%"/>
    </mx:VBox>
</mx:Panel>
</mx:Application>

Forked