Packagesora.graybox
Classpublic class GrayBox
InheritanceGrayBox Inheritance Object

GrayBoxクラスはGrayBoxの音源システムの基幹クラスで、このオブジェクトを中心に構築されます.

GrayBoxオブジェクトはモジュラーホストとして機能し、 実際の音声合成などの処理を行うモジュールを接続して管理運用します。 この音源システムはメインプログラムの音声処理部分(バッファリング、ストリーミング)等に組み込んで運用します。

実際の利用例(ノイズジェネレータのサンプルプログラム)

============= Main.as =============
package {
import flash.display.Sprite;
import flash.events.SampleDataEvent;
import flash.media.Sound;
import flash.utils.ByteArray;
import sora.graybox.GrayBox;

public class Main extends Sprite {
    
    private var _sound:Sound;  // ストリーミング再生を行うオブジェクト
    
    public const AUDIO_CHANNELS:int = 2;  // オーディオチャンネル数
    public const SAMPLE_RATE:Number = 44100.0;  // サンプリングレート
    public const BLOCK_SIZE:int = 4096;   // ブロックサイズ(バッファサイズ)
    public var audioBuffer:Vector.<Vector.<Number>>;  // オーディオバッファ
    public var grayBox:GrayBox;         // GrayBoxシステム基幹オブジェクト(モジュラーホスト)
    public var noiseGen:NoiseGenerator; // ノイズジェネレーター(モジュール)
    
    // 音声データ要求時実行のイベントハンドラー(AFLASH,AIR環境の場合)
    private function _sampleDataEvent(e:SampleDataEvent):void {
    // オーディオバッファのクリア -->
        var _outL:Vector.<Number> = audioBuffer[0],
            _outR:Vector.<Number> = audioBuffer[1];
        for (var i:int = 0; i < BLOCK_SIZE; i++) {
            _outL[i] = 0.0;
            _outR[i] = 0.0;
        }
    // GrayBoxによる音声処理 -->
        // GrayBox.process()メソッドを使用して音声処理を行います。
        // 第1引数 : 書き込みを行うオーディオバッファ
        // 第2引数 : 書き込み開始フレーム
        // 第3引数 : 書き込みフレーム数
        // ・今回はオーディオバッファ全体を使うので、開始フレームが0、書き込みフレーム数が4096
        // ・スロットナンバー0から順にモジュール側のIGrayBoxModule.process()メソッドが呼ばれます。
        grayBox.process(audioBuffer, 0, BLOCK_SIZE);
    // オーディオバッファからストリームへ書き込み -->
        var _stream:ByteArray = e.data;
        for (i = 0; i < BLOCK_SIZE; i++) {
            _stream.writeFloat(_outL[i]);
            _stream.writeFloat(_outR[i]);
        }
    }
    // コンストラクター
    public function Main():void {
    // エントリーポイント -->
    // ストリーミング再生を行うオブジェクト構築 -->
        _sound = new Sound();
    // オーディオバッファ作成 -->
        audioBuffer = new Vector.<Vector.<Number>>(2, true);
        audioBuffer[0] = new Vector.<Number>(BLOCK_SIZE, true); // チャンネル L
        audioBuffer[1] = new Vector.<Number>(BLOCK_SIZE, true); // チャンネル R
    // GrayBoxの構築 -->
        // 第1引数 : ブロックサイズ         ( 1~ ) FLASH,AIR環境は2048~8192フレーム
        // 第2引数 : サンプリングレート[Hz] ( 1~ ) FLASH,AIR環境は44100Hz固定
        // 第3引数 : オーディオチャンネル数 ( 2~ ) FLASH,AIR環境はLR2チャンネル固定
        // 第4引数 : モジュールスロット数   ( 1~ ) 今回はモジュールが1つなので1
        // ・初期値は必須パラメーターですが、構築時に確定できない場合は暫定値で構いません。
        //   その場合はストリーミングを開始する前に確定させてください。
        //   関連メソッド
        //   ブロックサイズ -> GrayBox.setProcessBlockSize()
        //   サンプリングレート -> GrayBox.setSampleRate()
        //   チャンネル数 -> GrayBox.setAudioChannels()
        //   スロット数 -> GrayBox.setModuleSlots()
        grayBox = new GrayBox(BLOCK_SIZE, SAMPLE_RATE, AUDIO_CHANNELS, 1);
    // 各GrayBoxモジュールの構築 -->
        // ノイズ音を出力し続けるモジュール
        noiseGen = new NoiseGenerator();
    // モジュールの接続 -->
        // GrayBox.attachModule()メソッドを使用し、ホストへモジュールを接続します。
        // 第1引数 : 接続するスロットのインデックス
        // 第2引数 : 接続するモジュールオブジェクト
        // 接続されたモジュールは接続スロットの先頭から順に処理が行われます。
        grayBox.attachModule(0, noiseGen);
    // ストリーミングの開始 -->
        _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, _sampleDataEvent);
        _sound.play();
    }
}
}
======== NoiseGenerator.as ========
package {
    import sora.graybox.GrayBox;
    import sora.graybox.IGrayBoxModule;
    import sora.graybox.ProcessData;
// ノイズジェネレーターモジュール
public class NoiseGenerator implements IGrayBoxModule {
    public var volume:Number = 0.1;  // 音量
    // コンストラクター
    public function NoiseGenerator():void {}
// sora.graybox.IGrayBoxModule -->
    // ホストのサンプリングレートが変更された時に呼ばれるメソッド
    // GrayBox.setSampleRate() -> このメソッド
    public function updateSampleRate(sampleRate:Number):void{}
    // ホストのオーディオチャンネル数が変更された時に呼ばれるメソッド
    // GrayBox.setAudioChannels() -> このメソッド
    public function updateAudioChannels(ch:int):void{}
    // ホストのプロセスブロックサイズが変更された時に呼ばれるメソッド
    // GrayBox.setProcessBlockSize() -> このメソッド
    public function updateProcessBlockSize(size:int):void{}
    // ホストのGrayBox.resetModules()メソッドが使用された時に呼ばれるメソッド
    // GrayBox.resetModules() -> このメソッド
    public function resetModule():void{ volume = 0.1; }
    // ホストのGrayBox.initiModules()メソッドが使用された時に呼ばれるメソッド
    // GrayBox.initiModules() -> このメソッド
    public function initiModule():void{ volume = 0.1; }
    // このモジュールがホストへ接続された時に呼ばれるメソッド
    // GrayBox.attachModule() -> このメソッド
    public function connectModule(host:GrayBox):void{}
    // このモジュールがホストから取り外された時に呼ばれるメソッド
    // GrayBox.detachModule() -> このメソッド
    public function disconnectModule():void{}
    // このモジュールが接続されているスロットの、バイパス状況が更新された時に呼ばれるメソッド
    // GrayBox.bypassProcess() -> このメソッド
    public function updateBypassStatus(bypass:Boolean):void{}
    // ホストのGrayBox.startProcess()メソッドが使用された時に呼ばれるメソッド
    // GrayBox.startProcess() -> このメソッド
    public function startProcess():void{}
    // ホストのGrayBox.stopProcess()メソッドが使用された時に呼ばれるメソッド
    // GrayBox.stopProcess() -> このメソッド
    public function stopProcess():void{}
    // ホストのGrayBox.suspendProcess()メソッドが使用された時に呼ばれるメソッド
    // GrayBox.suspendProcess() -> このメソッド
    public function suspendProcess():void{}
    // ホストのGrayBox.resumeProcess()メソッドが使用された時に呼ばれるメソッド
    // GrayBox.resumeProcess() -> このメソッド
    public function resumeProcess():void{}
    
    // ホストが音声処理を実行した時に呼ばれるメソッド
    // GrayBox.process() -> このメソッド
    public function process(procData:ProcessData):void {
    // 音声処理準備 -->
        // ProcessDataオブジェクトはホストから音声処理に必要な情報を受け取り、
        // 各モジュールへ伝えるオブジェクトです。
        // ここではホストから渡されたオーディオバッファを参照して音声処理行います。
        var _outL:Vector.<Number> = procData.audioOut[0],  // 音声出力L
            _outR:Vector.<Number> = procData.audioOut[1],  // 音声出力R
            _startFrame:int = procData.offsetFrames,  // 音声処理開始フレーム
            _endFrame:int = _startFrame + procData.sampleFrames;  // 終了フレーム
    // 音声処理 -->
        for (var i:int = _startFrame; i < _endFrame; i++) {
            var _n:Number = Math.random() volume; // ノイズ音の生成
            // オーディオバッファに対して加算代入
            _outL[i] += _n; 
            _outR[i] += _n;
            // このモジュールしか音声処理を行わない場合は代入だけでも良い
            // _outL[i] = _n; 
            // _outR[i] = _n;
        }
    }
}
}
===================================

See also

sora.graybox.IGrayBoxModule
sora.graybox.MidiEvent
sora.graybox.ProcessData


Protected Properties
 PropertyDefined By
  _audioLatency : Number = 0.0
GrayBox
  _bypassFlag : Vector.<Boolean> = null
GrayBox
  _defAudioLatency : Number = 0.0
GrayBox
  _eventList : MidiEvent = null
GrayBox
  _modules : Vector.<IGrayBoxModule> = null
GrayBox
  _moduleSlots : int = 0
GrayBox
  _processData : ProcessData = null
GrayBox
Public Methods
 MethodDefined By
  
GrayBox(blockSize:int, sampleRate:Number, audioChannels:int = 2, moduleSlots:int = 4)
指定したパラメーターでGrayBoxオブジェクトを構築します.
GrayBox
  
指定したインデックスのスロットにモジュールを接続します.
GrayBox
  
audioLatency(val:Number):void
今回の音声処理のオーディオレイテンシーを設定します.
GrayBox
  
bypassProcess(index:int, bypass:Boolean):void
指定したインデックスのモジュールスロットの、オーディオプロセスのバイパスを設定します.
GrayBox
  
指定したインデックスのスロットに接続されているモジュールの接続を解除します.
GrayBox
  
音源システムのオーディオチャンネル数を取得します.
GrayBox
  
getBypassStatus(index:int):Boolean
指定したインデックスのモジュールスロットのバイパス状況を取得します.
GrayBox
  
音源システムの既定のオーディオレイテンシーの値を取得します.
GrayBox
  
指定したインデックスのスロットに接続されているモジュールオブジェクトへの参照を取得します.
GrayBox
  
音源システムのモジュールスロット数を取得します.
GrayBox
  
音源システムのオーディオプロセスブロックサイズを取得します.
GrayBox
  
getSampleRate():Number
音源システムのサンプリングレート値を取得します.
GrayBox
  
initialize():void
モジュールの接続を全て解除し、音源システムを初期化します.
GrayBox
  
接続されている全てのモジュールを初期化します.
GrayBox
  
process(audioOut:Vector.<Vector.<Number>>, offsetFrames:int, sampleFrames:int):void
今回の音声処理を行います.
GrayBox
  
接続されている全てのモジュールの状態をリセットします.
GrayBox
  
接続されているモジュールに音声処理が再開されたことを通知します.
GrayBox
  
setAudioChannels(ch:int):int
音源システムのオーディオチャンネル数を設定します.
GrayBox
  
setDefaultAudioLatency(val:Number):void
音源システムの、既定のオーディオレイテンシーを設定します.
GrayBox
  
setModuleSlots(num:int):int
音源システムのモジュールスロット数を設定します.
GrayBox
  
setProcessBlockSize(size:int):int
音源システムのプロセスブロックサイズを設定します.
GrayBox
  
setSampleRate(sampleRate:Number):Number
音源システムのサンプリングレートを設定します.
GrayBox
  
接続されているモジュールに音声処理が開始されたことを通知します.
GrayBox
  
接続されているモジュールに音声処理が停止されたことを通知します.
GrayBox
  
接続されているモジュールに音声処理が一時停止状態であることを通知します.
GrayBox
Protected Methods
 MethodDefined By
  
GrayBox
Property Detail
_audioLatencyproperty
protected var _audioLatency:Number = 0.0

_bypassFlagproperty 
protected var _bypassFlag:Vector.<Boolean> = null

_defAudioLatencyproperty 
protected var _defAudioLatency:Number = 0.0

_eventListproperty 
protected var _eventList:MidiEvent = null

_modulesproperty 
protected var _modules:Vector.<IGrayBoxModule> = null

_moduleSlotsproperty 
protected var _moduleSlots:int = 0

_processDataproperty 
protected var _processData:ProcessData = null

Constructor Detail
GrayBox()Constructor
public function GrayBox(blockSize:int, sampleRate:Number, audioChannels:int = 2, moduleSlots:int = 4)

指定したパラメーターでGrayBoxオブジェクトを構築します.

省略不可パラメーターはオブジェクト構築時に不明の場合は暫定値を設定しても構いません。 その場合はGrayBox.process()メソッドを実行する前に正しい値を設定してください。

Parameters
blockSize:int — 音源システムのプロセスブロックサイズを設定します。(1 - 無制限)
 
sampleRate:Number — 音源システムのサンプリングレート(Hz)を設定します。(1.0 - 無制限)
 
audioChannels:int (default = 2) — 音源システムのオーディオチャンネル数を設定します。(2 - 無制限)
 
moduleSlots:int (default = 4) — プラグインモジュールのスロット数を設定します。(1 - 無制限)
Method Detail
_clearProcessData()method
protected function _clearProcessData():void

attachModule()method 
public function attachModule(index:int, module:IGrayBoxModule):IGrayBoxModule

指定したインデックスのスロットにモジュールを接続します.

接続後、モジュールのIGrayBoxModule.connectModule()メソッドが呼ばれます。 既にモジュールが接続されている場合は、そのモジュールの接続解除を行った後に接続を行います。 モジュールの接続が解除された際にはIGrayBoxModule.disconnectModule()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

Parameters

index:int — 0から始まるスロットのインデックス値
 
module:IGrayBoxModule — 接続するモジュール

Returns
IGrayBoxModule — 正常に接続できた場合、接続したモジュールへの参照が返ります。 範囲外のインデックスを指定した場合はnullが返ります。

See also

audioLatency()method 
public function audioLatency(val:Number):void

今回の音声処理のオーディオレイテンシーを設定します.

ここで設定したレイテンシーはprocess()メソッド実行まで有効です。 実行後、既定のレイテンシーに再設定されます。

Parameters

val:Number — オーディオレイテンシーの値(mSec)

See also

bypassProcess()method 
public function bypassProcess(index:int, bypass:Boolean):void

指定したインデックスのモジュールスロットの、オーディオプロセスのバイパスを設定します.

オーディオプロセスをバイパス(true)するとモジュールの音声処理が行われません (process()メソッド実行時にIGrayBoxModule.process()メソッドがスキップされます)。 バイパスフラグ設定後、該当スロットに接続されているモジュールの IGrayBoxModule.updateBypassStatus()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

Parameters

index:int — 0から始まるスロットのインデックス値
 
bypass:Booleantrueでバイパス

See also

detachModule()method 
public function detachModule(index:int):IGrayBoxModule

指定したインデックスのスロットに接続されているモジュールの接続を解除します.

モジュールの接続が解除された際にIGrayBoxModule.disconnectModule()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

Parameters

index:int — 0から始まるスロットのインデックス値

Returns
IGrayBoxModule — 接続されているモジュールへの参照。 指定したインデックスのスロットにモジュールが接続されていない場合はnullを返します。 範囲外のインデックスを指定した場合も同様です。

See also

getAudioChannels()method 
public function getAudioChannels():int

音源システムのオーディオチャンネル数を取得します.

Returns
int — オーディオチャンネル数
getBypassStatus()method 
public function getBypassStatus(index:int):Boolean

指定したインデックスのモジュールスロットのバイパス状況を取得します.

対象のモジュールスロットがバイパスされている場合、trueを返します。 指定したインデックスのスロットにモジュールが接続されていない場合、 および範囲外のインデックスを指定した場合、trueを返します。

Parameters

index:int — 0から始まるスロットのインデックス値

Returns
Boolean — モジュールスロットのバイパス状況
getDefaultAudioLatency()method 
public function getDefaultAudioLatency():Number

音源システムの既定のオーディオレイテンシーの値を取得します.

Returns
Number — オーディオレイテンシーの値(mSec)
getModule()method 
public function getModule(index:int):IGrayBoxModule

指定したインデックスのスロットに接続されているモジュールオブジェクトへの参照を取得します.

スロットにモジュールが接続されていない場合はnullを返します。 範囲外のインデックスを指定した場合も同様にnullを返します。

Parameters

index:int — 0から始まるスロットのインデックス値

Returns
IGrayBoxModule — モジュールオブジェクトへの参照
getModuleSlots()method 
public function getModuleSlots():int

音源システムのモジュールスロット数を取得します.

Returns
int — モジュールスロット数
getProcessBlockSize()method 
public function getProcessBlockSize():int

音源システムのオーディオプロセスブロックサイズを取得します.

Returns
int — オーディオプロセスブロックサイズ
getSampleRate()method 
public function getSampleRate():Number

音源システムのサンプリングレート値を取得します.

Returns
Number — サンプリングレート値(Hz)。
initialize()method 
public function initialize():void

モジュールの接続を全て解除し、音源システムを初期化します.

初期化される内容は次の通りです。 モジュールの接続が解除された際にIGrayBoxModule.disconnectModule()メソッドが呼ばれます。

See also

initiModules()method 
public function initiModules():void

接続されている全てのモジュールを初期化します.

resetModule()メソッドと機能が重複しますが、こちらは工場出荷時に戻すような強い初期化です。 モジュールのIGrayBoxModule.initiModule()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

See also

process()method 
public function process(audioOut:Vector.<Vector.<Number>>, offsetFrames:int, sampleFrames:int):void

今回の音声処理を行います.

このメソッドを実行すると接続されているモジュールのIGrayBoxModule.process()メソッドが呼ばれます。 パラメーターの値はProcessDataオブジェクトへ渡されます。 各モジュールはメソッドを通じProcessDataオブジェクトを参照して必要な処理を行います。

なお、モジュールが接続されているスロットのバイパスフラグがtrueの場合、 IGrayBoxModule.process()メソッドは呼ばれません。

Parameters

audioOut:Vector.<Vector.<Number>> — 出力オーディオバッファ

オーディオバッファのチャンネルオーダー
index[0 ]Left
index[1 ]Right
index[2 ]Front Center
index[3 ]Low Frequency
index[4 ]Back Left
index[5 ]Back Right
index[6~]未定義
 
offsetFrames:int — オーディオプロセスブロック先頭からのフレームオフセット
 
sampleFrames:int — 処理を行うフレーム数

See also

resetModules()method 
public function resetModules():void

接続されている全てのモジュールの状態をリセットします.

initiModules()メソッドと機能が重複しますが、こちらは一時的なパラメータを戻すような弱い初期化です。 モジュールのIGrayBoxModule.resetModule()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

See also

resumeProcess()method 
public function resumeProcess():void

接続されているモジュールに音声処理が再開されたことを通知します.

モジュールのIGrayBoxModule.resumeProcess()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

See also

setAudioChannels()method 
public function setAudioChannels(ch:int):int

音源システムのオーディオチャンネル数を設定します.

設定後、接続しているモジュールのIGrayBoxModule.updateAudioChannels()メソッドを呼び、 新しいオーディオチャンネル数をモジュールに渡します。

このメソッドはプロセスブロック外で使用してください。

Parameters

ch:int — 設定するオーディオのチャンネル数(2~)。

Returns
int — 最新のオーディオチャンネル数

See also

setDefaultAudioLatency()method 
public function setDefaultAudioLatency(val:Number):void

音源システムの、既定のオーディオレイテンシーを設定します.

このメソッドはプロセスブロック外で使用してください。

Parameters

val:Number — オーディオレイテンシーの値(mSec)

setModuleSlots()method 
public function setModuleSlots(num:int):int

音源システムのモジュールスロット数を設定します.

現在のモジュールスロット数より小さい値を設定した場合、 その範囲のインデックスに接続されているモジュールの接続が解除されます。 モジュールの接続が解除された際にIGrayBoxModule.disconnectModule()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

Parameters

num:int — 設定するモジュールスロット数

Returns
int — 設定後のモジュールスロット数

See also

setProcessBlockSize()method 
public function setProcessBlockSize(size:int):int

音源システムのプロセスブロックサイズを設定します.

設定後、接続しているモジュールのIGrayBoxModule.updateProcessBlockSize()メソッドを呼び、 新しいプロセスブロックサイズの値をモジュールに渡します。 無効な値を指定した場合は何も行いません。

このメソッドはプロセスブロック外で使用してください。

Parameters

size:int — 設定するプロセスブロックサイズの値(1~)。

Returns
int — 最新のプロセスブロックサイズの値。

See also

setSampleRate()method 
public function setSampleRate(sampleRate:Number):Number

音源システムのサンプリングレートを設定します.

設定後、接続しているモジュールのIGrayBoxModule.updateSampleRate()メソッドを呼び、 新しいサンプリングレート値をモジュールに渡します。 無効な値を指定した場合は何も行いません。

このメソッドはプロセスブロック外で使用してください。

Parameters

sampleRate:Number — 設定するサンプリングレートの値(Hz)(1.0~)。

Returns
Number — 最新のサンプリングレート値(Hz)

See also

startProcess()method 
public function startProcess():void

接続されているモジュールに音声処理が開始されたことを通知します.

モジュールのIGrayBoxModule.startProcess()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

See also

stopProcess()method 
public function stopProcess():void

接続されているモジュールに音声処理が停止されたことを通知します.

モジュールのIGrayBoxModule.stopProcess()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

See also

suspendProcess()method 
public function suspendProcess():void

接続されているモジュールに音声処理が一時停止状態であることを通知します.

モジュールのIGrayBoxModule.suspendProcess()メソッドが呼ばれます。

このメソッドはprocess()メソッド外で使用してください。

See also