Reference

PeloReaper Extensionの情報やダウンロードはこちらからどうぞ。
PeloReaper Extension for REAPER is here.
ReaperBanner01_w250 AudioSoftBanner01_w250

REAPERとSonarworks Reference 4の共存不具合メモ

最終更新:2021/08/03

もうSonarworks SoundID Referenceという新製品が出てしまっていて今更な感じですが、個人的に使っているSonarworks Reference 4 for Headphonesについて備忘録的に情報を残しておきます。


Sonarworks Reference 4 と本記事について

SWRef4

Reference 4は誤解を恐れずにザックリ言うと、スピーカーやヘッドホンの機材特有の音響特性をよりフラットになるような方向に補正してくれるソフトです。これがセットアップされた環境なら、どんな出力機器で鳴らしても同じような聞こえ方になる(のを目指す)感じで、音を作る人がリファレンス環境を構築する一つの選択肢となるようなツールです。

実際に複数のヘッドホンなどで聞き比べると分かりますが、さすがに音声出力機器の物理的な限界は超えられないので全く同じ聞こえ方にはならないですが、よりフラットな特性に近づけようとする結果になっていそうなのは分かりますし、自分が使う程度の範囲では十分満足しています。

今回はREAPERも使う前提でReference 4で筆者がつまずいた点や、対策のメモという感じです。以下は自分の環境だけで起きている可能性が十分にあるので、参考にする場合はそういうものとしてご理解下さい。関係ありそうな使用機材は以下の通り。

  • Windows 10 64bit ver.1909~20H2付近だったはず
  • Steinberg UR222mkII
  • SONY MDR-CD900ST他

基本的なセットアップ方法の詳細は割愛します。Studio Editionはキャリブレーションなどがありますが、Headphone Editionはインストーラーでソフト入れてライセンス認証したらヘッドフォンのプロファイルを選ぶだけです。注意点として思いつくのは購入前にお持ちのヘッドホンが対応しているか調べとくくらいでしょうか。


WASAPIモードとASIOモード

しばらく前のどこかのタイミングで導入されたWASAPIモードとASIOモード、ここから悲劇が始まりました。自分の環境ではある時Reference4をアップデートしたところから、Systemwideが起動できなくなり、いろいろ試しましたが特にREAPERとの併用という点でSystemwideの併用が出来なくなりました。

  • WASAPIモードだととにかくクラッシュするだけ。後述の設定強制削除でASIOモードに切り替えればギリ使える。
  • ASIOモードはYamahaのASIOドライバはすぐクラッシュ、ASIO4ALLだけなんとか動くみたいな状態。REAPERを起動した場合はREAPERがASIOデバイスを認識できなくなる。が、希に認識したりしなかったりという謎挙動。
  • 前のバージョンにダウングレードしようと思ったものの、Headphone Editionはネットワークで最新を取得する以外の方法がなく断念(Studio Editionはバージョンごとのインストーラーがあるが、これを入れようとしてもEdition違いで怒られる)

こんな感じの状態になってしまい、Systemwideを使うのはDAWを使わない時だけみたいな運用がしばらく続いていました。

なので比較的最近まで放置してたのですが、久々に調べ直してみるとどこかの海外フォーラムで「うちはWASAPIモードでREAPERも問題なく使えてるよ」みたいな書き込みを見かけたので、Reference4をアップデートしてWASAPIモードを試したところ、REAPERも含めてすんなり動作してしまいました。ASIOモードは微妙な不安定感のままですが・・・。

  • Reference 4の設定をWASAPIモードに変更(ヘッドホンプロファイルも作り直した気がする)
  • REAPERのメインメニュー[Options>Prefernces]から[Audio>Device]でAudio systemを[WASAPI]に設定
    SWRef4_ReaperPrefWasapi

という感じにしてやると、自分の環境では全く問題がなくなりました。本当に今までの地獄はなんだったのかというくらいスッキリ。


Reference4 Systemwideが起動しない場合の対処方法

Reference4のバージョンが上がった時に、以前の設定情報があるとクラッシュする問題が発生するタイミングがありました。最近のアップデートでは特に問題なさそうですが。

もし久々にReference4をアップデートしてSystemwideが起動しなくなったとかいう場合は、以下のパスのファイルを消すといった方法がこちらで紹介されています。

C:\ユーザー\(自分のユーザー名)\AppData\Local\Sonarworks\Reference 4\Systemwide\Systemwidecfg.db

自分もこの方法でSystemwideが起動出来るようになりました。が、やるならこのへんは自己責任でお願いします。このファイルの周辺にヘッドホンプロファイルやライセンス情報キャッシュなんかもあるので、他のファイルも含めてもろもろザックリ消してしまうみたいなのはやめた方が良いです。


Referecne4 VSTプラグインをREAPERでインサートする場所

REAPERでこのプラグインを挿すのにはうってつけの場所があります。Monitoring FXという、Masterトラックを通った後に音声デバイスへ出力される直前にかかるFXで、ここに挿すとDAWでレンダリングする際には影響がなく、モニターする音声にだけReference4を適用することが可能です。

REAPERのメインメニューから、[View>Monitoring FX]でFXウィンドウが表示されますので、ここにReference 4 VSTプラグインを挿入すればOK。

Reaper_MonitorFX

REAPERのウィンドウ右上をよく見ると[MONITOR FX]というのがあるので、そこをクリックしても同様です。ON/OFF切り替えもすぐにできて便利。

Reaper_MonitorFXButton

REAPERのMonitoring FXにこれを挿入して更にSystemwideがONになっている場合、ぱっと見で二重に音響補正が適用されてしまいそうですが、それぞれON/OFF切り替えして試してみたところDAW側の音に関してはVSTのON/OFFでだけ音質が変化し、Systemwide側のON/OFFでは変化がなかったので、おそらく二重にかかるということはなさそうな感じでした(間違ってたらすみません)。 なんか最近試してみたら普通に二重にかかっちゃってますね・・・どっかでアップデートしてからなのか・・・?(2021/08/03 SWR4 ver.4.4.8.2)


REAPERで動画編集 (12) : VideoProcessor : APIリファレンス

今回はREAPERのVideoProcessor(以下VP)のAPIをまとめておきます。

ちなみにどこに書かれていたか忘れてしまいましたが、VPのAPIリファレンスはVPのスクリプトウィンドウで[F1]キーを押すと表示されます。かなり見づらいですが、これくらいしか情報源がないというのも事実です。

予約済み変数

既に予約されている変数があり、様々な値が設定されている。これらを上書きすることで、設定を変更できるものもある。
  • project_time
    タイムライン上での現在の再生時刻(秒)
  • project_tempo
    テンポの値(BPM)
  • project_ts_num
    現在の拍子の分子の値
  • project_ts_denom
    現在の拍子の分母の値
  • project_time_qn
    タイムライン上での現在の再生時刻(QN(4分音符)単位)
  • time
    VPを実行しているItemかTrack先頭からの経過時間。ItemとTrackいずれにVPを挿しても、実際より0.02秒程度大きい値が返るが、理由は不明。
  • framerate
    プロジェクトのVideo設定で指定されたフレームレート(FPS)
  • project_w
    画像の出力サイズ(幅)。値を変更することで、強制的に出力サイズを変更可能。
  • project_h
    画像の出力サイズ(高さ)。値を変更することで、強制的に出力サイズを変更可能。
  • project_wh_valid
    プロジェクトのVideo設定の画像サイズになっているか(0の場合はメディア側のサイズなどになっている)
  • colorspace
    現在の描画用色空間。'RGBA'、'YV12'、'YUY2'が設定できる。文字列ではないため、シングルクォートで囲むこと。設定によって色の解釈が変わる。
  • param_wet
    FXに挿したVPであれば、そのFXのWet値。Wet値はエンベロープ等で変更可能。
  • param1~param16
    GUI(ノブ)で操作できるパラメータ。以下のような記述方法で定義するが、VPプリセットのサンプルを見ると分かりやすい。
    //@param <index>[:varname] 'name' [defval minval maxval centval step]

描画用の状態変数

描画の前に設定することで、描画に影響を与えられる変数たち。
  • gfx_r, gfx_g, gfx_b, gfx_a
    矩形描画や文字列描画などに使用されるRGBA値を個別に設定できる。
  • gfx_mode
    いわゆる描画のブレンドモード指定。colorspaceにより使えるものが異なる。
    • 0:通常のαブレンドモード
    • 1:加算モード
    • 3:乗算モード(RGBAとYUVとで結果が大きく異なる)
    • 17:[YUVのみ有効] (dest + src * gfx_a) * 0.5 + 0.5
    • 18:[YUVのみ有効] dest + (src -0.5) * gfx_a * 2
    • 19:[YUVのみ有効] 差分の絶対値 abs(dest - src) * gfx_a
    また、以下のフラグ追加で挙動が変わる模様。
    • 0x100:可能な場合、blit()でフィルタリングがかかるようになる
    • 0x10000:[RGBAのみ有効] ソースα値を使用
    • 0x40000:通常モードで追加のクランプを行う(αやGradient値の範囲外防止)
    • 0x80000:[YUVのみ有効] gfx_r, gfx_g, gfx_b をYUV値として扱う
  • gfx_dest
    描画先になる画像ハンドルを設定できる。-1に設定するとメインのフレームバッファに戻せる。

入力画像関連

画像管理のしくみについてはこちらの記事を参照。
  • input_count()
    現在アクセス可能な画像の個数
  • input_track_count()
    現在の再生時刻でアクセス可能な有効トラック数(動画・VPが配置されているもののみ)
  • input_track( trackIndex )
    指定したトラックの最終出力画像を取得。trackIndex=0はこの関数を呼ぶVPがある次のトラックを指し示すことに注意。
  • input_track_exact_count()
    現在の再生時刻における、トラック数を返す。これには動画・VPを含まないトラックも数に含まれる。
  • input_track_exact( trackIndex )
    指定したトラックの最終出力画像を取得。エラーとして、トラックに動画・VPがない場合は-1000、trackIndexが有効範囲外であれば-10000という値が返る。
  • input_next_item( img )
    imgの次の画像を取得する。検索はアイテム単位で順に進んでいく。
  • input_next_track( img )
    imgの次の画像を取得する。検索はトラック単位で順に進んでいく。
  • input_ismaster()
    通常は0が返るが、MasterFX, MonitorFXにVPを挿していると以下の値が返る。
    • 1:MasterFX ChainにVPが挿入されている
    • 2:MonitorFX ChainにVPが挿入されている
  • input_info( img, w, h [, srctime, wet, param1, ...] )
    画像の情報を取得する。img以外は全て画像の情報が引数の変数に書き込まれる。

動的な画像確保関連

画像をVP内で一時的に確保して、効果を作るための画像バッファとして利用できます。
  • gfx_img_alloc( [w, h, clear] )
    新しい画像インスタンスを確保します。戻り値に画像ハンドルが返ります。
  • gfx_img_free( img )
    gfx_img_alloc()で確保した画像インスタンスを解放します。
  • gfx_img_info( img, w, h )
    画像の情報(幅、高さ)を取得します。戻り値に取得できたかどうかが返ります。
  • gfx_img_resize( img, w, h [,clear] )
    画像のリサイズ。
  • gfx_img_hold( img )
    現在の画像を後のフレームでも参照できるようにコピーして保持(戻り値に画像ハンドルが返る)。これで取得したハンドルは不要になったらgfx_img_free()で解放する必要があります。
  • gfx_img_getptr( img )
    画像単位で割り振られる?ユニークなID値を取得します。gfx_img_hold()で画像が保持されている間だけ有効。

描画関連

画像や矩形の描画や色変換等の関数がいろいろと用意されています。意外とラインや円を描画するといったものはないので、それに近い表現をするには画像を用意するとか、gfx_evalrect()で頑張るとかする必要がありそうです。
  • gfx_set( r, g, b [, a=1, mode=0, dest] )
    描画用状態変数の設定。R,G,B,A, Modeは省略も含めて必ず設定されます。destのみ指定されたら更新されます。
  • gfx_blit( img [, preserveAspect=0, x, y, w, h, srcX, srcY, srcW, srcH] )
    画像を描画。アスペクト保持や描画範囲などの指定が可能。
  • gfx_fillrect( x, y, w, h )
    現在の色設定で矩形を描画
  • gfx_procrect( x, y, w, h, channelTable [, mode] )
    チャンネルカラーテーブルを使って色変換を行う。使い方はこちらの記事を参照。
  • gfx_evalrect( x, y, w, h, codeString [, flags, src2] )
    ピクセルフォーマットの処理単位でスクリプトを実行する。使い方はこちらの記事を参照。
  • gfx_gradrect( x, y, w, h, r, g, b, a [, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady] )
    グラデーションの具合を指定して矩形を描画。
  • gfx_rotoblit( srcIndex, angle [, x, y, w, h, srcX, srcY, srcW, srcH, clipToSrcRect=0, centXOffs=0, centYOffs=0] )
    画像を回転させて描画。centXOffs, centYOffsで回転の中心をずらすことが出来る。
  • gfx_deltablit( srcIndex, x, y, w, h, srcX, srcY, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy [, dadx, dady, dadxdy] )
    画像の読み書き参照位置等をずらしながら描画を行う。どんなパラメータを設定すればいいのか、かなり分かりづらいので、まず通常に描画される設定である以下の設定からはじめるとよい。
    gfx_deltablit(img, 0, 0, w, h, 0, 0, 1, 0, 0,1, 0, 0);
  • gfx_xformblit( srcIndex, x, y, w, h, vW, vH, table [, wantAlpha=0] )
    画像を横方向・縦方向に分割し、その分割位置での画像参照位置をテーブルで指定する。言葉で説明すると難しそうですが、3DCGの知識がある人は平面の頂点にUVを張り付けるイメージでとらえれば分かりやすい。
    vW, vHは横方向・縦方向の頂点数(画像が矩形なので、必ずそれぞれ2以上が必要)を表し、この個数分だけ画像参照位置(いわゆるテクスチャUV。値域は[0,1])を用意します。つまりテーブルの要素数は vW * vH * (頂点情報数) 。頂点情報数は通常はUV座標なので2ですが、wantAlpha=1の場合はUVとα値で3になります。
  • gfx_keyedblit( img [, x, y, w, h, srcX, srcY, kv1, kv2, kv3, kv4] )
    カラーを指定して特定の色を透過させつつ画像を描画。要するにクロマキー合成を行うのに利用できる。k1~k4の指定はcolorspace毎に意味が異なるので注意。クロマキー合成の方法についてはこちらの記事を参照。
    • YV12・YUY2
      kv1:U(default: -0.5)、kv2:V(default: -0.5)、kv3:許容範囲値(Clossness-Factor、default: 0.4)、kv4:ゲイン(default: 2.0)
    • RGBA
      kv1:GreenFactor(default:1)、kv2:BlueFactor(default: -1)、kv3:オフセット(default: -1)、kv4:色が漏れ出し(オーバーフロー?)たら削除(default: 1)
  • gfx_destkeyedblit( img [, x, y, w, h, srcX, srcY, kv1, kv2, kv3, kv4] )
    描画先のピクセルカラー値を参照して、キーカラーに該当する部分にこれから描画する画像を描画します。パラメータはgfx_keyedblit()と同様。つまりkv1~kv4を省略すると、デフォルトでは緑っぽいところにだけ画像が描画されることになります。
    gfx_blit( imgBG ); // 背景側の描画
    gfx_destkeyedblit( imgFG, 0, 0, w, h ); // imgBGの緑色部分にだけ画像を描画
    

文字列描画関連

文字列を描画するための関数があります。文字列の幅も取得できるので、意外と便利。
  • gfx_setfont( pxSize [, #fontname, flags] )
    フォントや書式の指定
    • pxSize:フォントサイズ
    • #fontname:フォント名(日本語指定は不可。英文名で指定)
    • flags:Bold:'B'、Italic:'I'、複合指定は 'BI' のようにする。文字列ではなくシングルクォートで囲った値にする。
  • gfx_str_measure( #string [, w, h] )
    文字列を描画した場合のサイズを取得。戻り値には幅(w)が返る。幅と高さを取得したい場合はw, hに変数を指定してやれば取得できる。
  • gfx_str_draw( #string [, x, y, r, g, b] )
    文字列を指定位置に描画する。r, g, bで色を指定出来るようですが、指定しても変化がありませんでした(バグかも?)

その他の関数など

いくつか値の変換関数などが用意されています。
  • rgb2yuv( r, g, b )
    r, g, bをy, u, vに変換(結果は引数に上書きされる)。[0, 1]の範囲へのクランプは行われません。
  • yuv2rgb( y, u, v )
    y, u, vをr, g, bに変換(結果は引数に上書きされる)。[0, 1]の範囲へのクランプは行われません。


このブログについて
ぺろりがREAPERで遊びたいというだけのブログかもしれない

必ずこちらをお読みください

twitter: @pelori

管理人用
  • ライブドアブログ