■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;
周波数成分ごとの音量を設定します。
hが周波数成分で、0〜255までの範囲で設定します。
vが大きさになります。0.0〜2.0までの範囲とします。・procedure SetEQ(h:Integer; v,t:Single); overload;
周波数成分ごとの音量を設定します。
tは時間で、音量と同じく、フェード時間を意味します。・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に自動的に変換されます。