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();
# ...後はこのファイルを読んで、お楽しみ下さい :-)
SystemDefault
SystemAsterisk
SystemExclamation
SystemExit
SystemHand
SystemQuestion
SystemStart
さらに、名前がつけられたサウンドが見つからなければ、関数はシステム・デフォルルト・サウンドを演奏します。(SND_NODEFAULT
フラグを設定しなければ)。なにもパラメータを指定しなければ、関数は実際に演奏しているサウンドを止めます。(Win32::Sound::Stopもご覧ください)。
FLAGSは以下の定数の組み合わせで指定します:
例:
($L, $R) = Win32::Sound::Volume();
if( not defined Win32::Sound::Volume() ) {
die "Can't get volume: $!";
}
エラーの場合は、undef
を返し、 $! を設定します。成功すれば、trueを返します。
例:
Win32::Sound::Volume('50%');
Win32::Sound::Volume(0xFFFF, 0x7FFF);
Win32::Sound::Volume('100%', '50%');
Win32::Sound::Volume(0);
例:
($hz, $bits, $channels)
= Win32::Sound::Format("file.wav");
WAVEOUT0
WAVEOUT1
WAVEIN0
MIDIOUT0
MIDIIN0
AUX0
AUX1
AUX2
この他に、WAVE_MAPPER と MIDI_MAPPER
という(WAVE出力とMIDI出力のためのデフォルト・デバイス)2つの特殊なデバイス名があります。
例:
@devices = 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";
Win32::Sound は異なる、さらに強力にWAVEオーディオデータにアプローチするWaveOutパッケージも提供しています。WAVファイルを、開始と終了の範囲を指定する追加の機能がついた、ロードし演奏するメソッドを持っています。 そのためオーディオファイルの一部だけを演奏することができます。
さらに任意のバイナリ・データをサウンドカードにロードし、演奏させたり、WAVファイルに保存することができます。簡単言えば、音楽を合成することができるのです。
WaveOutオブジェクトを生成します;
最初の形式は、指定されたWAVEファイルをオープンしています(
Open() も参照)、そのためそのまま、演奏
Play() することができます。
2番目(そして3番目)の形式は、WAVE出力デバイスを指定された形式(または何も指定されなければ、デフォルトとして、44.1kHz,、16 ビット、ステレオ)でオープンします; 演奏できるものを作るには、WAVEファイルをオープンする(Open() )か、バイナリデータをサウンドカードにロード(Load() )し、書き込み( 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に提供あるいは提案していただきました。
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。