建築・設備見積りソフト、見積システムの事なら 和田特機株式会社

建設業向け 業務支援タブレットアプリシリーズ 好評発売中

和田特機株式会社HP

WFP for Experimental の内側Ⅱ

二週間のご無沙汰でした。SALです。
前回の「起動」に、不足分があったので、補足しておきます。

「起動の補足」
Resampling:リサンプリングする場合の目標周波数の初期値です。(Up Sampling は、3-States)
最後に、PCM 16bit/44.1KHz を再生可能な総ての waveout デバイスを、ID付で [Audio Device] にリストアップしておきます。
(”Microsoft Sound Mapper” は、default device を示すだけでなく、幾つかの圧縮フォーマットもサポートしています)

それでは、前回宿題にしました「再生」の手順を記します。
内容を単純化するために、女神フラグは Verdandi Skuld 状態とし、
説明上の重要な分岐材料となるもの以外は、 エラー/例外処理を割愛します。

[Play]ボタンを押すとこの再生コマンドが発行されます。
先ずは、[Play]ボタンをグレイにして、[Present File]リストで選択されているファイルのフルパスを取得します。
そして、前処理属性(中点挿入手順&減衰量)の情報源を取り出しておきます。
もしこれがリンクファイル(short cut)の場合は、それが指すWAVファイルのフルパスに置き換えると共に、
先ほどの前処理属性で空きがあれば、その項目をこちらのファイル分で補充します。(リンク優先)

次に、ファイルの全内容をメモリに読み取ります。
その上で、RIFF-WAVE 型のファイルであり、”fmt” 及び “data” チャンクが正常に存在することを確認します。
フォーマットIDが1で、拡張サイズがゼロであれば、[Up Sampling] の状態をみて、チェック付であれば前処理(後述)を呼び出します。
(FormatID==1 は、整数型の Linner PCM を表します)
“fmt” チャンクの内容を、[Source File Information] 窓に表示します。
(再生秒数は、”data” チャンクのサイズも利用します)
更にその内容で、waveout デバイスを開きます。
この時のデバイスIDは、その都度[Audio Device]リストから取得します。

次に、開いたデバイスを Pause モードにします。
[Song Interval] を見て、その値と1秒の小さい方の無音データを作り、再生デバイスに渡します。
(この処理は、ある特定のデバイス構成で、曲の頭が欠けるのを防ぐ為で、殆どの装置でこの設定は不要です)
(例えば、オープン後最初のS/PDIFフレームにエラーを生じるDDCとそのエラーで暫しミュートがかかるDACの組み合わせ等)
(本アプリでは、毎曲デバイスオープンするので、上記の方法で避けるしかありませんでした)
続いて、”data” チャンクの内容を再生デバイスに渡します。
総てが完了したら、[Exit][Choose]ボタンをグレイにして、Pause モードを解除します。
最後に、[Stop][Pause]ボタンをイネーブルにします。

「前処理」
再生開始コマンドから、必要に応じて呼び出されるサブルーチン(メソッド)です。
[Up Sampling] の状態が、チェック付か第三状態(グレイチェック)かで分岐します。

「チェック状態」
更に、挿入手順の値で二手に分かれます。
この手順は、ファイル名からの取得が優先で、無ければ[Protocol]変数に従います。
P21~P36 の場合は、少数近傍による5~7次の補間関数による中点を挿入した、新しい “fmt” と “data” チャンクを作成します。
メモリ不足等で失敗した場合は、古いチャンクのまま戻ります。
(二重になっている場合は、もう一度繰り返します)
P40 以降は、再標本化周波数を仮決めしてソフトウェアDACを使いますので、次の「第三状態」を見てください。

「第三状態」
本プログラムで言うところの「再標本化モード」です。
先ずは、再標本化周波数を [Resampling]変数で仮決定します。
([Resampling]変数は、後述するように変更するUIを持っています)
次に、[Gradient Info’] にチェックがある場合は、傾きチャンクがあれば、それを傾きオブジェクトにアタッチします。
そうでない場合は、[DefGrad]変数に従って、傾きオブジェクトの生成メソッドを使います。
([DefGrad]変数も、後述するように変更するUIを持っています)
パラメータが揃ったので、新しい “data” チャンクを作成しますが、失敗した場合は、以下の手順でリトライします。
[BitDepth] が 24bit の場合は、16bit にします。
16bit の場合は、再標本化周波数を半分にし、[BitDepth] を元に戻します。
勿論、元の値を下回る場合は、元のチャンクのまま戻ります。
“data” チャンクの作り方は、ソフトウェアDACとWFP に譲りますが、ファイル名から取得した減衰量を掛けてから整数化します。
こうして、新しい “fmt” と “data” チャンクができたら、元のチャンクと傾きオブジェクトを破棄(Discard)します。

[WM_RBUTTONUP]
マウスの右ボタンがリリースされると、このメッセージを受け取ります。
マウスカーソルが通常型でない場合は、何もしません。
[Up Sampling] チェックボックスの上にある場合で「第三状態」なら、[Resampling]変数を変更するポップアップメニューを開きます。
[Gradient Info’] チェックボックスの上にある場合で、チェックが付いていなければ、[DefGrad]変数変数を変更するポップアップメニューを開きます。
つまり、環境変数の [Resampling] と [DefGrad] から得た値は、このイベントで変更可能なのです。

[WM_POWERBROADCAST]
[Exit]ボタンがグレイの場合は、PBT_APMQUERYSUSPEND パラメータに対して、BROADCAST_QUERY_DENY を返します。
簡単に言えば、演奏中(Pause も含む)は電源マネジメント操作に対しては、拒否する訳です。

今回をもちまして、Wave File Player に関する投稿に、一区切りつけたいと思います。
但し、やりたいことを総て完了した訳ではないので、報告すべきことが溜まってきたら、また何がしかの発表をしたいと思います。
長い間お付き合い頂き、有難うございました。

2013年3月 SAL9002