■TOggData クラス

■説明

Oggファイル、拡張独自形式を読み込んで、Wave波形にして出力します。
単独で波形を出力する機能を有しますが、使いにくいので普通はTOggPlayerから操作、使用します。

44100Hz、22050Hz、2Channel、1Channeに対応しています。

■使用する前に

必ず _VorbisfileInitialize 命令でDLLを組み込む必要があります。
起動時に一回だけ実行すればいいので、FormCreateの最初にでも宣言するといいでしょう。
また、解放時には _VorbisfileFinalize 命令でDLLを解放してください。

■プロパティ

・OggChannels : Integer;

チャンネル数が格納されます。STEREOなら2を返します。

・OggRate : Integer;

再生レート。44100Hzの場合は44100を返します。

・OggVendor : String;

圧縮に使ったソフト名なんかが入ります。たぶんね。

・OggUserComment: TStringList;

コメントです。

・OggTotalSize : Int64;

Oggファイルに格納されている波形のサンプルレートです。

・TotalTime : Single;

曲の長さを秒(sec)で返します。

・TotalSize : Int64;

レンダリング後の曲の長さを波形のサイズで返します。

・LoopData : array[0..15] of TOggLoop;

ループ情報が入ってます。普通は弄らない方向で

・property GetPlay : Boolean read FPlayFlag; //再生の有無

現在再生中かどうかを返します。

■メソッド

〜生成・解放・初期化〜

・constructor Create(Len:Integer);

生成。Lenにストリーミングバッファの長さを指定します。
OggPlayerと同じ長さにして下さい。
1024の倍数でお願いします。

・destructor Destroy; override;

解放。

・procedure Init;

初期化。

〜ファイル読み込み〜

・function LoadOgg(ss:TMemoryStream):Boolean; overload;
・function LoadOgg(Filename:String):Boolean; overload;

Oggファイル、独自形式AlphaOgg、を読み込みます。
Oggの対応形式は44100Hz/MONO/STEREOのみです。
※ストリーム読み込みの場合は、ストリームを奪います。ちょっとそれは・・・と言う場合は以下の命令を使用して下さい。

・function LoadOgg2(ss:TStream):Boolean; overload;

普通はこっちを使ってください。

〜レンダリング〜

・function RenderingToPointer(d:Pointer; Len:Integer):Integer;

指定ポインタにWave波形を書きこみます。
波形の長さはLenで指定します。

・procedure Rendering;

レンダリングを行います。

〜シーク〜

・function TimeTell:Single;

曲の経過時間を秒(sec)単位で返します。

・function TimeSeek(t:Single):Single;

曲を指定時間(秒)まで進めます。

〜演奏制御〜

・procedure Play(Loop:Boolean);

再生を開始します。
曲の最後にきたら巻き戻して再生させたい場合はLoopをTRUEにしてください。

・procedure Stop;

曲を停止します。
停止と伴に曲を先頭に戻します。

・procedure Pause;

曲を一時停止させます。

〜音量操作〜

・procedure SetVolume(v:Single); overload;
・procedure SetVolume(v,t:Single); overload;

音量を設定します。
0.0が無音、1.0が普通の音量、2.0で200%になります。最大音量は64(6400%)までです。
vは音量を、tには何秒後に反映させるかを秒単位で指定します。

SetVolume(0.5,6)の場合は、6秒後に音量が0.5にフェードするという意味になります。

・function GetNowVolume:Single; //現在の音量

現在の音量を返します。
フェード中の場合は、命令を発行した瞬間の音量を返します。

・function GetSetVolume:Single; //目標の音量

SetVolumeで設定した音量を返します。
フェード中でも、関係なく、フェード後の音量を返します。

・procedure SetMasterVolume(v:Single);
・function GetMasterVolume:Single;

・procedure SetChannelVolume(v:Single);
・function GetChannelVolume:Single;

フェード無しの音量設定です。

〜AGC(オートゲインコントローラ)〜

・procedure SetAGC(Vol:Single=1.0); overload;
・procedure SetAGC(Gain:Single; Rate:Single; Target:Integer; Quiet:Integer); overload;

音量の自動調節機能です。
SetAGC(0.0)でオートゲイン機能を無効にします。

〜EQ(イコライザ)〜

・procedure SetEQ(h:Integer; v:Single); overload;

周波数成分ごとの音量を設定します。
が周波数成分で、0〜255までの範囲で設定します。
が大きさになります。0.0〜2.0までの範囲とします。

・procedure SetEQ(h:Integer; v,t:Single); overload;

周波数成分ごとの音量を設定します。
は時間で、音量と同じく、フェード時間を意味します。

・function GetNowEQ(h:Integer):Single;

現在の周波数の音量を返します。

・function GetSetEQ(h:Integer):Single;

設定した周波数の音量を返します。

・procedure SetEQ16(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16, t : Single);
・procedure SetEQ8(v1,v2,v3,v4,v5,v6,v7,v8, t:Single);
・procedure SetEQ4(v1,v2,v3,v4, t:Single);

256個も設定するのは非常に面倒な場合も多々あります。
そこで、数個設定してやることで、エルミート曲線を用いて滑らかに全てを設定する関数です。
16個、8個、4個とあります。

〜ループ制御〜

・function GetLoopCount(n:Integer):Integer;

n番目のループカウンタを返します。
n番目とかは、付属ツールでループ設定する時にありましたよね。あれです。
0〜15までの計16個あります。

何回ループしたかを返します。まぁ、使わないか・・・。

・procedure SetLoopCount(n,l:Integer);

上で言った、ループカウントを自分で設定します。

本来2回ループするところに、255なんかを代入すると、ループを抜けることが出来ます。
ボスを倒した瞬間に、曲を次のループに進めたい場合なんかにどうぞ。

〜リアルタイム〜

・function GetOutputWavePos: Integer;

リアルタイムで現在再生中の位置を返します。
Pointerではなく、仮バッファ上の位置をBYTE単位で返します。
時間計算で算出しているので、多少の誤差は出ます。

・function GetOutputSum:Single; overload;

リアルタイムで再生中の音量の合計値を0.0〜1.0の範囲で返します。
左右を合計した値を返します。

・function GetOutputSum(c:Integer):Single; overload;

リアルタイムで再生中の音量の合計値を0.0〜1.0の範囲で返します。
cに次の数値を設定することで左・右・両方の値を取得できます。
0:Left
1:Right
2:Both

・procedure GetOutputGraph(d:PSingle);

リアルタイムで周波数成分を取得します。
dにはSingle[256]のポインタを渡します。
0(低周波)→255(高周波)というならびで返されます。

・function GetOutputTime:Single;

現在の再生経過時間をリアルタイムで返します。
が、内部で計算によって補間した値なので、正しいものではありません。

〜レンダリングポインタ〜

・function Memory : Pointer; //Wave波形格納ポインタ

このTOggDataクラスが持つ、Wave波形レンダリング専用バッファの先頭アドレスを返します。


・function Offset : Pointer; //レンダリングしたWave波形の先頭アドレス

レンダリング(Rendering)した際、そのデータが書かれた先頭アドレスを返します。

グローバル関数

〜メモリーストリームに波形をレンダリング〜

・function OggToMemoryStream(ss:TStream):TMemoryStream; overload;
・function OggToMemoryStream(filename:String):TMemoryStream; overload;

Oggデータの波形情報をTMemoryStreamにして返します。
44100Hz、2Channelに自動的に変換されます。