Update: 2020-09-02

CubicPadSynth は PADsynth アルゴリズムを使ってオシレータのウェーブテーブルを生成するシンセサイザです。キュービック補間を使っているので、可聴域以下の低い周波数でもわりと滑らかな音が出ます。波形を直接描画できる LFO もついています
CubicPadSynth を使うには CPU が AVX 以降の SIMD 命令セットをサポートしている必要があります。
パッケージには次のビルドが含まれています。
Mac を持っていないので、 macOS ビルドはテストできていません。もしバグを見つけたときは GitHub のリポジトリに issue を作るか、 ryukau@gmail.com までメールを送っていただければ対応します。
Linux ビルドは Ubuntu 18.0.4 でビルドしています。また Bitwig と REAPER で動作確認を行っています。もし Ubuntu 18.04 以外のディストリビューションを使っているときは、プラグインが読み込まれないなどの不具合が起こることがあります。この場合はビルド手順に沿ってソースコードからビルドしてください。
名前が .vst3 で終わるディレクトリを OS ごとに決められた位置に配置してください。
/Program Files/Common Files/VST3/ に配置します。$HOME/.vst3/ に配置します。/Users/$USERNAME/Library/Audio/Plug-ins/VST3/ に配置します。DAW によっては上記とは別に VST3 をインストールできるディレクトリを提供していることがあります。詳しくは利用している DAW のマニュアルを参照してください。
解凍して出てきたディレクトリを OS ごとに決められた位置に配置すると使えるようになります。
/Users/$USERNAME/Documents/VST3 Presets/Uhhyou$HOME/.vst3/presets/Uhhyou/Users/$USERNAME/Library/Audio/Presets/Uhhyouプリセットディレクトリの名前はプラグインと同じである必要があります。 Uhhyou ディレクトリが無いときは作成してください。
プラグインが DAW に認識されないときは C++ redistributable をインストールしてみてください。インストーラは次のリンクからダウンロードできます。ファイル名は vc_redist.x64.exe です。
Ubuntu 18.0.4 では次のパッケージのインストールが必要です。
もし DAW がプラグインを認識しないときは、下のリンクの Package Requirements を参考にして VST3 に必要なパッケージがすべてインストールされているか確認してみてください。
REAPER の Linux 版がプラグインを認識しないときは ~/.config/REAPER/reaper-vstplugins64.ini を削除して REAPER を再起動してみてください。
注意: この節は英語で macOS を使用しているユーザからの報告によって作成されました。日本語でのエラーメッセージが分からなかったので曖昧な書き方になっています。
プラグインの初回起動時に「破損している」という趣旨のメッセージが表示されることがあります。この場合は、ターミナルを開いて、解凍した .vst3 ディレクトリに次のコマンドを適用してみてください。
プラグインは署名されていない (unsigned) 、または公証されていない (un-notarized) アプリケーションとして認識されることがあります。この場合は以下の手順を試してみてください。
sudo spctl --master-disable を実行。上記の手順を実行するとシステムのセキュリティが弱くなるので注意してください。元に戻すには以下の手順を実行してください。
sudo spctl --master-enable を実行。初回設定時は手動で次のファイルを作成してください。
/Users/ユーザ名/AppData/Roaming/UhhyouPlugins/style/style.json 。$XDG_CONFIG_HOME/UhhyouPlugins/style/style.json 。
$XDG_CONFIG_HOME が空のときは $HOME/.config/UhhyouPlugins/style/style.json 。/Users/$USERNAME/Library/Preferences/UhhyouPlugins/style/style.json 。既存の色のテーマを次のリンクに掲載しています。 style.json にコピペして使ってください。
style.json の設定例です。
{
"fontPath": "",
"foreground": "#000000",
"foregroundButtonOn": "#000000",
"foregroundInactive": "#8a8a8a",
"background": "#ffffff",
"boxBackground": "#ffffff",
"border": "#000000",
"borderCheckbox": "#000000",
"borderLabel": "#000000",
"unfocused": "#dddddd",
"highlightMain": "#0ba4f1",
"highlightAccent": "#13c136",
"highlightButton": "#fcc04f",
"highlightWarning": "#fc8080",
"overlay": "#00000088",
"overlayHighlight": "#00ff0033"
}16 進数カラーコードを使っています。
プラグインはカラーコードの 1 文字目を無視します。よって ?102938 や \n11335577 も有効なカラーコードです。
2 文字目以降のカラーコードの値に 0-9a-f 以外の文字を使わないでください。
以下は設定できる色の一覧です。設定に抜けがあるとデフォルトの色が使われます。
fontPath: フォント (*.ttf) の絶対パス。VST 3 版では実装されていません。foreground: 文字の色。foregroundButtonOn: オンになっているボタンの文字の色。 foreground か boxBackground のいずれかと同じ値にすることを推奨します。foregroundInactive: 非アクティブなタブの文字の色。background: 背景色。xboxBackground: 矩形の UI 部品の内側の背景色。border: 縁の色。borderCheckbox: チェックボックスの縁の色。borderLabel: パラメータセクションのラベルの左右の直線の色。unfocused: つまみがフォーカスされていないときの色。highlightMain: フォーカスされたときの色。スライダの値の表示にも使用されます。highlightAccent: フォーカスされたときの色。一部のプラグインをカラフルにするために使用されます。highlightButton: ボタンがフォーカスされたときの色。highlightWarning: 変更に注意を要する UI がフォーカスされたときの色。overlay: オーバーレイの色。overlayHighlight: フォーカスを示すオーバーレイの色。操作できる箇所を右クリックすると DAW によって提供されているコンテキストメニューを開くことができます。
つまみとスライダーでは次の操作ができます。
Octave 、 Seed などで使われている数値スライダーでは、上記に加えて次の操作ができます。
Wavetable タブの Gain, Width, Pitch, Phase と Main タブの LFO Wave で使われている青い縦棒が並んだコントロール (BarBox) ではショートカットが使えます。ショートカットは BarBox を左クリックしてフォーカスすると有効になります。フォーカス後にマウスカーソルを BarBox の領域外に移動させると、ショートカットが一時的に無効になります。ショートカットによって変更されるパラメータはカーソルの位置によって変更できます。 Information タブを開くとショートカットの一覧を見ることができます。
| 入力 | 操作 |
|---|---|
| 左ドラッグ | 値の変更 |
| Shift + 左ドラッグ | 値の変更 (スナップ) |
| Ctrl + 左ドラッグ | デフォルト値にリセット |
| Ctrl + Shift + 左ドラッグ | 値の変更 (フレーム間の補間が無効) |
| ホイールドラッグ | 直線の描画 |
| Shift + ホイールドラッグ | 1 つのバーを編集 |
| Ctrl + ホイールドラッグ | デフォルト値にリセット |
| Ctrl + Shift + ホイールドラッグ | ロックの切り替え |
| a | 符号を交互に入れ替え |
| d | すべての値をデフォルト値にリセット |
| D | 最小値・中央値・最大値の切り替え |
| e | 低域の強調 |
| E | 高域の強調 |
| f | ローパスフィルタ |
| F | ハイパスフィルタ |
| i | 値の反転 (最小値を保存) |
| I | 値の反転 (最小値を 0 に設定) |
| l | マウスカーソル下のバーのロックの切り替え |
| L | 全てのバーのロックを切り替え |
| n | 最大値を 1 に正規化 (最小値を保存) |
| N | 最大値を 1 に正規化 (最小値を 0 に設定) |
| p | ランダムに並べ替え |
| r | ランダマイズ |
| R | まばらなランダマイズ |
| s | 降順にソート |
| S | 昇順にソート |
| t | 少しだけランダマイズ (ランダムウォーク) |
| T | 少しだけランダマイズ (0 に収束) |
| z | アンドゥ |
| Z | リドゥ |
| , (Comma) | 左に回転 |
| . (Period) | 右に回転 |
| 1 | すべての値を低減 |
| 2-9 | インデックスが 2n-9n の値を低減 |
Shift + 左ドラッグ のスナップは一部の BarBox だけで有効になっています。特定の BarBox にスナップを追加したいという要望があれば、お気軽に GitHub のリポジトリに issue を開いてください。
Shift + ホイールドラッグ による 1 つのバーを編集は、マウスホイールが押された時点でカーソルの下にあるバーだけを編集します。マウスホイールが押されている間はカーソルの左右の位置に関わらず、選択したバーのみを編集できます。
Ctrl + Shift + ホイールドラッグ によるロックの切り替えでは、マウスホイールが押された時点でカーソルの下にあるバーの反対の状態が残り全てに適用されます。例えばカーソルの下のバーがアクティブだったときはロックに切り替えます。
いくつかの BarBox の下にはスクロールバーがついています。細かい調整を行うときはスクロールバーの左右のハンドルを 左ドラッグ で動かすことで表示範囲を変更できます。スクロールバーでは次の操作が行えます。
Refresh LFO あるいは Refresh Table ボタンを押すと音が止まります。発音中のノートも全て停止します。
1 つのウェーブテーブルの長さは 2^18 サンプルです。
各 MIDI ノートと 20000Hz までのピッチベンドができるように帯域制限された 136 のウェーブテーブルが生成されます。約 21100 Hz より音程が高くなると完全な無音になります。 21100 は MIDI ノート番号 136 から求められた値です。 MIDI ノート番号 137 の周波数は 22050 Hz よりも高いので、サンプリング周波数が 44100 Hz のときにエイリアシングが起こります。したがって一つ小さい 136 を使っています。
音程の基本周波数が 8.18 Hz (MIDI ノート番号 0) より低くなると高域の周波数成分が失われた音になります。ただし、キュービック補間によって生じるノイズによって、周波数成分の値が完全に 0 にはならないことがあります。
noteToFreq(note) := 440 * pow(2, (note - 69) / 12)
noteToFreq(0) = 8.175798915643707
noteToFreq(136) = 21096.16364242367
noteToFreq(137) = 22350.606811712252
ウェーブテーブルは 136 * 2^18 の 2 次元配列として表現されています。オシレータの位相と周波数から求められるテーブル上の座標についてバイキュービック補間で値を求めています。
ウェーブテーブルが大きめなので、メモリが遅いとフレーム落ち (xrun) の可能性が高まります。音程が高くなるほどアクセスパターンがランダムに近くなるので、環境によっては重くなります。
CubicPadSynth は ZynAddSubFX や Yoshimi で使われている PADsynth アルゴリズムでウェーブテーブルを合成しています。
適当に位相をランダマイズした周波数成分を逆 DFT すると一方の端ともう一方の端が滑らかにつながった周期的な波形になります。PADsynth アルゴリズムはこの性質を使って滑らかにループするウェーブテーブルを合成します。
周波数成分の合成ではプロファイルと呼ばれている適当な関数をスペクトラム上に並べます。 CubicPadSynth のプロファイルはオリジナルの PADsynth アルゴリズムと同じ正規分布曲線を使っています。プロファイルの中心となる周波数は任意に決めることができます。 CubicPadSynth ではデフォルトで Base Freq. で指定した基本周波数とその倍音にあたる周波数を使います。
図が小さいときはブラウザのショートカット Ctrl + マウスホイール や、右クリックから「画像だけを表示」などで拡大できます。
図で示されているのは大まかな信号の流れです。実装と厳密に対応しているわけではないので注意してください。

全体の音の高さを変更します。
Octave: オクターブSemi: 半音Milli: 半音の 1 / 1000 。 1 / 10 セント。音律を変更します。
ET は Equal Temperament (平均律) の略です。 ET が 12 のときは 12 平均律となります。 ET を 12 よりも小さくすると無音になる範囲が増えるので注意してください。
A4 [Hz] は、音程 A4 の周波数です。
音量エンベロープのパラメータです。
A (Attack) : 鍵盤を押した瞬間から最大音量になるまでのアタック時間。D (Decay) : 最大音量からサステイン音量になるまでのディケイ時間。S (Sustain) : アタックとディケイが終わった後に鍵盤を押し続けているときのサステイン音量。R (Release) : 鍵盤から指を離したあとに音量が 0 になるまでのリリース時間。音量を変更します。
現在の音程よりも倍音の少ないウェーブテーブルを使うことで疑似的にローパスフィルタを再現しています。
カットオフ周波数の計算式は次のようになっています。
cut = Cutoff * 128
keyFollowRange = Cutoff * (nTable - pitch)
lowpassPitch = (cut + KeyFollow * (keyFollowRange - cut)) - lowpassEnvelope * Amount;
if (lowpassPitch < 0) lowpassPitch = 0
noteToFreq(note) := 440 * Math.pow(2, (note - 69) / 12)
range = noteToFreq(nTable)
lpFreq = noteToFreq(midiNote + lowpassPitch)
ntFreq = noteToFreq(midiNote)
cutoffFrequency = (1 + (range - lpFreq) / range) * ntFreq
lpCut の計算に使っている 128 は MIDI ノート番号の範囲 + 1 から適当に決めた値です。また nTable = 136 です。
フィルタのカットオフ周波数を変更します。
右いっぱいに回すと音程に関わらず倍音の数がだいたい等しくなるようにカットオフ周波数を調節します。左いっぱいに回すと音程に関わらず Cutoff で設定されたカットオフ周波数を使います。
フィルタのカットオフ周波数を変調するエンベロープのパラメータです。 Amount は Cutoff への変調量です。
ノートごとにピッチを変調するエンベロープのパラメータです。
エンベロープの符号を反転します。
ユニゾンに使うボイスの数です。
Misc. の nVoice を増やすことで nUnison が大きいときに起こるリリースの途切れを減らすことができますが、引き換えに動作が重くなります。
Detune はユニゾンに使われているボイスのピッチをずらす量です。
Random Detune のチェックを入れると、ピッチがずれる量がノートオンごとにランダムに変わるようになります。
random = RandomDetune ? rand() : 1
detune = pitch * (1 + random * unisonIndex * Detune)
ユニゾンに使われているボイスの音量をランダムに変更する量です。
ユニゾンに使われているボイスの位相をランダムに変更する量です。
Phase セクションの Reset にチェックが入っていないとき、この値は無視されます。
Spread はユニゾンの左右の広がりの量です。
Spread Type でボイスのピッチに応じたパンの割り当て方を選択できます。
Alternate L-R: Ascend L -> R と Ascend R -> L を交互に変更。Alternate M-S: HighOnMid と HighOnSide を交互に変更。Ascend L -> R: 左から右に向かってピッチが上昇。Ascend R -> L: 右から左に向かってピッチが上昇。HighOnMid: 端から中央に向かってピッチが上昇。HighOnSide: 中央から端に向かってピッチが上昇。Random: ランダムに生成したパンを割り当て。偏ることがあります。RotateL: ノートオンごとに割り当てを左に回転。RotateR: ノートオンごとに割り当てを右に回転。Shuffle: 均一に並べたパンをランダムに割り当て。現在の LFO Wave のパラメータに基づいて LFO のウェーブテーブルを更新します。
ウェーブテーブルの更新中は音が止まるので注意してください。発音中のノートも全て停止します。
LFO のウェーブテーブルの補間の種類です。

LFO の周波数をテンポに応じた形で指定します。 Tempo の下の数字が音符の長さ、上の数字が音符の数です。例えば上が 6 、下が 8 なら 8 分音符の 6 個分の長さが LFO の 1 周期になります (6 / 8 拍子)。
Multiply は Tempo から計算された周波数に掛け合わされる値です。
// (60 秒) * (4 拍子) = 240 。
lfoFrequency = Multiply * (BPM / 240) / (TempoUpperNumeral / TempoLowerNumeral)
チェックを入れると、ノートオンごとに LFO の位相をリセットします。
LFO でピッチを変調する量です。
LFO にかけるローパスフィルタのカットオフ周波数を変更します。
LFO の波形です。
オシレータの初期位相です。
チェックを入れると、ノートオンのたびにオシレータの位相を Phase で指定した値にリセットします。
チェックを入れると、ノートオンごとに位相をランダマイズします。 Phase で指定した値がランダマイズの範囲になります。
特定の値を変更したときに、変更前の値から変更後の値に移行する時間(秒)です。
Smooth と関連するパラメータのリストです。 * はワイルドカードです。
SGainCutoffKeyFollowSAmountSAmountNegativeTempoMultiplyAmountLowpassPhase最大同時発音数です。
チェックを入れると、現在の発音数が同時最大発音数に近づいたときに、音量の最も小さいボイスをリリースします。ノートオン時に生じるプチノイズの低減に使えます。

プロファイルの高さです。
プロファイルの幅です。
プロファイルの周波数にかけ合わせる値です。
プロファイルの位相をランダマイズする量です。
ウェーブテーブルのレンダリング時の基本周波数です。この値が小さいとマスターピッチのチューニングが狂うことがあるので注意してください。
プロファイルの周波数を変更します。
profileFrequency = mod(
BaseFreq * profileIndex * overtonePitch * Multiply,
440 * pow(2, (Modulo - 69) / 12)
)
チェックを入れると、倍音コントロールの Pitch で指定された値を無視して、プロファイルの周波数をランダマイズします。
スペクトラムを周波数軸に沿って拡大・縮小するスケーリング係数です。
スペクトラムを左右にシフトする量です。
Comb の値が 1 以上のとき、プロファイルをくし状に変形します。値はくしのすき間の間隔です。

Shape の値を指数として、プロファイルの形をべき乗によって変更します。
shapedProfile = powf(profile, shape);
スペクトラムの絶対値の最大値が 0 、 0 が絶対値の最大値になるように反転します。符号は保持されます。位相は考慮していません。
maxRe = max(abs(spectrumRe))
maxIm = max(abs(spectrumIm))
invertedSpectrumRe = spectrumRe - sgn(spectrumRe) * maxRe
invertedSpectrumIm = spectrumIm - sgn(spectrumIm) * maxIm
チェックを入れると、プロファイル内での位相を均一にします。
乱数のシード値です。この値を変えると生成される乱数が変わります。
倍音コントロールの Gain をべき乗する値です。
profileGain = pow(Gain, Gain^)
倍音コントロールの Width にかけ合わせる値です。
profileWidth = Width * (Width*)
現在の Wavetable タブのパラメータに基づいてオシレータのウェーブテーブルを更新します。
ウェーブテーブルの更新中は音が止まるので注意してください。発音中のノートも全て停止します。
Refresh Table と Refresh LFO を VST のメッセージからパラメータへと変更。CubicPadSynth のライセンスは GPLv3 です。 GPLv3 の詳細と、利用したライブラリのライセンスは次のリンクにまとめています。リンクが切れているときは ryukau@gmail.com にメールを送ってください。
VST is a trademark of Steinberg Media Technologies GmbH, registered in Europe and other countries.