プログラム例

[備考開始]

この文書ではC#のプログラム例を掲載していますが、SounDecoder Soundsはその他の.NET言語(Visual Basic .NET、C++/CLIなど)からでも使えます。

[備考終了]

1. 一般

1-1. 使用する名前空間

SounDecoder Soundsのクラスやインターフェイスなどは、すべてSounDecoder.Sounds名前空間に入っています。また、SounDecoderに含まれるデコーダを利用する為、SounDecoder名前空間のクラスにも頻繁にアクセスする事になるでしょう。この為、SounDecoder Soundsを利用するプログラムでは、ソースコードの頭でこれらの名前空間をusingディレクティブなどを使って省略して書けるようにしておくと良いでしょう。

[プログラムコード開始]

using SounDecoder;
using SounDecoder.Sounds;

[プログラムコード終了]

以下のプログラムは、この記述がソースコードの頭にあるものとして書かれています。

1-2. 初期化と後処理

SounDecoder Soundsを使うには、まずサウンドデバイスを初期化する必要があります。サウンドデバイスの初期化は、例えば MDXSoundDevice のようなクラスのインスタンスを作成する事で行えます。

[プログラムコード開始]

MDXSoundDevice device = new MDXSoundDevice( this, Guid.Empty );

[プログラムコード終了]

サウンドデバイスに関してはまだ実装に依存する所が大きくなっています。現在の唯一の実装であるSounDecoder Sounds MDXにおける情報については、MDX固有 - サウンドデバイスの初期化をご覧下さい。

また、SounDecoder Soundsを利用するすべての処理が終わったら、これを破棄する必要があります。これにはDispose()メソッドを呼び出します。

[プログラムコード開始]

device.Dispose();

[プログラムコード終了]

1-3. スタティックサウンドの基本

1-3-1. 作成

SounDecoder Soundsにおけるスタティックサウンド (短い効果音向きのサウンド)は、すべて StaticSound を継承します。それらのクラスのコンストラクタの仕様は実装によって異なりますが、最も簡単なものは次のようにサウンドデバイスとサウンドデコーダを受け取ります。

[プログラムコード開始]

SoundDecoder decoder = SoundDecoder.Identify( System.IO.File.Open( path ) );
 
// SounDecoder Sounds MDXを使う場合の例
StaticSound staticSound = new MDXStaticSound( this.device, decoder );

[プログラムコード終了]

第1引数には、予め初期化しておいたサウンドデバイスを渡し、第2引数にはこのスタティックサウンドの内容となるデータを返すデコーダを与えます。また、得られたインスタンスは StaticSound にアップキャストしてしまって構わないでしょう。

1-3-2. 再生と停止

スタティックサウンドの再生は、 Play() メソッドを呼び出せば始まります。

[プログラムコード開始]

staticSound.Play();

[プログラムコード終了]

サウンドデータの最後まで再生されると自動的に停止されますが、再生途中で一時停止を行いたい場合は Stop() メソッドを呼び出します。

[プログラムコード開始]

staticSound.Stop();

[プログラムコード終了]

Stop() メソッドは一時停止を行います。このメソッドを呼んでも再生位置は保存されたままとなる為、その後で再び Play() メソッドを呼べば、一時停止された場所から再生が再開されます。

1-3-3. ループ再生

スタティックサウンドを作成した直後は、 Play() メソッドで再生を開始した後、最後まで再生すると自動的に停止するようになっています。この動作は、 Looping プロパティをtrueにする事で変えられます。

[プログラムコード開始]

staticSound.Looping = true;

[プログラムコード終了]

Looping プロパティをtrueにすると、ループ再生を行うようになり、最後まで再生した後は再び先頭に戻って再生が続けられます。falseにしておくと、最後まで到達したら停止するという既定の動作になります。

Looping プロパティに限らず、ほとんどのプロパティは(ドキュメントで明示的に不可能だと書かれていない限り)サウンドの再生中でも変更が可能です。

1-3-4. 破棄

スタティックサウンドを使い終わったら、Dispose()メソッドで破棄します。

[プログラムコード開始]

staticSound.Dispose();

[プログラムコード終了]

1-4. ストリーミングサウンドの基本

1-4-1. 作成

SounDecoder Soundsにおけるストリーミングサウンド (長いBGM向きのサウンド)は、すべて StreamingSound を継承します。スタティックサウンドと同じく、それらのクラスのコンストラクタの仕様は実装によって異なりますが、最も簡単なものは次のようにサウンドデバイスとサウンドデコーダを受け取ります。

[プログラムコード開始]

SoundDecoder decoder = SoundDecoder.Identify( System.IO.File.Open( path ) );
 
// SounDecoder Sounds MDXを使う場合の例
StreamingSound streamingSound = new MDXStreamingSound( this.device, decoder );

[プログラムコード終了]

第1引数には、予め初期化しておいたサウンドデバイスを渡し、第2引数にはこのストリーミングサウンドの内容となるデータを返すデコーダを与えます。得られたインスタンスは StreamingSound にアップキャストするのがいいでしょう。

1-4-2. 再生と停止

ストリーミングサウンドの再生も、スタティックサウンドの時と全く同じです。 Play() メソッドを呼び出せば始まります。

[プログラムコード開始]

streamingSound.Play();

[プログラムコード終了]

ストリーミングサウンドの場合でもサウンドデータの最後まで再生されると自動的に停止されますが、再生途中で一時停止を行いたい場合は Stop() メソッドを呼び出します。

[プログラムコード開始]

streamingSound.Stop();

[プログラムコード終了]

Stop() メソッドはここでも一時停止を行うだけです。後で再び Play() メソッドを呼べば、一時停止された場所から再生が再開されます。

1-4-3. ループ再生

ストリーミングサウンドを思い通りに再生するにはまずサウンドパートの概念を理解する必要があるでしょうが、ただ単に一つのサウンドをループ再生したい場合は、ほぼスタティックサウンドの時と同じように行えます。まず、スタティックサウンドと同様に Looping プロパティをtrueに変更します。

[プログラムコード開始]

streamingSound.Looping = true;

[プログラムコード終了]

更に、次のようなコードを書き加えます。

[プログラムコード開始]

streamingSound.FirstPart.NextPart = streamingSound.FirstPart;

[プログラムコード終了]

このコードの詳しい意味についてはここでは触れませんが、これだけ書けばストリーミングサウンド全体をループ再生する事ができます。

1-4-4. 破棄

ストリーミングサウンドを使い終わったら、Dispose()メソッドで破棄します。

[プログラムコード開始]

streamingSound.Dispose();

[プログラムコード終了]

1-5. 再生エフェクト

1-5-1. ボリューム

ボリュームの変更は、 Volume プロパティを変更する事で行えます。

[プログラムコード開始]

// 予めStaticSoundかStreamingSoundを作成しておく
Sound sound;
 
sound.Volume = 0.8;

[プログラムコード終了]

音量変化が無い時、 Volume プロパティは値1.0を持ちます。また、0.0を与えると無音になります。勿論、その間の値を与える事もできます。そのような値は、人間の感覚に比例するように──0.5が与えられたなら、1.0の時と比べて半分の大きさだと感じられるように──解釈されます。

ボリュームの最低値は常に0.0ですが、最大値はSounDecoder Soundsの実装によって異なる可能性があります。与える事のできる最大値は、 MaxVolume プロパティで得られます。

1-5-2. パン

パンは、ボリュームと同様にして Pan プロパティで変更できます。

[プログラムコード開始]

sound.Pan = -0.2;

[プログラムコード終了]

既定では、パンは値0.0を持ち、(基の音源に偏りがなければ)音が中央から聞こえます。-1.0を与えると右チャネルが無音になり、左から聞こえてくるようになります。1.0ではその逆で左チャネルが消え、音が右から聞こえるようになります。ボリュームと同様に、パンは線形のスケールを持ちます──中間値は人間の感覚に比例するように解釈されます。

パンの最低値は常に-1.0で、最大値は常に1.0です。

1-5-3. 再生速度

再生速度の変更には、 Speed プロパティを使います。

[プログラムコード開始]

double speed = 1.5;
if ( speed > sound.MaxSpeed )
speed = sound.MaxSpeed;
 
sound.Speed = speed;

[プログラムコード終了]

既定では再生速度は1.0です。上の例のように1.5にすれば、サウンドは1.5倍速で再生されます。なお、 Speed プロパティを変更すると、再生速度と共に音の高さも変わります。

他のエフェクトと異なり、再生速度の最低値と最大値は、実装ごとに異なる可能性がある事に加え、サウンド(のインスタンス)ごとにも異なる可能性があります。この為、再生速度を変更する際には MinSpeed プロパティや MaxSpeed プロパティを調べながら行う必要があります。

1-6. スタティックサウンドの活用

1-6-1. 長さ

スタティックサウンドの長さは、次のようにして取得する事ができます。

[プログラムコード開始]

StaticSound staticSound;
 
// サンプル単位の長さ
long length = staticSound.Part.Length;

[プログラムコード終了]

長さはサンプル単位で得られます。もし秒単位に直したいのであれば、そのサウンドのサンプリングレートを取得し、それによって割る必要があります。

[プログラムコード開始]

// staticSoundのサンプリングレート(標本化周波数)
int samplesPerSecond = staticSound.Format.SamplesPerSecond;
 
// 秒単位の長さ
double lengthInSeconds = (double)length / samplesPerSecond;

[プログラムコード終了]

1-6-2. 再生位置

再生位置は、 Position プロパティで取得・変更が行えます。

[プログラムコード開始]

long position = staticSound.Position;

[プログラムコード終了]

再生位置は、スタティックサウンドの場合現在の位置に到達する為に最低限必要なサンプル数で定義されます。つまり、ループ再生している場合は、サウンドの終わりまで再生して先頭に戻る度に再生位置も0に戻ります。また Position プロパティの値を変更して再生位置を変える場合も、長さを超えないように注意する必要があります。

なお、秒単位で得たい場合は、長さの時と同じように、サンプリングレートで割る必要があります。

1-6-3. クローニング

スタティックサウンドは、複製してクローンを作る事が可能です。複製するには Clone() メソッドを呼び出します。

[プログラムコード開始]

// 複製したいStaticSound
StaticSound staticSound;
 
// クローン作成
StaticSound clonedStaticSound = staticSound.Clone();

[プログラムコード終了]

クローンの内容は、オリジナルと同じものになります。つまり、 Play() メソッドが呼ばれれば、同じ音が再生されます。また、クローンとオリジナルは別々の再生位置を持つ事ができます。これにより、複数の同じ音を重ねて再生する事ができます。

複数の同じ音を重ねて再生するだけなら、同じ内容のストリームを扱うサウンドデコーダを複数用意して、個別にスタティックサウンドを作成する事によっても可能ですが、クローンを用いる方法はそれと比べてメモリ消費量などの点で有利です。

2. MDX固有

2-1. サウンドデバイスの初期化

SounDecoder Sounds MDXのサウンドデバイス( MDXSoundDevice )の初期化には、少なくともデバイスの所有者となるウィンドウが必要です。SounDecoder Sounds MDXではWPFアプリケーションとWindowsフォームアプリケーションの二種類を想定しており、それらのアプリケーションのメインウィンドウを渡す事ができます。

例えば Loaded イベントをWindow_LoadedメソッドでハンドルするWPFアプリケーションでは、次のように初期化すると良いでしょう。

[プログラムコード開始]

public MainWindow : Window {
// ……
private MDXSoundDevice device;
private void Window_Loaded( object sender, RoutedEventArgs e ) {
this.device = new MDXSoundDevice( this, Guid.Empty );
}
// ……
}

[プログラムコード終了]

コンストラクタの第2引数は、サウンドデバイスを特定する為のGUIDです。大抵の場合はシステムにサウンドデバイスが一つしか無い為、プライマリサウンドデバイスを表すGuid.Emptyを渡せば十分です。

[プログラム例]
Published : 2009-10-12T02:55:47+09:00
Last Modified : 2009-10-15T23:02:32+09:00
Table of Contents : SounDecoder Sounds
Verified with : Valid XHTML 1.1
Copyright © 2009  E+X.