Q. | 再生しているファイルの実体がどこにあるのか忘れてしまった。ファイルのフルパスを表示することはできないか? | |
A. | プレイリストを保存して .m3u ファイルを見るという方法もありますが、 プレイリストウィンドウの "No." と書いてある所の左側の境界を右へドラッグすると、"FULL PATH" という列が現れます。 ここを見ることによって簡単にファイルの所在を調べることができます。 ただし、この列は本ソフトが開くファイルのフルパス文字列を保存するだけのために使っているので、 メインウィンドウをリサイズしたりすると、すぐに隠れてしまいます。 | |
Q. | なぜプレイリストの「上書き保存」がないのか? | |
A. | 本ソフトは音声プレーヤーであるため、「開く」対象とするのは音声ファイルが中心です。 再生中、その音声ファイルをずっと開きっぱなしにしています。 一方、プレイリストファイルは「開く」動作を行っても、内容をプレイリストに登録し終えると自動的に閉じるようになっています。 これは、現在開いているのが音声ファイルなのかプレイリストファイルなのか混同しないようにするためです。 したがって、「プレイリストファイルを開きっぱなしにする」という概念は本ソフトにはありません。 | |
Q. | 「再生終了したファイルをプレイリストから削除」ってどんな時に使うの? | |
A. | あまりに多くのファイルをプレイリストに登録した場合などです。 本ソフトはウィンドウの縦のサイズを変えられないため、プレイリストに登録されたファイルが増えてくるとスクロールさせるのが難しくなり、全体の見通しが悪くなってきます。 まるで、本ソフトにとって仕事が積み上がってくるようなイメージです。 ですから、重要なプレイリストはファイルに保存し、そうでないものはさっさと片付けてしまいましょう。 | |
Q. | 「オプション」の「次回起動時のプレイリスト」を「終了時の状態と再生位置を復元」に設定して再生中に終了した場合、次回起動時に一時停止状態になるのはなぜ? 起動と同時に再生を開始した方がよいのでは? | |
A. | 前に何を聴いていたかをすっかり忘れ、起動直後に大音響が鳴り響いて恥ずかしい思いをするのを防ぐためです。 | |
Q. | 複数のプレイリストと再生位置を保存して次回起動時にそれぞれ復元させることはできないか? 例えばまずAというアルバムを途中まで聴き、次にBというアルバムを途中まで聴く。 その後アルバムAを続きから聴いてまたアルバムBを続きから聴くというような使い方はできないのか? | |
A. |
本ソフト単独でそのような機能はありません。
そこで、本ソフトを複数のフォルダにインストールしてしまうという荒技を使うことにより実現できます。
アーカイブファイルを解凍した後、そのアーカイブファイルを別のフォルダに移動させて再び解凍してください。
そして別々のフォルダに解凍した本ソフトを使って、上の例でいうアルバムA,Bを聴くことになります。
設定ファイルなどもそれぞれ独立して管理されます。 この方法で本ソフトを3つ以上のフォルダにインストールすることも可能です。 |
|
Q. | プレイリストに表示されている再生時間と実際の再生時間が異なることがあるのだが。 | |
A. |
MP3 ファイルは「フレーム」というデータの塊が連なってできています。
1つのフレームに含まれるサンプル数は決まっているため、フレーム数を数えることによって再生時間を取得することができます。
しかし、全フレームをスキャンするにはある程度時間がかかります。
そこで「このファイルにはフレームがいくつ存在する」という情報を持ったファイルヘッダのようなものがあればいいのですが、
残念ながら MP3 ファイルにはファイルヘッダという概念がありません。 多数の MP3 ファイルをプレイリストに登録する際、全フレームをスキャンしていてはかなりの時間にわたってユーザーが操作不能な状態に陥ります。 プレイリストに表示する再生時間を正確にするより、プレイリストに登録する処理を高速にした方がメリットが大きいと思われるため、 プレイリスト登録時はファイルサイズなどから概算して再生時間を求めています。 このためプレイリストに表示されている再生時間は誤差を含んでいる可能性が常にあります。 再生開始時にはその MP3 ファイルに含まれる全フレームをスキャンしてフレーム数を数えており、画像ウィンドウには正確な再生時間を表示しています。 |
|
Q. | 再生中に各種パラメータを変更すると、その都度音声がプツプツ途切れるのだが。 | |
A. |
「オプション」の「設定を変えるたびにデバイスをリセット」がチェックされていると、
各種パラメータが変更されるたびにリアルタイムに反映するためにサウンドデバイスをリセットし、音声波形データを展開し直します。
チェックを外すとプツプツは言わなくなりますが、各種パラメータの変更操作が反映されるのは、ウェーブバッファに現在貯まっている音声波形データの再生が完了した後になります。 ( 1) 「オプション」→「ウェーブバッファ1個の長さ」を短めに設定する。 ( 2) 「オプション」→「ウェーブバッファの数」を少なめに設定する。 とすることにより、ある程度レスポンスが良くなりますが、普段の再生中に音声が途切れやすくなります。 |
|
Q. | レベルメータが 0dB を示しても色が変わる時と変わらない時があるのだが。 | |
A. |
本ソフトではレベルメータのデシベル値を デシベル値 = 20×log(振幅値/32767) [dB] として求めています。 レベルメータの色が変わるためには音声波形の振幅が最大値に達する必要があります。 例えば量子化ビット数が 16 ビットの場合、プラス側では 32767、マイナス側では -32768 がそれぞれ振幅の最大値となります。 つまり、絶対値が 32766 ではレベルメータの色は変わりません。 20×log(32766/32767) ≒ 0 [dB] となるので、この振幅値では 0dB を表示してもレベルメータの色は変わらないことになります。 |
|
Q. | フレームレートの表示は何に使うのか? | |
A. |
実用性という意味合いで言えば、動きの滑らかさとマシン負荷のバランスを調整するために使います。
「オプション関連メニュー」の「描画スレッドのスリープ時間」の項を参照してください。 しかし、これを使ってちょっとしたベンチマークができます。 「メインスレッドの優先順位」、「再生スレッドの優先順位」、「描画スレッドの優先順位」をそれぞれ「標準より2ポイント高く」に、 「再生スレッドのスリープ時間」、「描画スレッドのスリープ時間」をそれぞれ最小に、 「FFTのサンプル数」を最大に設定し、12 オクターブ表示とすることにより、 CPU の整数演算機能、浮動小数点演算機能、メモリ、およびグラフィックデバイスの 2D 描画機能 (BitBlt) に大きな負荷がかかります。 その時のフレームレートの値が大きいほど、マシンの全体的な性能が高いということになります。 |
|
Q. | フレームレートを表示していると、再生を停止している時、0を表示したり1を表示したりしているが、これは正しい動作なのか? | |
A. |
本ソフトは少しでもマシン負荷を軽くするため、状況に変化があった場合のみ画像ウィンドウを書き換えています。
再生停止時、何も操作を行わなければ画像ウィンドウを書き換えることはありません。
したがって、 再生を停止したことにより1フレームも書き換えなくなったので「0fps」を表示。 ↓ 「0fps」を表示するために1フレーム書き換えたので「1fps」を表示。 ↓ 「1fps」を表示するために1フレーム書き換えようと思ったが、前回も「1fps」を表示しており、状況に変化がないので今回は書き換えず「1fps」のまま。 ↓ 書き換えが発生しなかったので「0fps」を表示。以降、繰り返し。 という流れになるので、「0fps」を1秒表示→「1fps」を2秒表示…を繰り返すのが正しい動作です。 |
|
Q. | 音声ファイルの再生を開始してからスペクトラム波形や光る鍵盤などが動き出すまでに少し時間がかかるのはなぜか? | |
A. |
音声ファイルの再生開始前、ウェーブバッファは当然ですが空になっています (というか、まだ確保されていない) 。
メインスレッドにおいて音声ファイルの再生を開始するイベントが発生すると、メインスレッドは音声の再生を担当する「再生スレッド」に対して音声ファイルの再生開始を指示します。
すると再生スレッドはウェーブバッファに音声波形データを一気に展開するわけですが、再生開始の正否をメインスレッドに通知する必要があるため、
ウェーブバッファが一杯になるまでメインスレッドに応答しません。
メインスレッドは再生スレッドからの応答をひたすら待っていますから、この間、他のイベントを処理できません。
したがって、画像ウィンドウの描画を担当する「描画スレッド」から表示の指示が来てもそれに応答することができないのです。
つまりこの間、画像ウィンドウは更新されないことになります。 エフェクタを ON にすることにより、音声波形データの展開処理が重くなるので、この傾向はさらに強まります。 特にリバーブは複数のディレイタップから成るため、ディレイエフェクトのディレイタップ数倍の重さになります。 「オプション」→「ウェーブバッファ1個の長さ」を短めに設定するか、「オプション」→「ウェーブバッファの数」を少なめに設定することによりある程度改善できますが、 再生中に音声が途切れやすくなるため、お勧めはしません。 |
|
Q. | 一時停止状態のままシークバーを操作すると、稀にレベルメータが表示されない時がある。 | |
A. |
本ソフトでは、再生用にデコードした音声波形データをリングバッファに貯め込み、スペクトラム波形などの表示に再利用しています。
目的は、音声波形データをサウンドデバイスへ出力するタイミングと実際に音が鳴るタイミングの時差の吸収と、CPU 負荷の軽減です。 リングバッファのアルゴリズムは、現在の再生位置が、FFT 用に取得する波形データのサンプリング期間の中央に来るようにし、 さらに、新しい波形データで上書きされる箇所と重ならないようにできるだけ遠ざける必要があるため、 これから再生する波形データでリングバッファを半分満たし、リードポインタは半周遅れてライトポインタを追いかけるようになっています。 再生開始直後、リングバッファは半分が音声波形データで満たされ、残りの半分は0で満たされています。 このことにより、再生開始直後の方が上記の症状は起こりやすくなります。 シークバー操作直後、リングバッファにおいて、リードポインタより未来方向にはこれから再生する波形データが展開され、 過去方向にはシークバー操作前まで再生していた波形データ、つまり今後はゴミとなるデータが残っています。 シークした所がリングバッファにおいて0で満たされている箇所であった場合は、リードポインタより過去方向に0が続くことになり、 デコーダの仕様によりシーク直後に無音部分を出力された場合は、リードポインタより未来方向に0が書き込まれます。 レベルメータ表示用のサンプリング期間は FFT 用より短い 1024 サンプルであり、この中からピーク値を求めてレベルメータに反映しているので、 リードポインタ付近に 1024 サンプル以上の "0" が存在すると、レベルメータが表示されなくなります(正確には -100dB が表示される)。 "0" の列が 1024 サンプル以上、FFT 用のサンプル数未満であった場合、 スペクトラム波形は表示されているのにレベルメータが表示されないといった現象が起こります。 以上から言えることは、シーク動作直後はリードポインタより過去方向に存在するデータには価値がなく、 スペクトラム波形、光る鍵盤、およびレベルメータを表示するための音声波形データにはゴミが半分含まれているということです。 通常の再生中であれば、このゴミを含んだ区間は一瞬で通り過ぎてしまうので問題はありませんが、 一時停止状態でシーク操作を行った場合はゴミを含んだ状態を表示し続けることになります。 もし、一時停止中の表示を正確に行いたいというのであれば、 ・シーク処理では目標位置よりも数千サンプル過去方向から音声波形を展開する。 ・デコーダはシーク直後に無音部分を出力しない。 という条件を同時に満たす必要があります。 前者は何とかなったとしても、後者はデコーダの仕様なので、アプリケーションからはどうしようもありません。 デコーダが出力する無音部分のサンプル数があらかじめわかっていれば対応可能ですが、 保証されているものではないので、確実に動作させるにはデコーダを独自実装するしかないでしょう。 本ソフトでは、「今鳴っている音」を可視化し表示することを目的としており、 一時停止中すなわち音が出ていない時の表示内容は重視しておりません。 ただ、シーク操作を行わなければ表示は正確に行われるので、 再生中に一時停止させて(シークは行わず)スペクトラム波形や光る鍵盤などを静止させ、耳コピー支援などに活用することは可能です。 |