LightNote  version 1.0
音声機能

音声機能の初期化

音声機能の初期化には LAudio_Init を使用します。

音声機能を使用する前(できるだけプログラムの先頭)で、1度だけ呼び出してください。

LAudio_Init();
    
LAudio_Init
    



サウンドの再生と操作

サウンドの再生と操作は、音声データを元に作成したサウンドオブジェクトを通して行います。

// サウンドオブジェクトを識別するためのサウンドハンドルが返ります
lnHandle sound_handle = LSound_Load( "sound.wav" );

// 読み込んだ音声を再生します
LSound_Play( sound_handle );
    
// サウンドオブジェクトを識別するためのサウンドハンドルを、変数 sound_handle に代入します
LSound_Load sound_handle, "sound.wav"

// 読み込んだ音声を再生します
LSound_Play sound_handle
    

サウンドの音量やピッチ、後述する3Dサウンドの位置情報は、再生中にいつでも変更することができます。
また、既に読み込まれている音声ファイルと同名のものを読み込もうとした場合、リソース節約のために音声データを自動で共有します。(Wave、Ogg のみ)


サウンドオブジェクトの作成時(上記 LSound_Load 等)には、下記のフラグで再生方法を指定することができます。
指定方法についてはリファレンスを参考にしてください。
  • LN_SOUNDPLAYTYPE_ONMEMORY
    音声を必ずオンメモリ再生します。

  • LN_SOUNDPLAYTYPE_STREAMING
    音声を必ずストリーミング再生します。

  • LN_SOUNDPLAYTYPE_AUTO (推奨, デフォルト)
    デコード後のサイズが 10000 バイト以上になる場合はストリーミング、
    そうでない場合はオンメモリ再生になります。



対応している音声ファイルフォーマット

対応している音声ファイルフォーマットは以下の通りです。
  • WAVE (RIFF waveform Audio Format)
  • MP3 (MPEG Audio Layer-3)
  • Ogg (Ogg Vorbis)
  • MIDI (Musical Instrument Digital Interface)

MIDI ファイルは DirectMusic、それ以外のファイルは XAudio2 で演奏されます。

また、Ogg と MIDI は以下の方法でループ位置を検出します。
(RPGツクールVXの仕様と同じものです)
  • Ogg のループ位置

    ファイル内に LOOPSTART、LOOPLENGTH というコメントがある場合、 それをもとにループ位置を設定します。
    LOOPSTART はループ領域の開始サンプル数、
    LOOPLENGTH はループ領域の長さのサンプル数です。

  • MIDI のループ位置

    ファイル内にコントロールチェンジ 111 番のイベントがある場合、 そこをループ開始位置として設定します。
    (複数ある場合は一番最後のものが対象になります)
    データの最後まで再生された場合、そこから再開します。



MIDI の再生について

MIDI は前述のとおり DirectMusic で演奏されますが、DirectMusic の初期化には数秒程度の時間がかかります。

MIDI を使用しないソフトでも初期化に時間がかかってしまう・・・といったことを防ぐために、DirectMusic の有無は切り替えることができます。
MIDI を使用するためにはライブラリの初期化設定で、MIDI の使用(DirectMusic の初期化)を明示する必要があります。

LConfig_SetDirectMusicUsingMode( LN_DMUSINGMODE_USE );
        
LConfig_SetDirectMusicUsingMode LN_DMUSINGMODE_USE
        

指定できる値は以下の通りです。
  • LN_DMUSINGMODE_NOTUSE (デフォルト)
    DirectMusic を使用しません。(MIDI を演奏することはできません)

  • LN_DMUSINGMODE_USE
    DirectMusic を使用します。
    環境によっては初期化に数秒程度の時間がかかります。

  • LN_DMUSINGMODE_THREAD_REQUEST
    DirectMusic を別スレッドで初期化するようにします。
    初期化等のための遅延は一切なくなりますが、
    初期化が完了する前に MIDI を演奏しようとしたときは、完了してから音が鳴り始めます。
    (この状態でもサウンドは「再生中」として扱われます)

なお、DirectMusic を使った MIDI の再生ではリバーブのエフェクトがかかりますが、
音割れを軽減するために DirectMusic が付けてくれるデフォルトのリバーブよりも若干弱めに設定してあります。

また、MIDI はサウンドの再生位置やループ位置の指定に「ミュージックタイム」という値を使用します。
これは4分音符ひとつ分を 768 とした単位で、LN_MUSICTIMEBASE として定義されています。
(LNote では、MIDI の場合のサンプル数=ミュージックタイム として扱っています)



3Dサウンド

3Dサウンドは、音声を3D空間上で再生する機能です。
視点からの位置によって、サウンドが立体的に聞こえてくるような演出をすることができます。
  • 単位距離の設定
    必要に応じて、最初に 3D 空間の 1 メートルに相当する距離を設定します。
    この設定はドップラー効果の計算に適用されます。
    デフォルトは 1.0 です。

    例えば MikuMikuDance のモデルを基準としてワールドを構築する場合、
    1.58m のキャラクターが約 20.0 の高さのモデルとなっているため、
    20.0 / 1.58 = 12.658... を 1 メートルとすることになります。

  • リスナー(聴取者)
    3D空間上のサウンドを聞く位置に関する情報です。位置、向き、速度を表します。
    一般に、リスナーの位置と方向はカメラの位置および方向と同じです。
    リスナーは音声機能全体に対して1つだけ存在します。

  • エミッター(サウンドオブジェクト)
    サウンドの発生源の情報です。
    ひとつのサウンドオブジェクトがひとつの位置、速度、範囲を持ちます。

// 3D 空間の 1 メートルに相当する距離を設定します
LAudio_SetMetreUnitDistance( 20.0 / 1.58 );

// リスナーの位置と向きを設定します
L3DSoundListener_SetPosition( 10.0, 0.0, 5.0 );
L3DSoundListener_SetDirection( 0.0, 0.0, 1.0 );

// サウンドオブジェクトの位置と、音声の聞こえる距離を設定します
LSound_SetEmitterPosition( sound_handle, -10.0, 5.0, 20.0 );
LSound_SetEmitterDistance( sound_handle, 100.0 );
    
// 3D 空間の 1 メートルに相当する距離を設定します
LAudio_SetMetreUnitDistance 20.0 / 1.58

// リスナーの位置と向きを設定します
L3DSoundListener_SetPosition 10.0, 0.0, 5.0
L3DSoundListener_SetDirection 0.0, 0.0, 1.0

// サウンドオブジェクトの位置と、音声の聞こえる距離を設定します
LSound_SetEmitterPosition sound_handle, -10.0, 5.0, 20.0
LSound_SetEmitterDistance sound_handle, 100.0
    

3Dサウンドの座標空間は左手座標系です。
(x 軸の値は左から右方向に、y 軸の値は下から上方向に、z 軸の値は手前側から遠ざかる方向に大きくなります)

なお、MIDI は 3D 音声として再生することはできません。



ゲームオーディオ

ゲームオーディオはゲーム用に特化したサウンド再生機能です。
BGM、SE 等のあらかじめ用意されている方法で演奏します。
演奏中の一時停止などの細かい設定はできませんが、全体的にシンプルにコーディングすることができます。

ゲームオーディオではサウンドを以下の種類に分類し、それぞれの用途に基づいて演奏します。

  • BGM (背景音楽)
    ゲーム中の BGM です。
    BGM はひとつだけ演奏することができ、ループ再生します。
    新しい BGM が演奏ようとした場合、古いものはその場で停止するか、
    フェードイン時間を指定した場合はクロスフェードしながら音声を切り替えます。

  • BGS (環境音)
    風や滝の音などの環境音です。
    BGM と同様、ひとつだけ演奏することができ、ループ再生します。
    BGS は BGM と同時に演奏することができます。

    また、ME の演奏による影響を受けず、常に演奏されます。

  • ME (効果音楽)
    レベルアップやアイテム取得時のファンファーレ等の演奏に使います。
    ME はひとつだけ演奏され、ループ再生せずに一度だけ演奏されます。

    ME の演奏開始時に BGM が演奏されていた場合は、
    BGM を 500 ミリ秒かけて一時停止させ、その後に ME の演奏を開始します。
    その場合、ME の演奏終了後に BGM の演奏を再開し、2000 ミリ秒かけて BGM をフェードインさせながら再開させます。
    (この時間はデフォルトの設定で、必要に応じて任意の値を設定することができます)

    BGS はこの影響を受けず、常に再生されます。

  • SE (効果音)
    ゲーム中の効果音です。 SE は同時に複数再生することができ、同じ音声を演奏した場合は 重ねがけされて演奏されます。
    (SE は必ずオンメモリで再生されます。サイズの大きいファイルを演奏することは避けてください)

    また、3D 音声として演奏することも可能です。

以下にそれぞれの性質をまとめます。
ループ再生重ね合わせメモリ管理
BGM×ストリーミング
BGS×ストリーミング
ME××オンメモリ
SE×オンメモリ

注意:
[HSP]
実行ファイルにパックされた音声ファイルは、すべてオンメモリで再生されます。
MP3 や OGG 形式の音声はデコード後のサイズ分のメモリを使うため、
大きいサイズのファイルを再生するときは注意してください。
(MP3 と OGG では、ファイルサイズの約 10〜20 倍のメモリを使い、デコードにもその分の時間を使います)