Master - 続・ASoundのプロパティについて-
なんだかえらく間が開いちゃったけど、ASoundのプロパティの続きを書くことにした。
前回、Envelop、Filter、Effects、そしてMasterについて言及しますと宣言していたけど、Max/MSPのベンキョを進めているうちに、設計変更したくなったのでペンディング。今回はMasterについてのみ言及します。
masterプロパティがASoundの目玉なのは前回でも触れたが、まさしくマスターピース。これに関しては基本的に設計変更はない予定。ではいったいどういった設計かと言うとDisplayObjectにおけるstageプロパティを思い浮かべてもらうと分りやすい。
var ins:Instrument = new Instrument(); ins.master; ins.master.volume = 1; var sprite:Sprite = new Sprite(); sprite.stage; sprite.stage.scaleX = 1;
という感じで、stage.scaleX
を変更すると全体の横幅が変更されるように、master.volume を変更すると全体の音量(つまりマスターボリューム)が変更される。
さらにstageがswf上、完全に単一の存在であるようにmasterも単一の存在。外部からswfをロードした場合も同一のmasterを参照する。所謂シングルトンクラスというわけ。
で、ここからがポイント。
ASoundではMasterクラスのみが、Soundインスタンスを保持し、実際にバイナリデータをSoundインスタンスに書き込む。Instrumentクラスや、SinOSCなどのオシレーター系クラスはサンプリングデータを保持するだけで直接Soundインスタンスを扱いはしない。実質的に、MasterクラスはDAC(デジタルアナログコンバーター)として機能している。
POPFORGEでは、バッファー毎にnew Sound()をおこなうSoundFactory方式が採用されていたが(これはFP9をハックする上でそうせざるを得なかった訳だけど)、ASoundではmasterが生成され、swfが終了するまで、単一のSoundインスタンスにバッファを書き込んでゆく。どちらの方式が優れているかは一概に言えないが、個人的には前者はSEやシーケンサー等に向いていて、後者はDSPとかインスタレーションに向いているんじゃないかと思う。
また、ASoundの単一Sound方式だと、アタックのタイミング(音が成るタイミング)をバッファーベースで設定できるので遅延がほぼ発生しない。これをEnterFrameやTimerEventで行うと、フレーム落ちやらで遅延が生じる。fpsに依存しない時間管理ができるので、個人的にはとてもうれしい。(ひょっとすると音響以外の部分でもなにかしらの役に立つんじゃないかな)
気になるメモリ効率だけど、これはSampleDataEvent毎に解放される。なので、メモリリークの心配はない。また、n個のサイン波を鳴らす場合をSoundFactory方式と単一Sound方式で比較してみたところ20個が分水領となり、20以下だと前者が有利で、20以上は後者が有利となった。(CPUの負荷を観測)
とまあ、そんな感じ。
そしてオマケ。
masterがstageと同じく単一の存在なので、ロードしたサブswfからもmasterは同一になる。という事は元swfとロードswfでタイミングの同期が簡単にとれる。つまり任意のタイミングでswfをロードしても、必ず意図したタイミングで鳴らすことができる。ここら辺をうまくやってライブコーディングが面白くなればな〜と思う。