WaveIO 参考プログラム
(最終改訂 2021/08/28)
書庫ファイル内容
LV_WaveIO.zipには本稿(拡張子.pdf)、本稿掲載図(フォルダFigures:拡張子.png)、WaveIOラ イブラリ(註参照)を使用する9例のサンプルVI(サブVIを含めLabVIEW2017版ソースファイル 24個:拡張子.vi、同実行ファイル9個:拡張子.exe)、必要な実行時ライブラリ(フォルダdata:拡張 子.dll)他が含まれている(p. 8備考参照)。
註:Windows のアプリケーションで MME ドライバ(LabVIEW のサウンド入出力関数で使用)、
DirectSound ドライバを音声入出力に使用する場合、Windows オーディオエンジンでピークリミッタ
(約-0.13dBFS で動作)と標本化周波数変換(精度は初期の DAC レベル)を通り音質が劣化する。
WaveIOは、Christian Zeitnitz氏の開発になるサウンド入出力ライブラリ(LabVIEW7.1以降の版に 対応)で、これを用いてLabVIEWでWindowsオーディオエンジンを通さない音声入出力(WASAPI 排他モード)、ループバック音声入力を扱うことができる。
https://www.zeitnitz.eu/scms/waveio
Wave_file_recorder.viについて
旧情報学実験のページ(現行教育課程に変更後も本学のソフトウェアの変更に伴う改訂が行われてい る)にアップロードされているLabVIEWのサンプル(LabVIEW2017対応の最終改訂:2021/06/16)
http://www.ns.kogakuin.ac.jp/~ct13050/johogaku/LV_sample.zip 【書庫ファイル(解説を含む)】 http://www.ns.kogakuin.ac.jp/~ct13050/johogaku/Overview_of_LabVIEW 【解説のみ】
中のWaveIOライブラリを使用するVI例True_peak_meter.viに録音機能を持たせたもので、レベル メーターに実効値(最大振幅矩形波のパワーを0dBとするEBU(欧州放送連合)基準(日本の業界団 体ARIB(電波産業会)のdBFSrmsと同じ)と最大振幅正弦波のパワーを0dBとする米国AES(オー ディオ技術者協会)基準を選択:起動時既定はEBU)を加え、小画面の波形、スペクトラム、XY各グ ラフ(レンジ設定は割愛)を表示するものである。図 1 にWave_file_recorder.vi起動時のフロントパ ネルを示す。使用手順は次の通りである。
図1 Wave_file_recorder.vi起動時のフロントパネル(丸数字は使用手順に対応)
① “Input”メニューリング(項目“Windows normal”/“Windows loopback”/“ASIO”/“WASAPI”)
で入力方式を選ぶ。“WASAPI”を選択した場合、メニューリングの右に共有モード/排他モード切替 の押しボタンSW(表記“WASAPI exclusive”)が表示される。
② “Device”メニューリング(メニュー項目は選択した入力方式に応じて構成される)でデバイスを選 ぶ。【必要ならば押しボタンSW(表記“Invoke Sound Control Panel”)を押下してWindowsのサ ウンド設定パネル(「録音」サブパネルが開くが、再生デバイスの設定が必要な場合は「再生」サブ パネルを開く)を呼び出し、当該デバイスの排他制御、サポートする音声フォーマットを確認する。】
③ 音声フォーマット(キャプション“sound property”:起動時既定CD音質)とWaveIO入力のブロ ック長(キャプション“block size (ms)”:起動時既定100ms)を指定する
④ ファイルに録音する場合は押しボタンSW(表記“REC”)をONにし、文字列制御器(表記“memo”)
にRIFFヘッダのinfoチャンクに書き込む256B以内の注釈を設定する。ファイルのプロンプトは なく、VIの場所をベースパスとしてファイル名yyyymmddHHMMSS.wavで保存される。
⑤ 押しボタン SW(表記”START”)を押下して入力を開始する。以後、①~④に関る制御器は無効と なり、入力終了操作の押しボタンSW(表記“HALT”)が有効になる。RECボタンOFFで入力開 始した場合(録音せず入力監視のみ)はRECボタンとmemo制御器は非表示となる。HALTボタ ンが無効である入力開始前に終了する場合はツールバーの「実行を中断」ボタンをクリックする。
図2はWaveGeneで最大振幅の正弦波(左チャンネル:50Hz、右チャンネル100Hz)を内蔵サウン ドカードに出力しループバック入力した例で、標本化周波数を揃えてもスペクトラムに信号の周波数以 外の成分が現れ標本間ピークも0dBTPには達しない。
図2 標本化周波数を揃えても最大振幅ではピークリミッタによるノイズが出る
図3 標本化周波数が異なる場合はピークリミッタが動作しないレベルでも変換によるノイズが出る
ピークリミッタの影響は入力信号のレベルを下げれば無くなるが、標本化周波数が異なる場合にはレ ベルを下げても変換誤差が残る。p.2 図3はWaveGeneおよびWave_file_recorder.vi入力の標本化周
波数が44.1kHzで再生デバイスの標本化周波数が48kHzと設定が異なる例である。
オーディオエンジンによる音質劣化はピークリミッタよりも標本化周波数変換の影響の方が深刻で ある。図4はWaveGeneで最大振幅のノイズ(LabVIEWのグラフ描画ではplot1がplot2に優先する ため、右チャンネルが隠れない様に左チャンネルを「ホワイトノイズ」、右チャンネルを「M 系列ノイズ」とし ている)を標本化周波数44.1kHzビット深度16bで生成し、同じ標本化周波数で録音する例である。
信号が標本化の前にNyquist周波数未満に帯域制限されている場合、標本間ピークは最大で標本ピーク
の√2倍(約 3.01dB)であるが、帯域制限されていない標本からDA変換でNyquist周波数未満の成
分で構成するには標本間ピークは更に大きくなる。
図4左はWASAPI排他出力をオーディオインタフェースに入力(オーディオエンジンを通らない)
したもので、全ての標本が 0dBFS である「M 系列ノイズ」の標本間ピークは 7dBTP を超えている。
WaveGeneのMME出力をループバック入力(オーディオエンジンを通る)する場合も再生デバイス(こ
こでは内蔵音源のRealtek High Definition Audio)の標本化周波数をWaveGeneの設定44.1kHzに揃 えた図4中では傾向は劣化無しの図4左とほぼ同じである。
これに対し、再生デバイスの標本化周波数を48kHzとした図4右では波形グラフ、XYグラフにも図 4左とは顕著な違いが見られ標本間ピークは0dBTPに達しない。
図4 入力方式と再生デバイス標本化周波数の違いによる比較
この例のWaveGene生成信号を音声ファイルに保存し精度のよい標本化周波数変換プログラム(例え
ば柴田氏のSSRC)で48kHzに変換保存した場合の「M系列ノイズ」の標本間ピークは6dBTPを超える が、同じ条件(図4右の設定ではなく再生デバイスに加え録音の標本化周波数も 48kHzとする)では
0dBTPは超えるものの高々0.2dBTP程度である。実際、Windowsオーディオエンジンの標本化周波数
変換でのTHD+Nは線形補間とスプライン補間の中間に相当し音響機器のレベルではない。
Wave_file_player.viについて
大学の学生実験で広く使用される計測系の定番フリーソフトであるefu氏の「高速リアルタイムスペ クトラムアナライザー」WaveSpectra は同じ作者によるWaveGeneと共に内部演算の精度がよいこと が特徴で、WaveGene同様にWASAPI排他モードの出力を設定して音声ファイルを高音質で再生し指 定チャンネルの波形とスペクトラムを表示できる。
Wave_file_player.viはWave_file_recorderと操作性を揃えた非圧縮音声ファイルの再生を行うVIで、
一時停止も早送りもできないが再生範囲の指定、両チャンネルの波形とスペクトラムのグラフ、音量(ブ ロック毎の真ピークおよびEBU基準実効値)の時間変化のプロットを表示し、音量は再生終了後テキ ストファイルに保存が可能である。Wave_file_recorderのレベルメーターを省き、グラフ表示画面を少 し大きくしてレンジ設定も可能にしている。ファイル読取りは NI ライブラリ、サウンド出力には WaveIOライブラリを使用している。p.4図5にWave_file_player.vi起動時のフロントパネルを示す。
使用手順は次の通りである。
図5 Wave_file_player.vi起動時のフロントパネル(丸数字は使用手順に対応)
① “Output”メニューリング(項目“Windows normal”/“ASIO”/“WASAPI”)で出力方式を選ぶ。
“WASAPI”を選択した場合、メニューリングの右に共有モード/排他モード切替の押しボタン SW
(表記“WASAPI exclusive”)が表示される。
② “Device”メニューリング(メニュー項目は選択した出力方式に応じて構成される)でデバイスを選 ぶ。【必要ならば押しボタンSW(表記“Invoke Sound Control Panel”)を押下してWindowsのサ ウンド設定パネル(「再生」サブパネルが開く)を呼び出し当該デバイスの排他制御、サポートする 音声フォーマットを確認する。】
③ ブロック長(キャプション“block size (ms)”:起動時既定100ms)を指定する
④ 再生する音声ファイルをファイルダイアログ(表記“WAV file location”)で開くかまたはドラグ&
ドロップする。ファイルパスが有効であれば音声フォーマット(“sound property”クラスタ)およ びファイル長(表記“length (s)”)に値が入り、再生範囲を指定する数値ボックス併設の数値スラ イド(表記“playback range (s)”:既定はファイル全体)が表示される。
⑤ 再生範囲を指定する。
⑥ 押しボタンSW(表記“START”:ファイルパスが無効な場合は押下できない)を押下して再生を開 始する。音量プロット表示範囲を指定する数値ボックス併設の数値スライド(表記“time scale (s)”: 既定は再生範囲全体)が表示され、以後、①~⑤に関る制御器は無効となり、終了操作の押しボタ
ンSW(表記“HALT”)が有効になる。再生終了後 真ピークと実効値の時間変化グラフの右に表
示される押しボタンSW(表記“save volume”)を押下すると、各行にEBU実効値(dBFSrms)、 標本間真ピーク(dBTP)、ブロック先頭時刻(s)の再生範囲分をテキストファイル(拡張子は.txt)
に保存する。ファイルのプロンプトは無く、保存先は再生ファイルと同じフォルダ、ファイル名は 再生ファイル名にyyyymmddHHMMSSを連結したものとなる。再生開始前に終了する場合はツー ルバーの「実行を中断」ボタンをクリックする。
p.5図6は旧情報学実験Ⅰ課題7で使用したファイル中のCranes_In_Their_Nest.wav(人間国宝故 山口五郎氏の演奏になる尺八曲「巣鶴鈴慕」:太陽系から外に出るNASAの2機の惑星探査機Voyager は異星人に Voyager の故郷を伝えるというロマンのため地球に関する様々な画像と音声が記録された Golden Recordを搭載しているが、日本人の演奏データとして唯一Golden Recordに収録されたもの)
を再生した例である。EL JINETE FILMS(http://www.eljinetefilms.com/)の企画“The Golden Record:
A Documentary”では、水野明哲元学長が山口師の竹盟社を継いだ一番弟子として取材を受けている。
https://vimeo.com/272232926 インタビュー入:2m05s-3m04s https://vimeo.com/439016573 演奏のみ:4m15s-7m29s
図6 Cranes_In_Their_Nest.wavを再生中のWave_file_player.viのフロントパネル
LV_Wave2017.viについて
図7 バーチャルカフェテリアでLV_Wave2017.viを実行中のデスクトップ全体
LV_Wave2017.viは、時間、周波数の両領域でパラメータ(数式文字列による波形指定を含む)を設
定して生成した2系統の信号にフィルタを施し、両信号またはその和、差、積を左右のチャンネルに割 当て、波形、スペクトラム、XY 各グラフを表示する LV_Wave.vi(LabVIEW2013 版)のフロントパ ネルを下部にタスクバーを表示するデスクトップに収まるサイズとした(図7参照:他にスペクトラム
グラフの周波数スケールの主マーカーの値が標本化周波数×10の冪であったものを通常の10の冪の表 示に改めている)LabVIEW2017 版である。フォントの違いにより、一部の制御器、表示器のラベル、
キャプションにレイアウトの変更では吸収しきれない見苦しさが残っている。LV_Wave.vi で使用する 関数VIにLabVIEW2017で廃止されたものがあるため、代替VIで書き換えたLV_Wave2017.vi をフ ァイルメニューの「旧バージョン用に保存」でLabVIEW2013ソースとして保存することはできない。
LV_Wave.viと同様に実行ファイルは停止状態で開く設定でビルドしており、機能に変更は無い。
詳細については、LV_WaveIO.zip を解凍し、_LV_Wave フォルダ中の解説(LV_Wave.pdf:最終改 訂2018/05/17)、同掲載図(Figures フォルダ)、波形生成式サンプル等(sampleフォルダ)を参照さ れたい。
錯聴デモVI等について【2021/08/16追加】
視覚の錯覚である錯視(optical illusion)と同様に聴覚にも錯聴(auditory illusion)があり、利き 手の左右の違いが聴こえ方に関係することを1974年にDiana Deutschが明らかにした。LV_Octave.vi、
LV_Scale.vi、LV_Chromatic.vi、LV_Cambiata.viの4個のデモVI(メインVIのみでサブVIは使用 していない)は、スピーカーではなくヘッドホンで再生する。
これらのVIでは各音の呈示順序と周波数の配列をWhileループの外で生成するため、ピッチ等の設 定は停止時に行い、実行ファイルは停止状態で開く設定でビルドしている。設定の制御器(LV_Octave.vi、
LV_Scale.viの左側メニューリングおよびLV_Scale.vi、LV_Chromatic.vi、LV_Cambiata.viの数値ス ライド)は実行中グレーアウトされる。実行中も有効な右側メニューリング(ラベル“menu”:既定は 錯聴)により、左右の耳に呈示される音を(LV_Octave.vi以外では上昇と下降の音階または逸音も)単 独で確認できる。
図8に4個のVIの実行ファイル起動時のフロントパネルとメニューリング項目(LV_Octave.vi右メ ニューリングの項目は左メニューリングの選択に応じて構成されるため既定の項目)を示す。右メニュ ーリングの項目の切替時にクリック雑音が出ない様にWhileループを接続させているが(ループ0.25s で周波数が4の倍数のみのLV_Octave.viでは対応不要)、“HALT”で終了時にも雑音が発生しない様に
【2021/08/21改訂】スライドSW(キャプション“suppress click noise”:既定はON)を追加した。
ONにした場合は、無音部分がバッファの先頭に来て終了するまでに余分な時間がかかる。
図8 ヘッドホン受聴の錯聴デモVIの起動時のフロントパネルとメニューリング項目
● “Octave Illusion” http://deutsch.ucsd.edu/psychology/pages.php?i=202
オクターブ間隔の二音を交互に左右で高低を逆にして聴かせるとき、右利きの人では右耳に高い音の み、左耳に低い音のみが聴こえる。既定の400Hz/800Hzの他、停止時に左側のメニューリングでNature の原論文にある200Hz/400Hzと800Hz/1600Hzも選べる。低音、高音の単独再生もできるが、切替わ るまでに(ループ 0.25s×バッファ数で)1sかかる。
http://deutsch.ucsd.edu/pdf/Nature-1974_251_307-309.pdf
● “Scale Illusion” http://deutsch.ucsd.edu/psychology/pages.php?i=203
同様に右利きならば右耳に高い音のみ左耳に低い音のみが聴こえるため、音高が上下する中に音階が 知覚されるデモで、停止時にピッチ(既定:A4=440Hz、数値ボックスへの入力は32Hz~16000Hz に 制限)と音律(既定はハ長調純正律)を選べる。
● “Chromatic Illusion” http://deutsch.ucsd.edu/psychology/pages.php?i=204
“Scale Illusion”の半音階版で、音律は平均律のみ、音高が2オクターブにわたるためピッチの数値 ボックスへの入力は上限8000Hzに制限される。
● “Cambiata Illusion” https://deutsch.ucsd.edu/psychology/pages.php?i=208 【2021/08/28追加】
同じく右利きならば右耳に高い音のみ左耳に低い音のみが聴こえるため逸音が知覚されるデモで、同 じ6音が左右で半周期(3音0.36s)ずらして呈示される(“Octave Illusion”と同様)。音律は平均律の みでピッチの数値ボックスへの入力は45Hz~10kHzに制限される。
Roger Shepardの「無限音階」(「LabVIEWによる信号関連参考プログラム」pp. 10-12参照)は、
部分音に周波数エンベロープをかけて重ね、各部分音の周波数を同じ比率で増加または減少させて音階 を形成するとき、周波数が無限に増加または減少を続けるかの様に錯覚するものである。
http://www.ns.kogakuin.ac.jp/~ct13050/johogaku/LV_signal.pdf http://www.ns.kogakuin.ac.jp/~ct13050/johogaku/LV_signal.zip
三全音異なる二音に同様の周波数エンベロープで部分音を重ねるとき、何れが高く聴こえるかは、育 った言語が関係することを、これもD. Deutschが1986年に明らかにした。LV_Tritone.vi【2021/08/28 追加】は、エンベロープの尖鋭度、中心周波数と部分音の帯域を実行時に設定可能(起動時の既定は D. Deutschの例 http://philomel.com/mp3/musical_illusions/Tritone_paradox.mp3 に揃えている)
としたデモVI(メインVIのみでサブVIは使用していない)である。この例では二音がギャップ無く 滑らかに接続されているが、VI による実時間生成では同様の処理が間に合わないため fade-in/out(各 200標本:約4.5ms)で接続している。
● “Tritone Paradox” https://deutsch.ucsd.edu/psychology/pages.php?i=206
音律は平均律のみで、ピッチの数値ボックスへの入力もスケール範囲内(415Hz~450Hz)に限られ る。音声データは左右同一であり再生はスピーカーでもよい。
図9は、バーチャルカフェテリアでLV_Tritone.viを実行し、既定音前半のFの音をループバック入 力に設定したWave_file_recorder.viで表示した例である。
図9 LV_Tritone.viのフロントパネル(左)と既定音を再生時のWave_file_recorder.viによる表示(右)
LV_Delay.vi は、両耳間時間差(高々0.6ms)を超えても遅れが小さい間は早く到達した方の単音と
知覚されるデモVI(メインVIのみでサブVIは使用していない。スピーカーでも確認できるがヘッド ホンの使用が望ましい)で、部分音の数と減衰はJ. R. Pierceの“The Science of Musical Sound”付 録音源2.10“Delay and Localization”と同じにしている。周波数は既定の441Hz以外も選べ、遅延は 任意に(スケール範囲外も数値ボックスで)設定でき、音符ボタン( )のクリックで再生される。
再生が終る(遅れた方の減衰終了)まで数値スライドと音符ボタンは無効化されるがグレーアウトはし ない。錯聴デモVIと異なり音声データを全てWhileループ内で生成するため、パラメータは実行中に 変更可能で実行ファイルは実行状態で開く設定でビルドしている。
図10は、LV_Delay.vi を図9と同様にバーチャルカフェテリアで実行した例で、右に対する左の遅 れ55ms(当然、単音とは認識されない)で再生中にループバック入力に設定したWave_file_recorder.vi で表示したキャプチャである。
図10 LV_Delay.viの再生中のフロントパネル(左)とWave_file_recorder.viによる表示(右)
備考
ソースVIの実行
LV_WaveIO.zipにはWaveIOライブラリ(最新版はwaveio_108.zip)は同梱されていない。必要な 実行時ライブラリが data フォルダに含まれる実行ファイル(スタンドアロンアプリケーション:拡張 子.exe)を開くためには必要ないが、ソースVIを開くにはChristian Zeitnitz氏のサイトからダウンロ ードし、解凍して得られるWaveIO.llbおよびWaveIO.dllをソースVI(メインVIおよびサブVI)と 同じ場所に置いてメインVIを開く。このときWaveIO.llb(LabVIEW7.1以降の版に対応)は、LabVIEW の版に応じて構成されるため、メインVIには変更箇所がある旨のアステリスクが表示される。
https://www.zeitnitz.eu/scms/getfile?issrc&name=waveio/waveio_108.zip
各メインVIで参照するサブVIは次の通りである。
● Wave_file_recorder.vi:dB_LEDr.vi
● Wave_file_player.vi:padding.viおよびRMS_SP_LR.vi
● LV_Wave2017.vi:assign.vi、dB_calc.vi、DBL_read.vi、DBL_write.vi、DTMF.vi、DTMF_string.vi、
f_check.vi、filter.vi、IFFT.vi、str_read.vi、str_write.viおよびtone_burst.vi
LabVIEW2017ランタイムエンジン
本学の学生は、特別な利用申請無しに「バーチャルカフェテリア」にログインしてセンターの閉館時
にもLabVIEW2017を利用することができるが、ソースVIの編集実行ではなく実行ファイルを開くだ
けであれば、個人所有の PC に以下のランタイムエンジンをインストールすることでセンターの
LabVIEW2017 32b版で作成された実行ファイルをネットワーク接続無しに実行できる。ヘルプファイ
ル、旧版ランタイムエンジンとは異なり、ダウンロードにはNI User Accountの登録が必要である。
ダウンロードページ:http://www.ni.com/download/labview-run-time-engine-2017-sp1/7191/en/
ファイル名:LVRTE2017SP1_f3Patchstd.exe、ファイルサイズ:363.29 MiB
実行時ライブラリとフォント指定について
実行ファイルを開くには実行時ライブラリ(拡張子.dll)が必要なため、LV_WaveIO.zipを解凍して 生成される dataフォルダを実行ファイルと同じ場所に置いて開く。必要なライブラリは、次の通りで ある。
Wave_file_player.exe:lvanlys.dll、lvsound2.dll およびWaveIO.dll
LV_Scale.exe, LV_Wave2017.exe, Wave_file_recorder.exe:lvanlys.dllおよびWaveIO.dll
LV_Cambiata.exe, LV_Chromatic.exe , LV_Delay.exe, LV_Octave.exe, LV_Tritone.exe:WaveIO.dll のみ
LabVIEW では、フォントを VI の作成時に明示的に指定することもできるが、通常実行ファイルを
作成する場合には(指定フォントがインストールされていない環境では表示できなくなるため)OS 既 定のフォントを使用しており、作成時のフォントと実行時のフォントが異なる場合、文字列が枠に収ま らないなどレイアウトが乱れることになる。LV_WaveIO.zip中のソースVI、実行ファイルは何れもセ ンターのバーチャルカフェテリアでの実行環境に合せて作成されており、以下の3行が書かれた同梱の 設定ファイル(VIと同じファイル名で拡張子が.ini)を実行ファイルと同じ場所に置いて開くこと。
appFont="メイリオ" 17 dialogFont="メイリオ" 17 systemFont="メイリオ" 17