note.x

しばらくの間、超多忙状態が続きそうなのでショボいデータでお茶を濁しておく。
前回のpcm同期ネタはリズムというよりSEみたいな使い方だったので、もうちょっとまともにリズム刻んでみるテスト。

(要:FlashPlayer10)

いい感じのが見つからなくて、スネアのみOPM。
途中で投げ出した感がそこはかとなく漂っておりますな。
さっさと仕事終わらせよう。

090710追記
肝心な事を何も書いてなかった。
当初、前回のpcm同期テストと同じく、mp3ファイルを外部読み込みしようとしたところ、激しくレイテンシーが発生してしまった。mp3ファイルとかの圧縮音源はその仕様上データの前後に無音部分が出来ちゃうらしく、これが原因だった模様。この辺りの事情、恥ずかしながら今回初めて知った。前回はテンポがゆっくり目だったからなのか、全然気がつかなかった。

そこで今回は、AIFFで保存したデータをFlashに読み込んで、mp3圧縮を指定した上でswfを書き出しておき、このswfを外部読み込みして該当のSoundインスタンスを生成した。こうすることで遅延なく発音するpcmパートが完成。Flashに読み込む段階で、AIFFやWAV保存してあることがポイントみたいだ。


SiON使って、UIにSEを付けたりしてみるテスト。

(要:FlashPlayer10)

マウスイベントなんかに連動して音を鳴らす場合、今まではmp3ファイル読み込んで再生してたけど、SiONを使うことで、PSG / FM / WaveTable / PCMなどの多彩な音源で、しかもラクしてサウンド制御ができる。個人的にはOPMが鳴るってだけで抱かれてもいいと思ったけど、トータルに音の制御ができるという側面はコンテンツ制作する上でとっても有用。

例えば、下記のようなコードで音の鳴るボタンが作れる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package
{
    import flash.display.*;
    import flash.events.*;
 
    import org.si.sion.*;
 
    [SWF(backgroundColor=0x000000)]
    public class main extends Sprite
    {
        private var driver:SiONDriver;
        private var sinWave:SiONVoice;
 
        public function main()
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        public function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
 
            stage.frameRate = 60;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.quality = StageQuality.BEST;
 
            initSiON();
        }
 
        private function initSiON():void
        {
            //SiONDriverをスタンバイ
            driver = new SiONDriver();
            driver.play();
 
            //音色定義(%5, @0 = sin波)
            sinWave = new SiONVoice(5,0);
 
            //UIを定義
            var soundButton:Sprite = new Sprite();
            soundButton.graphics.beginFill(0x0099cc);
            soundButton.graphics.drawRoundRect(0, 0, 120, 120, 4, 4);
            soundButton.graphics.endFill();
            addChild(soundButton);
            soundButton.x = 20, soundButton.y = 20;
 
            soundButton.addEventListener(MouseEvent.ROLL_OVER, onrollover);
            soundButton.useHandCursor = true;
        }
 
        public function onrollover(e:MouseEvent):void
        {
            //ノート番号90番(オクターブ7の「ファ」)の音を
            //事前に定義した音色(sinWave)で鳴らす。
            //第3引数:音長(1 = 16分音符), 第4引数:発音までのディレイ
            driver.noteOn(90, sinWave, 1, 0);
        }
    }
}

音色定義については、SiON MMLリファレンス「音色関連 – ‘%’,'@’の第1引数」の項を参照。

音色定義を

var sawWave:SiONVoice = new SiONVoice(5,1);    // ノコギリ波
var triWave:SiONVoice = new SiONVoice(5,4);    // 三角波
var squareWave:SiONVoice = new SiONVoice(5,5); // 矩形波

などと差し替えることで違う音色にできる。PSG / FM / WaveTable 音源については、使いこなせれば、別途音源データを用意せずに、コーディングだけで多彩な音を鳴らすことができる反面、音色定義自体がそれなりの知識と慣れを要求するので、UIサウンドとしてお手軽にSiONを活用することを考えた場合、swfに埋め込んだ、もしくは外部から読み込んだmp3サウンドをSiONで制御するのが良いんじゃないかと思う。例えば以下のような感じで。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package
{
    import flash.display.*;
    import flash.events.*;
    import flash.media.*;
 
    import org.si.sion.*;
 
    [SWF(backgroundColor=0x000000)]
    public class main extends Sprite
    {
        private var driver:SiONDriver;
        private var pcmsound:SiONVoice;
 
        [Embed(source='hoge.mp3')]
        private var hogeSound:Class;
 
        public function main()
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        public function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
 
            stage.frameRate = 60;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.quality = StageQuality.BEST;
 
            initSiON();
        }
 
        private function initSiON():void
        {
            //SiONDriverをスタンバイ
            driver = new SiONDriver();
            driver.play();
 
            //音色定義(PCMサウンド)
            var hoge:Sound = new hogeSound();
            driver.setSamplerSound(90, hoge);  //ノート番号90番に、Embedしたmp3サウンドを割り当て
            pcmsound = new SiONVoice(10);
 
            //UIを定義
            var soundButton:Sprite = new Sprite();
            soundButton.graphics.beginFill(0x0099cc);
            soundButton.graphics.drawRoundRect(0, 0, 120, 120, 4, 4);
            soundButton.graphics.endFill();
            addChild(soundButton);
            soundButton.x = 20, soundButton.y = 20;
 
            soundButton.addEventListener(MouseEvent.ROLL_OVER, onrollover);
            soundButton.useHandCursor = true;
        }
 
        public function onrollover(e:MouseEvent):void
        {
            //ノート番号90番(mp3サウンドを割り当てた場所)の音を鳴らす。
            driver.noteOn(90, pcmsound, 1, 0);
        }
    }
}

setSamplerSoundは、通常0-127までのノート番号に任意のSoundを割り当て可能。さらにバンク切り替えで128-255まで定義しておくことができる。

また、driver.noteOn()の代わりに driver.sequenceOn() を使うことで、事前に定義したMMLを再生することも可能。

driver = new SiONDriver();
var mml:SiONData = driver.compile("l16 o6 ffffre-rgrf2;l16 o6 c>bb-argrb-ra2;");
driver.play();

sinWave = new SiONVoice(5,0);
driver.sequenceOn(mml, sinWave, 0, 0, 1, 3);

driver.sequenceOn()は、別途演奏中のMMLシーケンスとタイミングを合わせて再生を乗せることができたりするあたりの仕様にニヤリとさせられた。

加えて、delay, reverb, chorus 等のエフェクトや、low/high pass filter等のフィルタも備えているため、かなり自由度の高い音作りをすることもできる(このエントリ冒頭のデモでは、reverbをon/offできるようにした)
SiONで使えるエフェクトについては、SiON MMLリファレンス「エフェクタ接続」の項を参照。

ということで、SiONはオッサンの懐古主義を満足させるためだけのものではなく(オレにとってはここも超重要なのだけど)、Flashによるコンテンツ制作におけるサウンド面の実装を容易に、表現力豊かにしてくれる、とても有り難いライブラリなのですな。


週末はSiONの日。

pcmとFMを同時に鳴らすテスト。
最終的には、自作の.mdxを全部SiONに移植したいので、.pdxからpcmを取り出してmp3化する方法も併せて模索。

pdxをバラすのに、dos用mxdrvのpdexを使用。取り出したpcmをpcm2wavで、wavファイルに変換後mp3化した。この辺はwindows環境でないとツールが全然無い。マカーにとっては寂しい限り。

ということで出来た。FM8ch + PCM3ch構成の「Palace」米光アレンジモドキ。

(要:FlashPlayer10)

次はFM8ch+PCM8chなネタで、mxdrv+pcm8をFlashで復元だー。


ファルコム音楽フリー宣言とは、日本ファルコム株式会社(以下、当社)のすべての楽曲を自由にご利用していただくことを目的とした宣言です。
ファルコム音楽フリー宣言

ゲームのサントラって、ゲーム自体をやってない人は絶対買わないだろうしなぁ。権利で囲っておくよりも放出しちゃって、そこいら中で聴ける状態にしたほうが、結果的に認知が上がってうわーいっていう意図なのかしら?今さら?とかそんな大人の事情は置いといて素直に喜んでおく。
ファルコム最高ーっ!!

というわけで、イース2のOP「To Make the End of Battle」をSiONで鳴らしてみる。

(要:FlashPlayer10)

(c) Nihon Falcom Corporation

この頃のfalcomは本当にかっこよかったなぁ。


imitatorIntro(要:FlashPlayer10)※音入り注意

SiON と PV3D を使って Executable Music な Intro モドキで、デモシーンごっこ(いわゆる現実逃避)。
かなりCPUパワー使うので、比較的新しめのマシンでないとツラいかも。
なるべく低域の出る環境で音を出してもらえると少しはマシに聴けます。

NoteOnイベント使って、キックとクラッシュシンバルに同期させて画面に変化つけてるわけですが、こういうのがお気楽にできちゃうSiONはやっぱり偉大ですよ。ノート番号も取得できるので、メロディに同期して歌詞が出るとかもできそう。
トンネルエフェクトは、Pixeleroのコード

しかしまぁ、己のセンスの古さに打ちひしがれる思いですな。
んでも、作っててかなり面白かった。
ActionScriptでscenerのマネゴトするのは趣味としていいかもなー。


前回に続いて、エンジョイSiON。

聖剣2ネタもう一発。
lm2_01.txt
もともと、FM8ch + PCM2ch で構成されてたデータをFMのみに変更。シンバルって難しい。

プレーヤーも作ってみた。(要:FlashPlayer10)

一時停止から復帰させるのと、#END検出して自動停止する方法がわからなかったんで、まだ仮ということでひとつ。
09/05/24追記:SiON 0.5.3のおかげで、問題解決。

MML Editor上で再生するほうがウレシイのが悲しい…。これってwonderflと同じ感覚なんだろうなぁ。プレーヤー作るなら、mmdsp並に作り込まないと説得力に欠ける。せめてスペアナと、鍵盤表示くらいは実装したい感じ。


FlashでOPMが鳴る時代ですよ。SiONスゲーっ!!
ということで、keim:SiさんSiON用に、mdxのMMLを移植してみた。

lm2_06.txt
これを、SiOPM MML Editorでloadすると聞ける。

一応mp3も作ってみた。
lm2_06.mp3

SiONなら、もう少し豪華にできそうだったけど、あえて当時のまま8トラックOPMオンリーで。当時の音がするよ〜、ショボい打ち込みだけど懐かしすぎて泣けた。

これは他のも移植したい!…けどpdxにしちゃったpcmデータをどうしようかな。

追記:ひっそりと修正。テンポ遅すぎた。