Back to Index

Update: 2020-06-15

Table of Contents

CubicPadSynth

CubicPadSynthキュービック パッドシンセ は PADsynth アルゴリズムを使ってオシレータのウェーブテーブルを生成するシンセサイザです。キュービック補間を使っているので、可聴域以下の低い周波数でもわりと滑らかな音が出ます。波形を直接描画できる LFO もついています

CubicPadSynth を使うには CPU が AVX 以降の SIMD 命令セットをサポートしている必要があります。

パッケージには次のビルドが含まれています。

Mac を持っていないので、 macOS ビルドはテストできていません。もしバグを見つけたときは GitHub のリポジトリに issue を作るか、 ryukau@gmail.com までメールを送っていただければ対応します。

Linux ビルドは Ubuntu 18.0.4 でビルドしています。また REAPER 6.03 で動作確認を行いました。 Bitwig 3.1.2 では GUI が真っ黒になるバグがあるようです。

インストール

プラグイン

名前が .vst3 で終わるディレクトリを OS ごとに決められた位置に配置してください。

DAW によっては上記とは別に VST3 をインストールできるディレクトリを提供していることがあります。詳しくは利用している DAW のマニュアルを参照してください。

プリセット

解凍して出てきたディレクトリを OS ごとに決められた位置に配置すると使えるようになります。

プリセットディレクトリの名前はプラグインと同じである必要があります。 Uhhyou ディレクトリが無いときは作成してください。

Windows

プラグインが DAW に認識されないときは C++ redistributable をインストールしてみてください。インストーラは次のリンクからダウンロードできます。ファイル名は vc_redist.x64.exe です。

Linux

Ubuntu 18.0.4 では次のパッケージのインストールが必要です。

sudo apt install libxcb-cursor0  libxkbcommon-x11-0

もし DAW がプラグインを認識しないときは、下のリンクの Package Requirements を参考にして VST3 に必要なパッケージがすべてインストールされているか確認してみてください。

REAPER の Linux 版がプラグインを認識しないときは ~/.config/REAPER/reaper-vstplugins64.ini を削除して REAPER を再起動してみてください。

色の設定

初回設定時は手動で次のファイルを作成してください。

既存の色のテーマを次のリンクに掲載しています。 style.json にコピペして使ってください。

style.json の設定例です。

{
  "fontPath": "",
  "foreground": "#ffffff",
  "foregroundButtonOn": "#000000",
  "foregroundInactive": "#8a8a8a",
  "background": "#353d3e",
  "boxBackground": "#000000",
  "border": "#808080",
  "borderCheckbox": "#808080",
  "unfocused": "#b8a65c",
  "highlightMain": "#368a94",
  "highlightAccent": "#2c8a58",
  "highlightButton": "#a77842",
  "highlightWarning": "#8742a7",
  "overlay": "#ffffff88",
  "overlayHighlight": "#00ff0033"
}

16 進数カラーコードを使っています。

プラグインはカラーコードの 1 文字目を無視します。よって ?102938\n11335577 も有効なカラーコードです。

2 文字目以降のカラーコードの値に 0-9a-f 以外の文字を使わないでください。

以下は設定できる色の一覧です。設定に抜けがあるとデフォルトの色が使われます。

操作

操作できる箇所を右クリックすると DAW によって提供されているコンテキストメニューを開くことができます。

つまみとスライダーでは次の操作ができます。

OctaveSeed などで使われている数値スライダーでは、上記に加えて次の操作ができます。

Wavetable タブの Gain, Width, Pitch, Phase と Main タブの LFO Wave で使われている青い縦棒が並んだコントロール (BarBox) ではショートカットが使えます。ショートカットは BarBox を左クリックしてフォーカスすると有効になります。フォーカス後にマウスカーソルを BarBox の領域外に移動させると、ショートカットが一時的に無効になります。ショートカットによって変更されるパラメータはカーソルの位置によって変更できます。 Information タブを開くとショートカットの一覧を見ることができます。

入力 操作
Ctrl + 左ドラッグ デフォルト値にリセット
Shift + 左ドラッグ 素朴な描画 (フレーム間の補間が無効)
ホイールドラッグ 直線の描画
a 符号を交互に入れ替え
d すべての値をデフォルト値にリセット
D 最小値・中央値・最大値の切り替え
e 低域の強調
E 高域の強調
f ローパスフィルタ
F ハイパスフィルタ
i 値の反転 (最小値を保存)
I 値の反転 (最小値を 0 に設定)
n 最大値を 1 に正規化 (最小値を保存)
N 最大値を 1 に正規化 (最小値を 0 に設定)
p ランダムに並べ替え
r ランダマイズ
R まばらなランダマイズ
s 降順にソート
S 昇順にソート
t 少しだけランダマイズ (ランダムウォーク)
T 少しだけランダマイズ (0 に収束)
z アンドゥ
Z リドゥ
, (Comma) 左に回転
. (Period) 右に回転
1 すべての値を低減
2-9 インデックスが 2n-9n の値を低減

いくつかの 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) の可能性が高まります。音程が高くなるほどアクセスパターンがランダムに近くなるので、環境によっては重くなります。

PADsynth アルゴリズムの概要

CubicPadSynth は ZynAddSubFXYoshimi で使われている PADsynth アルゴリズムでウェーブテーブルを合成しています。

適当に位相をランダマイズした周波数成分を逆 DFT すると一方の端ともう一方の端が滑らかにつながった周期的な波形になります。PADsynth アルゴリズムはこの性質を使って滑らかにループするウェーブテーブルを合成します。

周波数成分の合成ではプロファイルと呼ばれている適当な関数をスペクトラム上に並べます。 CubicPadSynth のプロファイルはオリジナルの PADsynth アルゴリズムと同じ正規分布曲線を使っています。プロファイルの中心となる周波数は任意に決めることができます。 CubicPadSynth ではデフォルトで Base Freq. で指定した基本周波数とその倍音にあたる周波数を使います。

ブロック線図

図が小さいときはブラウザのショートカット Ctrl + マウスホイール や、右クリックから「画像だけを表示」などで拡大できます。

図で示されているのは大まかな信号の流れです。実装と厳密に対応しているわけではないので注意してください。

パラメータ

Main タブ

Tuning

Octave, Semi, Milli

全体の音の高さを変更します。

ET, A4 [Hz]

音律を変更します。

ET は Equal Temperature (平均律) の略です。 ET が 12 のときは 12 平均律となります。 ET を 12 よりも小さくすると無音になる範囲が増えるので注意してください。

A4 [Hz] は、音程 A4 の周波数です。

Gain

A, D, S, R

音量エンベロープのパラメータです。

Gain

音量を変更します。

Lowpass

現在の音程よりも倍音の少ないウェーブテーブルを使うことで疑似的にローパスフィルタを再現しています。

カットオフ周波数の計算式は次のようになっています。

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

フィルタのカットオフ周波数を変更します。

KeyFollow

右いっぱいに回すと音程に関わらず倍音の数がだいたい等しくなるようにカットオフ周波数を調節します。左いっぱいに回すと音程に関わらず Cutoff で設定されたカットオフ周波数を使います。

A, D, S, R, Amount

フィルタのカットオフ周波数を変調するエンベロープのパラメータです。 AmountCutoff への変調量です。

Pitch

A, D, S, R, Amount

ノートごとにピッチを変調するエンベロープのパラメータです。

Negative

エンベロープの符号を反転します。

Unison

nUnison

ユニゾンに使うボイスの数です。

Misc.nVoice を増やすことで nUnison が大きいときに起こるリリースの途切れを減らすことができますが、引き換えに動作が重くなります。

Detune, Random Detune

Detune はユニゾンに使われているボイスのピッチをずらす量です。

Random Detune のチェックを入れると、ピッチがずれる量がノートオンごとにランダムに変わるようになります。

random = RandomDetune ? rand() : 1
detune = pitch * (1 + random * unisonIndex * Detune)
GainRnd

ユニゾンに使われているボイスの音量をランダムに変更する量です。

Phase

ユニゾンに使われているボイスの位相をランダムに変更する量です。

Phase セクションの Reset にチェックが入っていないとき、この値は無視されます。

Spread, Spread Type

Spread はユニゾンの左右の広がりの量です。

Spread Type でボイスのピッチに応じたパンの割り当て方を選択できます。

LFO

Refresh LFO

現在の LFO Wave のパラメータに基づいて LFO のウェーブテーブルを更新します。

ウェーブテーブルの更新中は音が止まるので注意してください。発音中のノートも全て停止します。

Interpolation

LFO のウェーブテーブルの補間の種類です。

Tempo, Multiply

LFO の周波数をテンポに応じた形で指定します。 Tempo の下の数字が音符の長さ、上の数字が音符の数です。例えば上が 6 、下が 8 なら 8 分音符の 6 個分の長さが LFO の 1 周期になります (6 / 8 拍子)。

MultiplyTempo から計算された周波数に掛け合わされる値です。

// (60 秒) * (4 拍子) = 240 。
lfoFrequency = Multiply * (BPM / 240) / (TempoUpperNumeral / TempoLowerNumeral)
Retrigger

チェックを入れると、ノートオンごとに LFO の位相をリセットします。

Amount

LFO でピッチを変調する量です。

Lowpass

LFO にかけるローパスフィルタのカットオフ周波数を変更します。

LFO Wave

LFO の波形です。

Phase

Phase

オシレータの初期位相です。

Reset

チェックを入れると、ノートオンのたびにオシレータの位相を Phase で指定した値にリセットします。

Random

チェックを入れると、ノートオンごとに位相をランダマイズします。 Phase で指定した値がランダマイズの範囲になります。

Misc.

Smooth

特定の値を変更したときに、変更前の値から変更後の値に移行する時間(秒)です。

Smooth と関連するパラメータのリストです。 * はワイルドカードです。

nVoice

最大同時発音数です。

Pool

チェックを入れると、現在の発音数が同時最大発音数に近づいたときに、音量の最も小さいボイスをリリースします。ノートオン時に生じるプチノイズの低減に使えます。

Wavetable タブ

倍音コントロール

Gain

プロファイルの高さです。

Width

プロファイルの幅です。

Pitch

プロファイルの周波数にかけ合わせる値です。

Phase

プロファイルの位相をランダマイズする量です。

Pitch

Base Freq.

ウェーブテーブルのレンダリング時の基本周波数です。この値が小さいとマスターピッチのチューニングが狂うことがあるので注意してください。

Multiply, Modulo

プロファイルの周波数を変更します。

profileFrequency = mod(
  BaseFreq * profileIndex * overtonePitch * Multiply,
  440 * pow(2, (Modulo - 69) / 12)
)
Random

チェックを入れると、倍音コントロールの Pitch で指定された値を無視して、プロファイルの周波数をランダマイズします。

Spectrum

Expand

スペクトラムを周波数軸に沿って拡大・縮小するスケーリング係数です。

Shift

スペクトラムを左右にシフトする量です。

Comb

Comb の値が 1 以上のとき、プロファイルをくし状に変形します。値はくしのすき間の間隔です。

Shape

Shape の値を指数として、プロファイルの形をべき乗によって変更します。

shapedProfile = powf(profile, shape);
Invert

スペクトラムの絶対値の最大値が 0 、 0 が絶対値の最大値になるように反転します。符号は保持されます。位相は考慮していません。

maxRe = max(abs(spectrumRe))
maxIm = max(abs(spectrumIm))
invertedSpectrumRe = spectrumRe - sgn(spectrumRe) * maxRe
invertedSpectrumIm = spectrumIm - sgn(spectrumIm) * maxIm

Phase

UniformPhase

チェックを入れると、プロファイル内での位相を均一にします。

Random

Seed

乱数のシード値です。この値を変えると生成される乱数が変わります。

Modifier

Gain^

倍音コントロールの Gain をべき乗する値です。

profileGain = pow(Gain, Gain^)
Width*

倍音コントロールの Width にかけ合わせる値です。

profileWidth = Width * (Width*)

Refresh Table

現在の Wavetable タブのパラメータに基づいてオシレータのウェーブテーブルを更新します。

ウェーブテーブルの更新中は音が止まるので注意してください。発音中のノートも全て停止します。

チェンジログ

旧バージョン

ライセンス

CubicPadSynth のライセンスは GPLv3 です。 GPLv3 の詳細と、利用したライブラリのライセンスは次のリンクにまとめています。リンクが切れているときは ryukau@gmail.com にメールを送ってください。

VST® について

VST is a trademark of Steinberg Media Technologies GmbH, registered in Europe and other countries.