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)
★ ここで作っているものは、こちらで配っています。

コメント