MML テキスト変換補助
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
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>
