ActionScript日記 - サウンドのリアルタイム生成(5)
追記:早速バグがあったので修正&機能追加しました。(バージョン051)
追記2:MML初心者の方は、第3回の記事をご覧ください。慣れてる方はこの記事の続きをどうぞ。
予想外の反響に吃驚中のFlMML。
というかJSMMLのおかげで一気に広まった感がありますね。
ブログに貼り付けられるようにっていうのは自分も考えてたんですけれども、「JavaScriptで音が出る」ってインパクトが大きかったんでしょうね。これは思いつかなかった。
早速スーパーマリオのテーマを打ち込むひとが現れたりしてスゴイ面白いです。
それから 1-click Award の『オマケクリック』で使ってもらったのも大きいですね。
ビジュアルとの同期についてコメントをもらったので、今回はその辺を拡張してみました。

だいたい合ってますよね?
処理の高速化と機能追加もしましたよ。

ソース、使い方が見たい方は続きをどうぞ。
このMMLは大文字・小文字の区別をしません。
CDEFGAB | 音名。ドレミファソラシに対応。後に音の長さを指定できます。八分音符のドなら C8 など。 |
R | 休符。これも同様に長さを指定できます。 |
T[n] | テンポ指定。BPM。 |
O[n] | オクターブ指定。0~8まで。 |
L[n] | デフォルト音長指定。 |
V[n] | ベロシティ(音量)指定。0~15まで。 |
< | オクターブを上げます。 |
> | オクターブを下げます。 |
& | タイまたはスラー。C2&C8と書けばタイ、C&D&Eと書けばスラー。 |
;(セミコロン) | 次のトラックへ移ります。 |
@[n] | 音色を選びます。0:サイン波/1:ノコギリ波/2:三角波/3:パルス波/4:ホワイトノイズ。 |
@E1,[n],[n],[n],[n] | エンベロープの設定。attack、decay、sustain、releaseの順で、それぞれ0~127まで。 |
Q[n] | ゲートタイムの割合の指定。ある音を再生するとき、実際には指定された音長のn/16だけが発音され、残りの時間は休符になります。 |
/:[n] ~ / ~ :/ (スラッシュ・コロン~スラッシュ~コロン・スラッシュ)[new] | 繰り返しの指定。「/:」から「:/」の間をn回繰り返します。最終ループのときは「/」でループを抜けます。「/」は省略可能。n省略時は2回繰り返し。 |
@n[n] [new] | ノイズの周波数設定。0~127で、大きいほど低い感じになります。 |
@w[n] [new] | @3パルス波を選択しているときのパルス幅(デューティ比)をパーセントで指定します。0~100でデフォルトは50。 |
ソースはここに。ライセンスは修正BSDにしておきます。
音と同期させるためのコードは以下のとおり。
public function onSignal(tick:uint, event:int):voidみたいな関数を作って
mml = new MML(); mml.onSignal = onSignal; mml.setSignalInterval(96);とすると4分音符間隔で onSignal関数が呼び出されます。FlMMLは4分音符を96ticksとしていますので、8分音符にしたければ48、16分音符なら24ですね。
引数tickに演奏開始時からの経過tickが入っています。MML.getGlobalTick()で取得することもできます。
eventは今のところ0固定です。
Timerを使っている都合上、アプリケーションのフレームレートが低い場合はそこに引っ張られてしまいます。ご注意ください。
あと、急いで作ったのでバグがありそうです。何かあったら教えてください…。
今回の四角形をたくさん出したコードは以下のとおり。簡単だと思うんですけど、どうすか?
package { import flash.display.*; import flash.text.*; import com.txt_nifty.sketch.flmml.*; public class SyncTest extends Sprite { private var m_mml:MML; private var m_cnt:int; private var m_label:TextField; public function SyncTest() { m_mml = new MML(); m_mml.onSignal = onSignal; m_mml.setSignalInterval(24); // quater note: 96ticks play("t120v12o4l16@4@e1,0,6,0,0 /:8 v13c v8c v11c v8c @e1,0,15,0,0v13c @e1,0,6,0,0 v8c v11c v8c:/"); m_label = new TextField(); m_label.text = ""; addChild(m_label); } public function play(mml:String):void { m_mml.play(mml); } public function onSignal(tick:uint, event:int):void { m_label.text = tick.toString(); var x:int = Math.random() * 400 + 60; var y:int = Math.random() * 200 + 60; var w:int = Math.random() * (10) + 6; var h:int = Math.random() * (10) + 6; if (tick < 96*2*8) { if ((tick / 96) % 2 == 1) { w += 30; h += 30; } graphics.beginFill(Math.random()*0xffffff); graphics.lineStyle(0, 0x000000); graphics.drawRect(x-w, y-h, w*2, h*2); graphics.endFill(); } } } }
« ActionScript日記 - 高速化 | トップページ | はてなおそるべし。 »
「ActionScript 3.0」カテゴリの記事
- FlMML - リングモジュレーターとSync(2009.07.26)
- FlMML - ファミコンDPCM(2009.05.16)
- キー入力のレベル、トリガ、リピートを取得(2009.05.06)
- FlMML - エクスプレッション(2009.05.03)
- FlMML - 引数つきマクロ(2009.04.12)
「FlMML」カテゴリの記事
- FlMMLリポジトリの引越し(2011.02.05)
- FlMML - リングモジュレーターとSync(2009.07.26)
- MML対応Twitterクライアント(2009.07.24)
- FlMML - DPCM変換ツール(2009.05.17)
- FlMML - ファミコンDPCM(2009.05.16)
コメント
この記事へのコメントは終了しました。
トラックバック
この記事へのトラックバック一覧です: ActionScript日記 - サウンドのリアルタイム生成(5):
» MMurL URL で音楽を鳴らす [言語ゲーム]
もしかしたらもう誰かが作ってるかも知れないけど、ActionScript日記 - サウンドのリアルタイム生成(5)http://sketch.txt-nifty.com/blog/2007/10/actionscript_cf18.html を見て何か面白い事が出来ないかなと思ってやってみた。MML というのは音楽を鳴らすためのナツカ... [続きを読む]
» [曲関連][pc等]Hatenaにmml記法 [げろみ日記]
細かい所であまり他サイトにはない機能のあるHatenaですが、とうとうmmlで曲を鳴らせる記法までついたようです。2ちゃんDTM板でもmmlを表記して鳴らすスレはありますけど、そちらが専用ツールが必要なのに対し、こちらはフラッシュ環境があればそのままいけるぽい。 ウクレ... [続きを読む]
» テキストで音楽を奏でる「メロディ再生記法」のMovableTypeプラグイン [技林ブログ]
昔懐かしきFM音楽館(MSX・FAN)を彷彿とさせますね。... [続きを読む]
» [日記] MMLとか [shotaro_tsujiの出発停止!]
9月10日にMMLをこの日記に書いていた。どうやらスーパープレ記法でmmlと書いていた様だ。どうやら俺は未来予知が出来たらしい。 だがまともに再生出来なかったので修正。 でもまともに再生出来ない。これが再生出来ないと将軍様に失礼。とりあえず調の設定だけでも対応して... [続きを読む]
おおお!すばらしすぎる!
FPS高めで使えばいいのですね。
早速アップデートさせていただきますー
投稿: kampei | 2007.10.10 04:29
おお、修正BSDライセンスでの公開、ありがとうございます。
MML の新しい記法の追加もすばらしいですね!
> mml.onSignal = onSignal;
AS3 っぽくだと、Event を投げて
mml.addEventListener(MMLEvent.SIGNAL, mySignal);
みたいにイベント登録して使うのが一般的ですね。
投稿: yuichi tateno | 2007.10.10 12:08
>kampeiさん
MMLの中にシグナル発信コマンドを埋め込めるようにしたいな~という予定もありますので、よければそのときまた使ってやってください。
>yuichi tatenoさん
あ、やっぱりそうですよね(^^:
そんな気はしたんですが、よく分からなかったので、popforgeもこんな感じだからいいか~と適当に実装してしまいました。
ちょっと勉強したら仕様変えちゃうかもしれません。
そろそろ、常に最新版を置いておくようなページも作ったほうがよさそうですねぇ。
投稿: おー | 2007.10.11 00:24
とりあえずタグをつけてお茶を濁してみる。
投稿: おー | 2007.10.11 00:49
更新できなくなる前に少しだけいじったものを投下。
http://homepage3.nifty.com/sketch/flash/flmml052.lzh
ライブラリ的にはマスターボリュームをつけただけですけれども。
投稿: おー | 2007.10.12 02:57