Win32::Soundモジュール(日本語チョー訳)

by Hippo2000(1999/7/4)

Win32::Soundモジュールなのです。これであなたのパソコンでもPerlでWAVEファイルを演奏できます。
マルチメディアですねぇ。(^_^)

このドキュメントではWin32::Soundをインストールするときに作成されるSoundhtmlを日本語に訳そうとしたものです。わかりにくい部分は本物を見てください。(^^;

原本の著作権はAldo Calpini氏がお持ちです(詳しくは作者の部分を見てください)。
Aldo Calpiniさんにはメールで了解をいただきました。 Thank you again, Mr.Calpini!

なお内容等が間違っていたら修正します。ご連絡ください。


目次


名前

Win32::Sound - Windows サウンドを演奏するための拡張


書き方

    use Win32::Sound;
    Win32::Sound::Volume('100%');
    Win32::Sound::Play("file.wav");
    Win32::Sound::Stop();
    
    # ...後はこのファイルを読んで、お楽しみ下さい :-)

関数

Win32::Sound::Play(SOUND, [FLAGS])
指定されたサウンドを演奏します。: SOUNDにはWAVファイルの名前のほか、あらかじめ定義されている以下のサウンド名が指定できます。:
    SystemDefault
    SystemAsterisk
    SystemExclamation
    SystemExit
    SystemHand
    SystemQuestion
    SystemStart

さらに、名前がつけられたサウンドが見つからなければ、関数はシステム・デフォルルト・サウンドを演奏します。(SND_NODEFAULT フラグを設定しなければ)。なにもパラメータを指定しなければ、関数は実際に演奏しているサウンドを止めます。(Win32::Sound::Stopもご覧ください)。
FLAGSは以下の定数の組み合わせで指定します:

SND_ASYNC
サウンドは非同期に演奏され、関数は演奏が始まるとすぐに戻ります。(このフラグが指定されていなければ、サウンドは同期的に演奏され、サウンドが終了すると関数が戻ります)
SND_LOOP
サウンドは止められるまで、繰り返し演奏されます。SND_ASYNC フラグも一緒に指定しなければいけません。
SND_NODEFAULT
デフォルトのサウンドを使いません。もし指定されたSOUNDが見つかれなければ、関数はなにも演奏しないで戻ります。
SND_NOSTOP
もしサウンドが演奏されていれば、この関数は失敗します。デフォルトでは、関数を新しく呼び出すと、それまで演奏されていたサウンドは止められます。
Win32::Sound::Stop()
演奏されているサウンドを止めます。
Win32::Sound::Volume()
WAVEデバイスのボリュームを返します。もし配列コンテキストで呼ばれたら、左と右の値を返します。そうでなければ、1つの32ビットの値を返します。(左は下位ワード、右は上位ワード)。エラーの場合には、undefを返し、$!を設定します。

例:

    ($L, $R) = Win32::Sound::Volume();
    if( not defined Win32::Sound::Volume() ) {
        die "Can't get volume: $!";
    }
Win32::Sound::Volume(LEFT, [RIGHT])
WAVEデバイスのボリュームを設定します。引数が2つ指定されれば、それぞれ左と右のチャンネルに設定します。そうでなければ、両方ともLEFT(つまり RIGHT=LEFT)に設定します。値は0から65535 (0xFFFF)です。しかし、パーセンテージで指定することもできます。(%記号を最後につけた文字列を使ってください)

エラーの場合は、undef を返し、 $! を設定します。成功すれば、trueを返します。

例:

    Win32::Sound::Volume('50%');
    Win32::Sound::Volume(0xFFFF, 0x7FFF);
    Win32::Sound::Volume('100%', '50%');
    Win32::Sound::Volume(0);
Win32::Sound::Format(filename)
指定されたWAVファイルフォーマットについての情報を返します。配列には以下のものが入ります。

例:

    ($hz, $bits, $channels) 
        = Win32::Sound::Format("file.wav");
Win32::Sound::Devices()
使用できるすべてのサウンドデバイスを返します; 名前には、デバイスの種類(WAVEOUT, WAVEIN, MIDIOUT, MIDIIN, AUX 、MIXER) と0からはじまるID番号が入ります。正しい名前は以下のようになります:
    WAVEOUT0
    WAVEOUT1
    WAVEIN0
    MIDIOUT0
    MIDIIN0
    AUX0
    AUX1
    AUX2

この他に、WAVE_MAPPERMIDI_MAPPER という(WAVE出力とMIDI出力のためのデフォルト・デバイス)2つの特殊なデバイス名があります。

例:

    @devices = Win32::Sound::Devices();
Win32::Sound::DeviceInfo(DEVICE)
DEVICEに指定された名前(Win32::Sound::Devicesと同じフォーマット) のサウンドデバイスについての情報の連想配列(ハッシュ)を返します。

配列の内容は要求されたr他デバイスのタイプによって変わります。それぞれのデバイス・タイプは少なくとも以下の情報を返します:

    manufacturer_id
    product_id
    name
    driver_version

追加の情報については以下の表をご覧ください:

    WAVEIN..... formats
                channels
    
    WAVEOUT.... formats
                channels
                support
                
    MIDIOUT.... technology
                voices
                notes
                channels
                support
                
    AUX........ technology
                support
                
    MIXER...... destinations
                support

よくわからないフィールドの意味は、Microsoft SDK ドキュメンテーションではっきりするかもしれません。(長くなるので、ここではレポートできません。1日くらいかかるかも.... :-)

例:

    %info = Win32::Sound::DeviceInfo('WAVE_MAPPER');
    print "$info{name} version $info{driver_version}\n";

WaveOutパッケージ

Win32::Sound は異なる、さらに強力にWAVEオーディオデータにアプローチするWaveOutパッケージも提供しています。WAVファイルを、開始と終了の範囲を指定する追加の機能がついた、ロードし演奏するメソッドを持っています。 そのためオーディオファイルの一部だけを演奏することができます。

さらに任意のバイナリ・データをサウンドカードにロードし、演奏させたり、WAVファイルに保存することができます。簡単言えば、音楽を合成することができるのです。


関数

new Win32::Sound::WaveOut(FILENAME)
 
new Win32::Sound::WaveOut(SAMPLERATE, BITS, CHANNELS)
 
new Win32::Sound::WaveOut()
この関数はWaveOutオブジェクトを生成します; 最初の形式は、指定されたWAVEファイルをオープンしています( Open() も参照)、そのためそのまま、演奏 Play() することができます。

2番目(そして3番目)の形式は、WAVE出力デバイスを指定された形式(または何も指定されなければ、デフォルトとして、44.1kHz,、16 ビット、ステレオ)でオープンします; 演奏できるものを作るには、WAVEファイルをオープンする(Open() )か、バイナリデータをサウンドカードにロード(Load() )し、書き込み( Write() )します。

Close()
現在オープンしているWAVEファイルをクローズします。
CloseDevice()
WAVE出力デバイスをクローズします; OpenDevice() で形式を変更して、再びオープンすることができます。
GetErrorText(ERROR)
指定されたERROR番号に対応するエラーテキストを返します。WAVE出力特有のエラーにしか動かないことに注意してください。
Load(DATA)
サウンドカードにDATAバッファをロードします。データバッファの形式は使用しているフォーマットによって違います。8ビットのモノラルでは、1バイト(文字)ですが、16ビットのステレオでは、サンプルそれぞれが4バイトになります(左右のチャンネルのための2つの16ビット値)。サンプルレートはサウンド1秒にサンプルがいくつあるかを定義します。例えば44.1kHzの16ビットのステレオのを1秒のときには、バッファには176400バイト(44100*4)が入ります。
Open(FILE)
指定されたWAVEファイルを開きます。
OpenDevice()
現在のサウンド・フォーマットでWAVE出力デバイスを開きます。( CloseDevice() を使わなければ必要ありません)
Pause()
現在演奏中のサウンドを一時停止します。演奏を続けるためには Restart() を使います。
Play( [FROM, TO] )
オープンされているWAVEファイルを演奏します。オプションで開始(FROM)、終了(TO)の範囲を指定することができます。FROMとTOはサンプルの場所で表されています。(または最初のサンプルはFROM=0、最後のサンプルはTO=-1を使ってください)。プレイバックはいつでも非同期につまりバックグラウンドで行われます。
Position()
現在演奏しているサンプル番号を返します; サウンドが終わったときに、演奏位置は0にされず、そのため、現在のサウンドでの正しい位置を受け取るためには、演奏の間にReset() を呼び出さなければならないことに注意してください。
Reset()
演奏を中止し、演奏位置をリセットします。( Position() をご覧ください)
Restart()
Pause() で一時停止したサウンドの演奏を継続します。
Save(FILE, [DATA])
DATA バッファ(指定されなければ、サウンドカードにロードされている現在のバッファ)をFILEに指定されたWAVEファイルに保存します。
Status()
サウンドカードが演奏中であれば0を返します。解放されていれば1、エラーであればundefを返します。
Unload()
ロードされたデータからサウンドカードを解放します。
Volume( [LEFT, RIGHT] )
WAVE出力デバイスのためのボリュームを取得あるいは設定します。Win32::Sound::Volumeと同じように作用します。
Write()
サウンドカードにロードされているデータを演奏します。プレイバックはいつでも非同期につまりバックグラウンドで行われます。

サウンド形式

サウンド形式はWaveOutオブジェクトのsamplerate、bits、channlesという3つのプロパティに格納されます。もし新しいオブジェクトを生成することなく変更する必要があるならば、まずクローズし、後でデバイスをもう一度オープンしてください。

    $WAV->CloseDevice();
    $WAV->{samplerate} = 44100; # 44.1kHz
    $WAV->{bits}       = 8;     # 8 bit
    $WAV->{channels}   = 1;     # mono
    $WAV->OpenDevice();

現在使っているサウンド形式を問い合わせるために、プロパティを使用することもできます。


コーディング例

ここでは、1秒間のシヌソイド状のWAVEを440Hzを生成し、sinus.wav:に保存しています。

    use Win32::Sound;
    
    # オブジェクトの生成
    $WAV = new Win32::Sound::WaveOut(44100, 8, 2);
    
    $data = ""; 
    $counter = 0;
    $increment = 440/44100;
    
    # 44100 サンプル ( = 1 秒)を生成する
    for $i (1..44100) {
        # ピッチを計算する 
        # (8ビットなので範囲は0〜255)
        $v = sin($counter/2*3.14) * 128 + 128;    
        # それを左右2つに"pack"する。
        $data .= pack("cc", $v, $v);
        $counter += $increment;
    }
    
    $WAV->Load($data);       # 取得
    $WAV->Write();           # 聞いてみる
    1 until $WAV->Status();  # 完了まで待つ
    $WAV->Save("sinus.wav"); # ディスクに書き込む
    $WAV->Unload();          # 削除する

バージョン

Win32::Sound version 0.45, 09 Apr 1999.


作者

Aldo Calpini, dada@divinf.it

Parts of the code provided and/or suggested by Dave Roth.

#コーディングの部分はDave Rothに提供あるいは提案していただきました。


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。