# DoubleLoopCymbal

DoubleLoopCymbalダブル ループ シンバル はハイハットとトライアングルの間のような音が出るシンセサイザです。オールパスループというディレイのつなぎ方を使って金属的な質感を出しています。

- DoubleLoopCymbal 0.1.1 `full` - VST 3 をダウンロード (github.com)
- DoubleLoopCymbal 0.1.1 `macOS` - VST 3 をダウンロード (github.com)

注意: プリセットはサンプリング周波数が 48000 Hz でなければ想定された音が出ません。

`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` + `ホイールクリック` : 現在値の小数点以下を切り捨て。
  - 注意: デシベル表記のパラメータは、振幅に変換された後の値について切り捨て。

## 注意

音量の変化が大きいのでリミッタと併用してください。

## ブロック線図

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

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

## パラメータ

角かっこ [] で囲まれているのは単位です。以下は単位の一覧です。

- [dB] : デシベル (decibel) 。
- [s] : 秒 (second) 。
- [Hz] : 周波数 (Hertz) 。
- [sample] : サンプル数。 1 サンプルは `1 / (サンプリング周波数)` 秒。
- [st.] : 半音 (semitone)。 1 半音は `1 / 12` オクターブ。

### Mix & Options

Output [dB]

  出力ゲインです。

2x Sampling

  チェックすると 2 倍のオーバーサンプリングを有効にします。

Release

  チェックを入れると、

  - ノートオフの後も音が止まらなくなります。
  - `Closing Noise` セクションの設定がすべて無視されます。
Fixed Noise

  チェックを入れるとノートオンごとの音の揺れを抑えます。

  内部的にはノイズ信号の合成に使われる乱数のシードをノートオンごとにリセットします。

Spread

  ステレオスプレッダのかかり具合です。値が 1 に近づくほど左右の広がりがでます。

Split [Hz]

  ステレオスプレッダのクロスオーバー周波数です。

  大まかには指定した周波数以上でのみステレオスプレッダの効果が出ます。ただしクロスオーバーフィルタの性質によって指定した周波数以下であっても効果が完全に無効とはなりません。

External Input [dB]

  外部入力のゲインです。

  DoubleLoopCymbal は外部入力に金属的な質感を加えるエフェクタとして使うことができます。

  重要: エフェクタとして使うときでも DoubleLoopCymbal にノートイベントを送ってください。ノートが演奏されていないとき、外部入力はミュートされます。

  ノートイベントはハイハットのオープン・クローズと似た表現を行うために使われます。例えば、片手で MIDI キーボードを抑えながら、もう片方の手で机などを叩いてマイクに音を入れるといったセットアップを想定しています。

  マイクからの入力を使うのであれば外部入力を事前にイコライザで調整することを推奨します。プラスチックのような固い素材の衝突であればそのまま励起信号として使えますが、手で机をたたいた音などは低い周波数が強すぎることがあります。

  DoubleLoopCymbal が生成する励起信号 (ノイズ) を外部入力に置き換えるときは以下のパラメータをすべて最小 (-inf dB) にしてください。

  - `Impact Noise` -> `Gain`
  - `Half Closed Noise` -> `Gain`
  - `Closing Noise` -> `Gain`

  外部入力やノートイベントをルーティングする方法はお使いの DAW のマニュアルを参照してください。

### Tuning

Note -> Pitch

  ノートの音程によるピッチの変調量です。

  `Note -> Pitch` の値によらず、音程が C4 (MIDI ノート番号でいうと 60) のときにピッチの変調量が 0 となります。

  `Note -> Pitch` の値が 0.0 のとき、ノートのピッチは無視されます。

  `Note -> Pitch` の値が 1.0 のときに音程がピッチにそのまま反映されます。ただしドラムの音ははっきりとした音程を持たないのでチューニングがあっていないように聞こえることがあります。また、実装の都合により音が高くなるほどチューニングが狂います。

  `Note -> Pitch` の値が -1.0 のとき、音程の上下が逆転します。

Transpose [st.]

  半音単位でノートの音程をトランスポーズします。

  注意: `Note -> Pitch` が 0.0 のときは無効です。

Pitch Bend Range [st.]

  ピッチベンドの範囲です。単位は半音です。

Slide Time [s]

  2 つ以上のノートが同時に演奏されたときにピッチをスライドする大まかな時間です。

### Velocity Map

以下は略語と対応するセクションの一覧です。

- `Imp.` -> Impulse Noise
- `HC` -> Half Closed Noise
- `Cl.` -> Closing Noise
- `AP` -> Allpass Loop

> Imp. Gain [dB]

  ノートオン・ベロシティによって `Impact Noise` セクションの `Gain` を変える量です。

  MIDI キーボードなどで演奏するときは -30 dB あたりまで範囲を狭めたほうが弾きやすいかもしれません。

> Imp. Highpass

  ノートオン・ベロシティによって `Impact Noise` セクションの `Highpass` を変える量です。

  - 値が 0 より大きいと、ベロシティが大きくなるにつれてカットオフ周波数が高くなります。
  - 値が 0 より小さいと、ベロシティが大きくなるにつれてカットオフ周波数が低くなります。
> HC Density

  ノートオン・ベロシティによって `Half Closed Noise` セクションの `Density` を変える量です。

  `> Half Closed Highpass` と `> Modulation` との組み合わせによって、ベロシティが大きいときにクラッシュシンバルのような音となるように変化させることを狙っています。ただし、本物のクラッシュシンバルのような音は出ません。

  `Half Closed Noise` セクションの `Decay` が短いときは、あまり効果がありません。

> HC Highpass

  ノートオン・ベロシティによって `Half Closed Noise` セクションの `Highpass` を変える量です。

Note-off Velocity

  ハイハットのクローズに使うベロシティの種類です。

  チェックを入れるとノートオフ・ベロシティ、チェックを外すとノートオン・ベロシティが使われます。以下は `Note-off Velocity` によって影響を受けるパラメータの一覧です。

  - `> Cl. Gain`
  - `> Cl. Duration`
  - `> Cl. Highpass`
> Cl. Gain [dB]

  `Note-off Velocity` で指定されたベロシティによって `Closing Noise` セクションの `Gain` を変える量です。

> Cl. Release

  `Note-off Velocity` で指定されたベロシティによって `Closing Noise` セクションの `Release Ratio` を変える量です。

> Cl. Highpass

  ノートオン・ベロシティによって `Closing Noise` セクションの `Highpass` を変える量です。

> AP Modulation

  ノートオン・ベロシティによって `Allpass Loop` セクションの `Modulation` を変える量です。

### Impact Noise

スティックとシンバルの衝突を模倣するノイズです。

Seed

  `Seed` を変えると全体の質感が大きく変わります。

Texture Mix

  ノートオンごとにシードがリセットされる乱数と、そうでない乱数を混ぜる割合です。

  値が 1.0 のときにシードがリセットされる乱数のみとなり、音の揺らぎが抑えられます。 `Fixed Noise` と似たような効果がありますが、 `Half Closed Noise` と `Closing Noise` に影響を与えない点が異なります。

Gain [dB]

  ノイズ信号のゲインです。

Decay [s]

  ノイズ信号の減衰時間です。

Highpass [Hz]

  ノイズ信号が通るハイパスフィルタのカットオフ周波数です。

### Half Closed Noise

ハイハットのハーフクローズを模倣するノイズです。

Gain [dB]

  ノートオン直後のノイズ信号のゲインです。

  ノイズ信号は時間とともに `Sustain` で指定したゲインに向かって減衰します。

Decay [s]

  ノイズ信号の減衰時間です。

Sustain [dB]

  `Decay` で指定した時間が経過したあとのノイズ信号のゲインです。

Pulse Duration [s]

  1 回の衝突あたりのノイズの減衰時間です。

  `Pulse Duration` と `Density` の値がともに小さいとき、カラカラとした質感がでます。

Density [Hz]

  大まかな衝突頻度です。

  `Density` の値が大きいとき、衝突間隔が長くなったようなカラカラという質感に近づきます。値が小さいときはサーッという質感に近づきます。

Highpass [Hz]

  ノイズ信号が通るハイパスフィルタのカットオフ周波数です。

### Closing Noise

ハイハットのクローズを模倣するノイズです。クローズは `Mix & Options` セクションの `Release` が無効のときだけ行われます。

Gain [dB]

  ノイズ信号のゲインです。

Attack [s]

  ノイズ信号がおおよそ最大振幅に到達するまでの時間です。

  `Attack` の値を大きくするとリリース時間が長くなり、最大振幅が小さくなります。

Release Ratio

  ノイズ信号の大まかなリリース時間です。

  注意: `Attack` が小さいときに `Release Ratio` を上げると振幅がとても大きくなることがあります。

Highpass [Hz]

  ノイズ信号が通るハイパスフィルタのカットオフ周波数です。

### Allpass Loop

金属的な質感はこのセクションで調整できます。オールパスループは板というよりは輪になったワイヤに近いので、どちらかと言えばシンバルよりもトライアングルに似た音になりがちです。

Character

  内部的なディレイ時間を変えて質感を調整するパラメータです。

  値が 0 のときは音程がはっきりした音、 1 のときは音程がはっきりしない音になります。

  値が 0 のときのディレイ時間の比率は固定されています。値が 1 のときのディレイ時間の比率は `Impact Noise` セクションの `Seed` に応じてランダムに決められます。

Pitch Ratio [st.]

  2 つのオールパスループのディレイ時間をずらす量です。

  ディレイ時間がずらされるのは 2 つ目のオールパスループのみです。

Modulation [sample]

  フィードバック信号によるディレイ時間の変調量です。

  警告: `Modulation` の値が 0 でなければ発散によって大きな音が出ることがあります。

Delay Count 1

  1 つ目のオールパスループのディレイの数です。

Delay Count 2

  2 つ目のオールパスループのディレイの数です。

Feed 1

  1 つ目のオールパスループのオールパスフィルタの係数です。

  エフェクタのディレイのフィードバックと似たように扱えます。値が 1 あるいは -1 に近づくほど音が長く伸びるようになります。ちょうど 1 あるいはちょうど -1 にしてしまうと音が減衰しなくなります。

Feed 2

  2 つ目のオールパスループのオールパスフィルタの係数です。

Mix Spike

  大まかにノイズ信号を混ぜる比率です。

  値が 0 のときにノイズ信号はほぼ消えます。 1 のときはオールパスループの出力とノイズ信号が足し合わさったような音になります。

Mix Alt. Sign

  オールパスループの出力の質感を調整します。

  値が 0 のとき、ループ内のすべてのオールパスの出力を単純に加算します。

      loopOutput = ap1 + ap2 + ap3 + ap4 + ap5 + ...

  値が 1 のとき、ループ内のオールパスごとに符号を反転した上で加算を行います。

      loopOutput = ap1 - ap2 + ap3 - ap4 + ap5 - ...

### Filter

オールパスループ内のフィルタに関する設定です。

High Shelf Cutoff [Hz]

  ハイシェルフフィルタのカットオフ周波数です。

  シンバルの音を出すときは `High Shelf Cutoff` を 10000 Hz あたり、 `High Shelf Gain` を -1 から 0 dB の間にしてください。

High Shelf Gain [dB]

  ハイシェルフフィルタのゲインです。

Low Shelf Cutoff [Hz]

  ローシェルフフィルタのカットオフ周波数です。

Low Shelf Gain [dB]

  ローシェルフフィルタのゲインです。

  注意: 0 dB にすると直流が乗ることがあります。

## チェンジログ

- 0.1.1
  - `allpass loop gain` パラメータを追加。
  - GUI のサイズを変更するオプションを追加。
  - VSTGUI4 の Linux パッチを更新。
- 0.1.0
  - 初期リリース。

## 旧バージョン

- DoubleLoopCymbal 0.1.0 - VST 3 (github.com)

## ライセンス

DoubleLoopCymbal のライセンスは GPLv3 です。 GPLv3 の詳細と、利用したライブラリのライセンスは次のリンクにまとめています。

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

リンクが切れているときは `ryukau@gmail.com` にメールを送ってください。

### VST® について

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