# CubicPadSynth

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

- CubicPadSynth 0.1.29 `full` - VST 3 をダウンロード (github.com)
- CubicPadSynth 0.1.29 `macOS` - VST 3 をダウンロード (github.com)
- プリセットをダウンロード (github.com)

x86_64 環境で CubicPadSynth を使うには AVX 以降の SIMD 命令セットをサポートする CPU が必要です。

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

- Windows (x86_64)
- Linux (x86_64)
- macOS (Universal 2)

Linux ビルドは Ubuntu 24.04 でビルドしています。もし Ubuntu 24.04 以外のディストリビューションを使っているときは、プラグインが読み込まれないなどの不具合が起こることがあります。この場合はビルド手順に沿ってソースコードからビルドしてください。

macOS で使用するときは `macOS` パッケージのダウンロードを推奨します。また Apple Developer Program に加入していないので、インストール時に Gatekeeper を迂回するように設定する必要があります。詳細は インストール -> macOS の節を参照してください。

## 連絡先

何かあれば GitHub のリポジトリに issue を作るか `ryukau@gmail.com` までお気軽にどうぞ。

paypal.me/ryukau から開発資金を投げ銭することもできます。

## インストール

### プラグイン

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

- Windows では `/Program Files/Common Files/VST3/` に配置します。
- Linux では `$HOME/.vst3/` に配置します。
- macOS では `/Library/Audio/Plug-ins/VST3/` あるいは `/Users/$USERNAME/Library/Audio/Plug-ins/VST3/` に配置します。

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

### プリセット

注意: プリセットの無いプラグインもあります。

プリセットはページの最上部のリンクからダウンロードできるプラグインパッケージに含まれています。以下はプリセットのインストール手順です。

1. ページの最上部のリンクからプラグインをダウンロード。
2. ダウンロードした zip ファイルを解凍。
3. `presets` ディレクトリ内の `Uhhyou` ディレクトリを OS ごとに決められたディレクトリに配置。

以下は OS ごとのプリセットの配置先の一覧です。

- Windows : `/Users/$USERNAME/Documents/VST3 Presets`
- Linux : `$HOME/.vst3/presets`
- macOS : `/Users/$USERNAME/Library/Audio/Presets`

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

- Preset Locations - VST 3 Developer Portal

### Windows

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

- The latest supported Visual C++ downloads

### Linux

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

    sudo apt install libxcb-cursor0  libxkbcommon-x11-0

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

- VSTGUI: Setup

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

### macOS

重要: `full` パッケージは動作未確認です。以下のファイルは `codesign` されていないので削除する必要があるかもしれません。

- `Contents/Resources/Documentation`
- `Contents/x86_64-linux`
- `Contents/x86_64-win`

`macOS` パッケージでは上記のファイルの削除は不要です。また、すべてのパッケージは `codesign` コマンドの ad-hoc signing の状態になっています。

#### 隔離の解除

プラグインの初回起動時に「破損している」という趣旨のメッセージが表示されることがあります。この場合は、ターミナルを開いて、解凍した `.vst3` ディレクトリに次のコマンドのどちらか、あるいは両方を適用してみてください。 `/path/to/PluginName.vst3` の部分はインストールしたプラグインのパスに置き換えてください。

    xattr -rd com.apple.quarantine /path/to/PluginName.vst3
    xattr -rc /path/to/PluginName.vst3

#### Gatekeeper の迂回

プラグインは署名されていない (unsigned) 、または公証されていない (un-notarized) アプリケーションとして認識されることがあります。この場合は、警告メッセージが表示された後に、システム環境設定を開いて「セキュリティとプライバシー」 → 「一般」の「このまま開く」ボタンを押してください。以下にリンクした Apple 公式のヘルプページにスクリーンショット付きで同じ手順が掲載されています。「ノータリゼーションを受けていない App や未確認の開発元の App を開きたい場合」を参照してください。

- Mac で App を安全に開く - Apple サポート (日本)

ここまでの手順を経てまだ動かないときはインストール先を `/Library/Audio/Plug-ins/VST3/` あるいは `/Users/$USERNAME/Library/Audio/Plug-ins/VST3/` のいずれか使っていなかったほうに変えてみてください。

上記の方法がすべて上手くいかなかったときは以下の手順を試してみてください。

1. ターミナルを開いて `sudo spctl --master-disable` を実行。
2. システム環境設定を開いて「セキュリティとプライバシー」 → 「一般」 → 「ダウンロードしたアプリケーションの実行許可」と辿り、「全てのアプリケーションを許可」を選択。

上記の手順を実行するとシステムのセキュリティが弱くなるので注意してください。元に戻すには以下の手順を実行してください。

1. システム環境設定を開いて「セキュリティとプライバシー」 → 「一般」 → 「ダウンロードしたアプリケーションの実行許可」と辿り、「App Store と認証済みの開発元からのアプリケーションを許可」を選択。
2. ターミナルを開いて `sudo spctl --master-enable` を実行。

#### `codesign` の適用

注意 この節の内容は `macOS` パッケージには関連しないと考えられますが未検証です。 (GitHub の issue)

`full` パッケージを利用する場合は以下のコマンドを適用することで利用できるかもしれません。

    sudo codesign --force --deep -s - /path/to/PluginName.vst3

`codesign` の利用には Xcode のインストールが必要となるかもしれません。

#### 参考リンク

- Safely open apps on your Mac - Apple Support
- java - “libprism_sw.dylib” cannot be opened because the developer cannot be verified. on mac JAVAFX - Stack Overflow
- How to Fix App “is damaged and can’t be opened. You should move it to the Trash” Error on Mac
- Allowing unsigned/un-notarized applications/plugins in Mac OS | Venn Audio
- codesign Man Page - macOS - SS64.com

## GUI の見た目の設定

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

- Windows では `/Users/ユーザ名/AppData/Roaming/UhhyouPlugins/style/style.json` 。
- Linux では `$XDG_CONFIG_HOME/UhhyouPlugins/style/style.json` 。
  - `$XDG_CONFIG_HOME` が空のときは `$HOME/.config/UhhyouPlugins/style/style.json` 。
- macOS では `/Users/$USERNAME/Library/Preferences/UhhyouPlugins/style/style.json` 。

プラグインのウィンドウを閉じて開くたびに `style.json` が読み込まれて更新されます。

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

- VSTPlugins/package/style/themes at master · ryukau/VSTPlugins

`style.json` の設定例です。

    {
      "guiScale"          : 1          ,
      "fontFamily"        : "Tinos"    ,
      "fontBold"          : true       ,
      "fontItalic"        : true       ,
      "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"
    }

### GUI のサイズ

- `guiScale`: GUI の表示倍率。例えば `0.75` にすると 75% 、 `2.0` にすると 200% 。

`guiScale` の値の下限は `0.01` です。上限はほぼありません (64-bit float の最大値) 。

注意: `guiScale` の倍率を大きくしすぎると、 DAW によってはプラグインウィンドウの閉じるボタンがクリックできない位置に配置されてしまう、などといった問題が起きることがあります。

### フォントオプション

以下はフォントオプションの一覧です。

- `fontFamily`: フォントファミリ名。
- `fontBold`: ボールドスタイル (太字) を `true` で有効、 `false` で無効。
- `fontItalic`: イタリックスタイル (斜体) を `true` で有効、 `false` で無効。

カスタムフォントを使用するには、プラグインディレクトリの `*.vst3/Contents/Resources/Fonts` に `*.ttf` ファイルを配置します。

注意: `fontFamily` 、 `fontBold` 、 `fontItalic` で設定したフォントファミリ名とスタイルの組み合わせが `*.vst3/Contents/Resources/Fonts` 以下のいずれかの `*.ttf` ファイルに含まれていないときは VSTGUI が指定するデフォルトフォントが使用されます。

`fontFamily` が長さ 0 の文字列 `""` のときはフォールバックとして `"Tinos"` に設定されます。長さが 1 以上かつ、存在しないフォントファミリ名が指定されると VSTGUI が指定するデフォルトフォントが使用されます。

ボールドあるいはイタリック以外のスタイルは VSTGUI がサポートしていないので動作確認していません。該当する例としては Noto フォントの Demi Light や、 Roboto フォントの Thin や Black などがあります。

### 色のオプション

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

- 6 桁の色は RGB 。
- 8 桁の色は RGBA 。

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

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

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

- `foreground`: 文字の色。
- `foregroundButtonOn`: オンになっているボタンの文字の色。 `foreground` か `boxBackground` のいずれかと同じ値にすることを推奨します。
- `foregroundInactive`: 非アクティブなタブの文字の色。
- `background`: 背景色。
- `boxBackground`: 矩形の UI 部品の内側の背景色。
- `border`: 縁ふちの色。
- `borderCheckbox`: チェックボックスの縁の色。
- `borderLabel`: パラメータセクションのラベルの左右の直線の色。
- `unfocused`: つまみがフォーカスされていないときの色。
- `highlightMain`: フォーカスされたときの色。スライダの値の表示にも使用されます。
- `highlightAccent`: フォーカスされたときの色。一部のプラグインをカラフルにするために使用されます。
- `highlightButton`: ボタンがフォーカスされたときの色。
- `highlightWarning`: 変更に注意を要する UI がフォーカスされたときの色。
- `overlay`: オーバーレイの色。
- `overlayHighlight`: フォーカスを示すオーバーレイの色。

## 操作

パラメータが割り当てられているコントロールの上で `右クリック` すると、 DAW から提供されるコンテキストメニューが開きます。

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

- `Ctrl` + `左クリック` : 値のリセット。
- `Shift` + `左ドラッグ` : 細かい値の変更。
- `ホイールクリック` : 最小値、デフォルト値、最大値の切り替え。
- `Shift` + `ホイールクリック` : 現在値の小数点以下を切り捨て。
  - 注意: デシベル表記のパラメータは、振幅に変換された後の値について切り捨て。

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

左下のプラグイン名をクリックすると、よく使いそうな一部のショートカットを見ることができます。利用できる全てのショートカットを次の表に掲載しています。

入力 | 操作
--- | ---
`左ドラッグ` | 値の変更
`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`-`4` | インデックスが 2n-4n の値を低減
`5`-`9` | インデックスが 2n-5n の値をホールド

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

- Alsa Opensrc Org - Independent ALSA and linux audio support site
- linux - What are XRuns? - Unix & Linux Stack Exchange

## PADsynth アルゴリズムの概要

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

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

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

- PADsynth algorithm

## ブロック線図

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

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

## パラメータ

### Main タブ

#### Tuning

Octave, Semi, Milli

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

  - `Octave`: オクターブ
  - `Semi`: 半音
  - `Milli`: 半音の 1 / 1000 。 1 / 10 セント。
ET, A4 [Hz]

  音律を変更します。

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

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

#### Gain

A, D, S, R

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

  - `A` (Attack) : 鍵盤を押した瞬間から最大音量になるまでのアタック時間。
  - `D` (Decay) : 最大音量からサステイン音量になるまでのディケイ時間。
  - `S` (Sustain) : アタックとディケイが終わった後に鍵盤を押し続けているときのサステイン音量。
  - `R` (Release) : 鍵盤から指を離したあとに音量が 0 になるまでのリリース時間。
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

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

#### 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` でボイスのピッチに応じたパンの割り当て方を選択できます。

  - `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

Refresh LFO

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

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

Interpolation

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

Tempo, Multiply

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

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

      // (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` と関連するパラメータのリストです。 `*` はワイルドカードです。

  - Tuning セクションの全て
  - Gain
    - `S`
    - `Gain`
  - Lowpass
    - `Cutoff`
    - `KeyFollow`
    - `S`
    - `Amount`
  - Pitch
    - `S`
    - `Amount`
    - `Negative`
  - LFO
    - `Tempo`
    - `Multiply`
    - `Amount`
    - `Lowpass`
  - Phase
    - `Phase`
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 タブのパラメータに基づいてオシレータのウェーブテーブルを更新します。

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

## チェンジログ

- 0.1.29
  - 初期化にウィンドウの大きさがおかしくなる (512x512 px) バグを修正。
- 0.1.28
  - GUI のサイズを変更するオプションを追加。
  - BarBox の昇順ソートのショートカットが無効になっていたバグを修正。
  - VSTGUI4 の Linux パッチを更新。
- 0.1.27
  - DAW から適切なノート ID が提供されないときに、同音連打するとノートオンで生じていたクリックを低減。 Bitwig, Live, REAPER での使用時に影響あり。
- 0.1.26
  - Linux での GUI を修正。
- 0.1.25
  - Zip パッケージにプリセットを同梱するよう変更。
  - 不正な `style.json` によりプラグインがクラッシュするバグを修正。
- 0.1.24
  - デフォルトの `foregroundInactive` の色を変更。
  - サブノーマル数によるパフォーマンスの低下を修正。
- 0.1.23
  - Renoise で GUI がクラッシュするバグを修正。 GUI 要素のメモリが解放された後にアクセスを行おうとしていたことがクラッシュの原因。
- 0.1.22
  - `processContext` が `nullptr` であるために Audacity で音が正しく出力されなかったバグを修正。
- 0.1.21
  - スプラッシュ画面のテキストを更新。
- 0.1.20
  - BarBox にホールドのショートカットを追加。ショートカットキーは `5`-`9` 。
  - 数値スライダに `Shift` + `ホイールクリック` による値の切り捨てのショートカットを追加。
  - FFTW3 のスレッドセーフでない関数呼び出しによるクラッシュを防止するために mutex を追加。
- 0.1.19
  - クラッシュやメモリリークを防ぐため、共通コンポーネントのデストラクタに `virtual` を追加。
  - 64 ビット ARM CPU (aarch64) に対応するコードパスを追加。
  - x86_64 CPU の SIMD 命令セットに関するランタイム・ディスパッチを削除。サポートする命令セットを AVX に固定。
- 0.1.18
  - VST 3 SDK をバージョン 3.7.6 に更新。これにより Linux で同一プラグインの GUI を複数開くとクラッシュするバグを修正。
  - BarBox が変更されたパラメータの値のみをホストに送るように変更。編集中の BarBox 上の変更されていないパラメータのオートメーションが上書きされないようになった。
- 0.1.17
  - BarBox がマウス押下でフォーカスを取得、マウスカーソルが範囲外に移動するとフォーカスを開放するように変更。
- 0.1.16
  - 一部の Windows 環境で発生していたプラグインスキャン時のクラッシュを修正。Windows 用の FFTW3 静的ライブラリを SIMD フラグなしでビルドするように変更。
- 0.1.15
  - Linux でのクラッシュを修正。
  - BarBox が `Shift` キーを受け取るように修正。
- 0.1.14
  - プラグインが許可するチャネル数の条件を修正。この修正は REAPER のサイドチェインで意図しないミュートがかかることを防ぐために行った。
- 0.1.13
  - `style.json` でカスタムフォントを設定するオプションを追加。
- 0.1.12
  - VSTGUI を 4.10 から 4.11 にアップデート。
- 0.1.11
  - フォントを Tinos に変更。
- 0.1.10
  - リセットが正しく行われるように修正。
  - `bypass` パラメータの挙動を修正。この修正によって、ホストがミュート中のプラグインにノートを送り続けても、ミュート解除とともにそれまでに送られたノートがすべて再生されなくなった。このバグは VST 3 の `bypass` パラメータを正しく実装しているホストでのみ発生していた。
- 0.1.9
  - Process context requirements を実装。
  - BarBox の機能が LV2 版と同等になるように更新。
    - 1 つのバーを編集を追加。
    - ロックを追加。
    - 内部的なマウスホイールの感度を追加。
    - スナップを追加 (未使用) 。
    - 直線の描画での開始点の値をアンカーポイントに固定するように変更。
- 0.1.8
  - DSP が初期化されているかどうかのチェックを追加。
- 0.1.7
  - いくつかの BarBox にスクロールバーを追加。
  - BarBox に アンドゥ・リドゥの機能を追加。
- 0.1.6
  - カラーコンフィグを追加。
- 0.1.5
  - パラメータの補間を可変サイズのオーディオバッファでも機能する以前の手法に巻き戻した。
- 0.1.4
  - 起動時にパラメータがロードされる前にウェーブテーブルが更新されるバグを修正。
  - LFO ウェーブテーブルの補間が Cubic のときにインデックスが 1 つずれていたバグを修正。
- 0.1.3
  - BarBox のショートカットが効かないバグを修正。
- 0.1.2
  - オートメーションと MIDI マッピングを利用できるように `Refresh Table` と `Refresh LFO` を VST のメッセージからパラメータへと変更。
  - BarBox にフォーカスした後、マウスカーソルが領域外にあるときはショートカットが無効になるように変更。
- 0.1.1
  - 文字列の描画でクラッシュするバグを修正。
- 0.1.0
  - 初期リリース。

## 旧バージョン

- CubicPadSynth 0.1.28 - VST 3 (github.com)
- CubicPadSynth 0.1.27 - VST 3 (github.com)
- CubicPadSynth 0.1.26 - VST 3 (github.com)
- CubicPadSynth 0.1.25 - VST 3 (github.com)
- CubicPadSynth 0.1.24 - VST 3 (github.com)
- CubicPadSynth 0.1.23 - VST 3 (github.com)
- CubicPadSynth 0.1.22 - VST 3 (github.com)
- CubicPadSynth 0.1.21 - VST 3 (github.com)
- CubicPadSynth 0.1.20 - VST 3 (github.com)
- CubicPadSynth 0.1.19 - VST 3 (github.com)
- CubicPadSynth 0.1.18 - VST 3 (github.com)
- CubicPadSynth 0.1.17 - VST 3 (github.com)
- CubicPadSynth 0.1.16 - VST 3 (github.com)
- CubicPadSynth 0.1.15 - VST 3 (github.com)
- CubicPadSynth 0.1.14 - VST 3 (github.com)
- CubicPadSynth 0.1.13 - VST 3 (github.com)
- CubicPadSynth 0.1.11 - VST 3 (github.com)
- CubicPadSynth 0.1.10 - VST 3 (github.com)
- CubicPadSynth 0.1.9 - VST 3 (github.com)
- CubicPadSynth 0.1.8 - VST 3 (github.com)
- CubicPadSynth 0.1.7 - VST 3 (github.com)
- CubicPadSynth 0.1.6 - VST 3 (github.com)
- CubicPadSynth 0.1.5 - VST 3 (github.com)
- CubicPadSynth 0.1.4 - VST 3 (github.com)
- CubicPadSynth 0.1.3 - VST 3 (github.com)
- CubicPadSynth 0.1.2 - VST 3 (github.com)
- CubicPadSynth 0.1.1 - VST 3 (github.com)

## ライセンス

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

- https://github.com/ryukau/VSTPlugins/tree/master/License

### VST® について

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