無料版と有料版を、1つのソースから作る(機能は隠さず、灰色で見せる)

無料版と有料版を、1つのソースから作る つくる側の話

Windows 向けの VST3 プラグインを8本出しています。4種類 × 無料版/有料版です。

作り始めたとき、いちばん迷ったのはここでした。

無料版と有料版を、どうやって作り分けるのか。

★ フォルダを2つに分けてはいけない、というのは分かっていました。直すたびに2か所を直すことになり、いつか必ず食い違います。

この記事は、そこをどうしたかの記録です。


★★ 結論:1つのソースから、2つビルドする

ソースは1つ。ビルドのときに、フラグを1つ立てるかどうかだけを変えます。

// Edition.h
#ifndef SORYNO_FREE
 #define SORYNO_FREE 0    // 何も指定しなければ有料版
#endif

ビルドの設定(CMake)には、同じソースから2つの製品を書いてあります。

juce_add_plugin(SORYNO_EQ
    PRODUCT_NAME "SORYNO EQ Pro")          # 何も足さない = Pro

juce_add_plugin(SORYNO_EQ_Free
    PRODUCT_NAME "SORYNO EQ Free")
target_compile_definitions(SORYNO_EQ_Free PUBLIC
    SORYNO_FREE=1)                          # ★ ここだけが違う

★ これで、1回のビルドで2つの .vst3 が出ます。

build\SORYNO_EQ_artefacts\Release\VST3\SORYNO EQ Pro.vst3
build\SORYNO_EQ_Free_artefacts\Release\VST3\SORYNO EQ Free.vst3

★★ 直す場所は、いつも1か所です。これが目的でした。


★★★ ここからが本題:「隠す」ではなく「配線を断つ」

無料版で機能を止める方法は、いくつもあります。

やり方問題
つまみを隠す★ 裏には残っている。DAW のパラメータ一覧には出てしまう
つまみを無効にする★★ 同上。値を書き換える手段が残る
音に制限をかける(時間で切る等)★ 使い勝手が悪い。★★ 無料版としての意味が薄れる

★★★ 選んだのは、これです。

無料版のビルドでは、Pro 機能の「パラメータと UI をそもそも作らない」。

ソースのコメントに、そのまま書いてあります。

方針:Free ビルドでは Pro 機能の「パラメータと UI を生成しない(配線を断つ)」。
      → Free 版の DAW パラメータ一覧にも UI にも Pro 機能は現れず、呼び出す手段が無い。
      DSP の計算コードは共有ファイルに残るが無配線ゆえ Free からは到達不能。

★★ 計算するコードは、両方に入っています。共有しているので当然です。ですが、無料版にはそこへ繋がる線がありません。パラメータが存在しないからです。

★★★ 「隠してあるものを暴く」ということが、そもそもできません。暴く対象が無いからです。

★ 実際の書き方は、こうなります。

p.q      = apvts.getRawParameterValue (param::bandQID (b));
#if ! SORYNO_FREE
p.type   = apvts.getRawParameterValue (param::bandTypeID (b));   // Pro だけ
p.chan   = apvts.getRawParameterValue (param::bandChanID (b));
#endif

★ この #if は、4製品で 38・31・20・22 か所あります(EQ・COMP・LIMIT・DEESS の順)。多いように見えますが、2つのフォルダを同期し続けるよりはるかに楽です。


★★★ それでも、機能は「見せます」

★★ ここが、たぶんいちばん珍しいところです。

無料版でも、有料版の機能は画面に出したままにしています。押せませんが、そこにあることは見えます。右上に小さく「PRO」と付けて。

ソースのコメントにも、理由をそのまま書いてあります。

// ノブの右上に小さく「PRO」。触れない理由が一目で分かるようにする。

★★★ 理由は2つあります。

① 「壊れている」と誤解されないため

★ 押せないつまみが、理由もなく置いてあると、人は「バグだ」と思います。「PRO」と書いてあれば、押せない理由が一目で分かります。

★★ 実際、リミッターでは TRUE PEAK の欄がまるごと有料版専用です。ここは有料版を買ういちばんの理由でもあるので、押せない理由が出ていないと「壊れている」と受け取られます。

② ★★ 何が増えるのかが、買う前に分かるため

★★★ 機能一覧を読ませるより、画面を見せるほうが速いです。

「有料版では〇〇ができます」と書くより、灰色のつまみがそこにあるほうが、何が増えるのかが伝わります。

★ これは、私が作っているものの考え方そのものでもあります。コンプが効いているかは、光る点で分かる。ディエッサーが削った音は、耳で聴ける。リミッターが何を抑えたかは、重ねた波形で分かる。——有料版に何があるかも、同じように「見えれば」いいと考えました。


★★ 削ったことが、長所になることもあります

★ 面白かったのは、ここです。

イコライザーの有料版には Linear Phase(位相直線)モードがあります。そのため、使うと遅れ(レイテンシー)が出ます。

無料版には、その機能がありません。だから——

#if SORYNO_FREE
    setLatencySamples (0);   // Free:Linear Phase なし=常にレイテンシ 0
#else
    // Pro:Linear Phase のときは FIR の半分だけ遅れる
#endif

★★★ 無料版は、常に遅れがゼロです。

★ 録音しながら掛けたい人には、むしろ無料版のほうが向いています。「機能が少ない」は、必ずしも「劣っている」ではありませんでした。

★★ そう気づいてから、無料版の説明の書き方が変わりました。「Pro の下位版」ではなく、「遅れがゼロの版」として書けるからです。


★ やってみて分かった、注意点

★★★ 灰色のつまみには、「本当の固定値」を出すこと

★ ここは一度、間違えかけました。

押せないつまみに、適当な値を表示してはいけません。無料版が内部で実際に使っている値を出す必要があります。

// Free:Pro 専用は「見せるだけ」。隠すと Pro に何があるか気づかれない。
// 値は **Free が内部で実際に使っている固定値**を出す(実装と揃えること)。
targetKnob = ... ("TARGET", ..., "-14.0 LUFS", 0.55);

★★ 表示と中身がずれていたら、それは嘘になります。灰色でも、書いてある数字は本当のことでなければいけません。

★ 製品名も、ビルドで切り替える

“SORYNO EQ Pro” と “SORYNO EQ Free” は別の製品名です。DAW から見ると別のプラグインなので、両方を同時に入れられます。

★ 無料版で作った設定を、そのまま有料版で開き直せる——という導線も、ここが分かれているから作れました。

★★ 「同じソース」を、検算で守る

★ 1つのソースにしても、うっかり無料版だけ壊すことはあります。

★★ そこで、無料版の画面を描き出すだけの小さなツールを別に作りました(FreeRender)。無料版の見た目を、いつでも画像で確認できます。

★★★ ブログの記事で使っている画面写真も、これで撮っています。DAW を立ち上げずに、同じ条件の絵が出ます。


★ まとめ

  • ★★★ ソースは1つ。ビルドのフラグ1つで2製品にする(フォルダを分けない)
  • ★★★ 無料版では、有料機能の「パラメータと UI を作らない」。隠すのではなく配線を断つ
  • ★★ それでも画面には見せる。押せない理由を「PRO」と書いて添える
  • 「壊れている」と誤解されないため
  • 何が増えるのかが、買う前に見えるため
  • ★ 灰色のつまみには、本当の固定値を出す。表示と中身がずれたら嘘になります
  • ★★ 削ったことが長所になることもある(無料版は常にレイテンシ0)

★ ここで作っているものは、こちらで配っています。

コメント

タイトルとURLをコピーしました