diff --git a/docs/manual/SpectralPhaser/SpectralPhaser.json b/docs/manual/SpectralPhaser/SpectralPhaser.json
new file mode 100644
index 00000000..2dbfe3e4
--- /dev/null
+++ b/docs/manual/SpectralPhaser/SpectralPhaser.json
@@ -0,0 +1,14 @@
+{
+ "SpectralPhaser": {
+ "latest_version": "0.1.0",
+ "urls": {
+ "plugin_url": [
+ "https://github.com/ryukau/VSTPlugins/releases/download/UhhyouPlugins0.64.0/SpectralPhaser_0.1.0.zip"
+ ],
+ "preset_url": []
+ },
+ "changelog": {
+ "0.1.0": { "en": ["Initial release."], "ja": ["初期リリース。"] }
+ }
+ }
+}
diff --git a/docs/manual/SpectralPhaser/SpectralPhaser_en.html b/docs/manual/SpectralPhaser/SpectralPhaser_en.html
new file mode 100644
index 00000000..6484ba53
--- /dev/null
+++ b/docs/manual/SpectralPhaser/SpectralPhaser_en.html
@@ -0,0 +1,888 @@
+
+
+
+
+
+
+
+
+ SpectralPhaser_en – Uhhyou Plugins
+
+
+
+
+
+
+
+ Back to Index
+
+ Update: 2024-10-23
+
+
+ Table of Contents
+
+
+
+
+
+
+
+ SpectralPhaser is an effect that produces a phaser-like sound by
+ applying a mask in the frequency domain. In addition to FFT, fast
+ Walsh-Hadamard transform (FWHT) and Haar transform are available.
+
+ Note : Presets produce the expected sound only if
+ the sampling rate is 48000 Hz.
+ full
package contains following builds.
+
+ Windows (x86_64)
+ Linux (x86_64)
+ macOS (Universal 2)
+
+ Linux build is built on Ubuntu 24.04. If you are using distribution
+ other than Ubuntu 24.04, plugin will not likely to run. In this case,
+ please take a look at build
+ instruction .
+ macOS
package is recommended for macOS user. I can’t
+ purchase Apple Developer Program, therefore installation requires a
+ workaround to bypass Gatekeeper. Details of workaround are written in
+ Installation -> macOS Specific
+ section.
+
+ Feel free to contact me on GitHub
+ repository or ryukau@gmail.com.
+ You can fund the development through paypal.me/ryukau .
+
+
+ Move *.vst3
directory to:
+
+ /Program Files/Common Files/VST3/
for Windows.
+ $HOME/.vst3/
for Linux.
+ /Users/$USERNAME/Library/Audio/Plug-ins/VST3/
for
+ macOS.
+
+ DAW may provides additional VST3 directory. For more information,
+ please refer to the manual of the DAW.
+
+ Notice : Some plugins don’t have presets provided
+ by Uhhyou Plugins.
+ Presets are included in the plugin package linked at the top of
+ this page. To install presets, follow the steps below.
+
+ Download plugin from a link at the top of this page.
+ Extract downloaded zip file.
+ Open presets
directory placed in extracted
+ package.
+ Move Uhhyou
directory into an OS specific preset
+ directory (see below).
+
+ Below is a list of preset directories for each OS.
+
+ Windows :
+ /Users/$USERNAME/Documents/VST3 Presets
+ Linux : $HOME/.vst3/presets
+ macOS : /Users/$USERNAME/Library/Audio/Presets
+
+ Preset directory name must be the same as the plugin. If preset
+ directory does not exist, create it.
+
+
+ If DAW doesn’t recognize the plugin, try installing C++
+ redistributable (vc_redist.x64.exe
). Installer can be
+ found in the link below.
+
+
+ On Ubuntu 24.04, those packages are required.
+ sudo apt install libxcb-cursor0 libxkbcommon-x11-0
+ If DAW doesn’t recognize the plugin, take a look at
+ Package Requirements
section of the link below and make
+ sure all the VST3 related package is installed.
+
+ REAPER on Linux may not recognize the plugin. A workaround is to
+ delete a file ~/.config/REAPER/reaper-vstplugins64.ini
+ and restart REAPER.
+
+ Important : full
package is not
+ confirmed working. When using full
, try removing
+ following files.
+
+ Contents/Resources/Documentation
+ Contents/x86_64-linux
+ Contents/x86_64-win
+
+ macOS
package doesn’t contain above files. Also, all
+ packages are in “ad-hoc signing” state set by codesign
+ command.
+
+ When trying to run plugin first time, following message may appear
+ on macOS.
+ <PluginName>.vst3 is damaged and can't be opened. You should move it to the Trash.
+ In this case, open terminal and try running one or both of
+ following command to unzipped .vst3
directory. Replace
+ /path/to/PluginName.vst3
according to your install
+ location.
+ xattr -rd com.apple.quarantine /path/to/PluginName.vst3
+xattr -rc /path/to/PluginName.vst3
+
+ Plugin may be considered as unsigned/un-notarized application. In
+ this case, open System Preferences, go to Security & Privacy →
+ General, then click the Open Anyway button. The offcial Apple help
+ page linked below has screenshots for the procedure. See “If you want
+ to open an app that hasn’t been notarized or is from an unidentified
+ developer” section.
+
+ If the plugin is still not working, try changing install location
+ to /Library/Audio/Plug-ins/VST3/
or
+ /Users/$USERNAME/Library/Audio/Plug-ins/VST3/
whichever
+ still haven’t tried.
+ If all the above methods do not work, try following the steps
+ below.
+
+ Open terminal and run
+ sudo spctl --master-disable
.
+ Go to System Preferences → Security and Privacy → General → Allow
+ apps downloaded from, then select “Anywhere”.
+
+ Beware that steps above degrades security of your system. To revert
+ the settings, follow the steps below.
+
+ Go to System Preferences → Security and Privacy → General → Allow
+ apps downloaded from, then select option to “App Store and identified
+ developers”.
+ Open terminal and run
+ sudo spctl --master-enable
.
+
+
+ Note This section may not relevant to
+ macOS
packages. However it’s not verified. (GitHub
+ issue )
+ To use full
package, following command might be
+ used.
+ sudo codesign --force --deep -s - /path/to/PluginName.vst3
+ codesign
might not be available without installing Xcode .
+
+
+
+ At first time, create color config file to:
+
+ /Users/USERNAME/AppData/Roaming/UhhyouPlugins/style/style.json
+ on Windows.
+ $XDG_CONFIG_HOME/UhhyouPlugins/style/style.json
on
+ Linux.
+
+ If $XDG_CONFIG_HOME
is empty, make
+ $HOME/.config/UhhyouPlugins/style/style.json
.
+
+ /Users/$USERNAME/Library/Preferences/UhhyouPlugins/style/style.json
+ on macOS.
+
+ style.json
will be loaded for each time a plugin
+ window opens.
+ Several color themes are available on the link below. To use, copy
+ the text to style.json
.
+
+ Below is an example of style.json
.
+ {
+ "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"
+}
+
+ Following is a list of font options.
+
+ fontFamily
: Font family name.
+ fontBold
: Enable bold style when
+ true
, disable when false
.
+ fontItalic
: Enable italic style when
+ true
, disable when false
.
+
+ System font can be used as fontFamily
. To use
+ different fonts for different plugins, place *.ttf
file
+ into custom font path:
+ *.vst3/Contents/Resources/Fonts
.
+ Notice : If the combination of
+ fontFamily
, fontBold
,
+ fontItalic
does not exist in custom font path, default
+ font of VSTGUI is used.
+ If fontFamily
is set to empty string ""
,
+ then "Tinos"
+ is used as fallback. If the length is greater than 1 and the font
+ family name doesn’t exist, default font of VSTGUI is used.
+ Styles other than bold, italic or bold-italic are not supported by
+ VSTGUI. For example, “Thin”, “Light”, “Medium”, and “Black” weights
+ cannot be used.
+
+ Hex color codes are used.
+
+ 6 digit color is RGB.
+ 8 digit color is RGBA.
+
+ First letter #
is conventional. Plugins ignore the
+ first letter of color code, thus ?102938
,
+ \n11335577
are valid.
+ Do not use characters outside of 0-9a-f
for color
+ value.
+ Following is a list of color options. If an option is missing,
+ default color will be used.
+
+ foreground
: Text color.
+ foregroundButtonOn
: Text color of active toggle
+ button. Recommend to use the same value of foreground
or
+ boxBackground
.
+ foregroundInactive
: Text color of inactive
+ components. Currently, only used for TabView.
+ background
: Background color.
+ boxBackground
: Background color of inside of box
+ shaped components (Barbox, Button, Checkbox, OptionMenu, TextKnob,
+ VSlider).
+ border
: Border color of box shaped components.
+ borderCheckbox
: Border color of CheckBox.
+ borderLabel
: Line color of parameter section
+ label.
+ unfocused
: Color to fill unfocused components.
+ Currently, only used for knobs.
+ highlightMain
: Color to indicate focus is on a
+ component. Highlight colors are also used for value of slider
+ components (BarBox and VSlider).
+ highlightAccent
: Same as highlightMain
.
+ Used for cosmetics.
+ highlightButton
: Color to indicate focus is on a
+ button.
+ highlightWarning
: Same as highlightMain
,
+ but only used for parameters which requires extra caution.
+ overlay
: Overlay color. Used to overlay texts and
+ indicators.
+ overlayHighlight
: Overlay color to highlight current
+ focus.
+
+
+ Right Click on the controls pops up a context menu
+ provided by DAW.
+ Knob and slider provides following controls:
+
+ Ctrl + Left Click : Reset value.
+ Shift + Left Drag : Fine adjustment.
+ Middle Click : Rotate through minimum, default and
+ maximum value.
+ Shift + Middle Click : Take floor of current
+ value.
+
+ Note : For decibel (dB
) parameters,
+ floor is applied after the value is converted to amplitude.
+
+
+
+ If the image is small, use Ctrl + Mouse Wheel
+ or “View Image” on right click menu to scale.
+ Diagram only shows overview. It’s not exact implementation.
+
+
+ Characters inside of square brackets [] represents unit. Following
+ is a list of units used in SpectralPhaser.
+
+
+
+ Output [dB]
+
+ Output gain.
+
+ Dry/Wet
+
+ Mixing ratio of input and effect output.
+ 0 is input only, 1 is effect output only.
+
+ Side Chain
+
+ When enabled, the sidechain input is used for frequency
+ masking.
+ SpectralPhaser could be used as a vocoder when both
+ Side Chain
and Latency
are enabled. In this
+ case, set Frame Size
to around 2048. If
+ Frame Size
is small, the effect will be weaker.
+ The vocoder mode is not suitable for real-time use because latency
+ is high.
+
+ Latency
+
+ When enabled, Frame Size
will be used as latency in
+ samples.
+
+
+
+
+ Waveform
+
+ LFO waveform.
+
+ Wave Mod.
+
+ LFO waveform modifier.
+
+ Phase
+
+ Initial phase of LFO.
+
+ Stereo
+
+ Phase offset of LFOs between left and right channels.
+
+ Rate
+
+ LFO frequency multiplier.
+ This can be useful to slightly shift the tempo sync timing.
+
+ Sync.
+
+ Interval of LFO tempo synchronization.
+ 2 numbers corresponds to the numerals in time signatur.
+ (left/right
= upper/lower
).
+
+ Left number correspond to upper numeral of time signature.
+ Right number correspond to lower numeral of time signature
+
+ The plugin receives musical time as beats, where a beat has a
+ relative length depending on the time signature. Here are some
+ examples:
+
+ 1 / 1 synchronizes to 1 bar.
+ 1 / 4 synchronizes to 1 beat (a quarter note), when time signature
+ is N / 4.
+ 1 / 6 synchronizes to 1 beat, when time signature is N / 6.
+ 3 / 16 synchronizes to 3 / 4 beat (a dotted 8th note), when time
+ signature is N / 4.
+
+ When time signature is changed, there may be a momentary loss of
+ sync immediately after the change.
+
+
+
+
+ Transform
+
+ Type of time to frequency transformation.
+ FFT is the normal choice, FWHT and Haar will sound rough.
+ Attention : Changing Transform
stops
+ the sound for duration of Frame Size
. This is because the
+ buffer is reset to avoid loud bursts.
+
+ Frame Size
+
+ Length of a frame over which a transform is performed.
+ Frame Size
also represents delay time in samples.
+ When Latency
is enabled, Frame Size
will
+ be used as latency in samples.
+ When Frame Size
is large and DAW buffer size is small,
+ the sound may stutter. In this case, reduce Frame Size
to
+ reduce CPU load.
+
+ Feedback
+
+ Feedback gain of delay.
+
+
+
+ LFO modulation can be changed by the small knobs on right side of
+ parameter value.
+
+ Waveform
+
+ Waveform of frequency mask.
+
+ Mix
+
+ Mixing ratio of frequency mask.
+ 0 means no masking, 1 means full masking.
+
+ Phase
+
+ Phase of the frequency mask waveform.
+ Modulating Phase
with an LFO produces a sound similar
+ to a phaser.
+
+ Freq.
+
+ Frequency of frequency mask waveform.
+ Higher the Freq.
, more notches.
+ Setting Freq.
to 0 disables frequency masking.
+
+ Threshold
+
+ When a value in a frequency mask is less than
+ Threshold
, the corresponding frequency is set to
+ zero.
+
+ Rotation
+
+ Amount of phase rotation in the frequency domain.
+ This only applies when Transform
is FFT; when other
+ orthogonal transforms are selected, Rotation
is used as
+ an amount to swap frequency components.
+
+ Spectral Shift
+
+ Frequency shift amount for each feedback.
+
+ Octave Down
+
+ Amount of octave down effect. Octave down is applied for each
+ feedback.
+ Depending on the settings, the effect may not be noticeable. To get
+ the effect, try setting Feedback
to 1 and
+ Octave Down
to around 0.1.
+
+
+
+
+
+ N/A.
+
+ SpectralPhaser is licensed under GPLv3. Complete licenses are
+ linked below.
+
+ If the link above doesn’t work, please send email to
+ ryukau@gmail.com
.
+
+ VST is a trademark of Steinberg Media Technologies GmbH, registered
+ in Europe and other countries.
+
+
+
+
+
diff --git a/docs/manual/SpectralPhaser/SpectralPhaser_en.md b/docs/manual/SpectralPhaser/SpectralPhaser_en.md
new file mode 100644
index 00000000..47969a44
--- /dev/null
+++ b/docs/manual/SpectralPhaser/SpectralPhaser_en.md
@@ -0,0 +1,203 @@
+---
+lang: en
+...
+
+# SpectralPhaser
+![](img/SpectralPhaser.png)
+
+SpectralPhaser is an effect that produces a phaser-like sound by applying a mask in the frequency domain. In addition to FFT, fast Walsh-Hadamard transform (FWHT) and Haar transform are available.
+
+{% for target, download_url in latest_download_url["SpectralPhaser"].items() %}
+- [Download SpectralPhaser {{ latest_version["SpectralPhaser"] }} `{{ target }}` - VST 3 (github.com)]({{ download_url }})
+{%- endfor %}
+{%- if preset_download_url["SpectralPhaser"]|length != 0%}
+- [Download Presets (github.com)]({{ preset_download_url["SpectralPhaser"] }})
+{%- endif %}
+
+**Note**: Presets produce the expected sound only if the sampling rate is 48000 Hz.
+
+{{ section["package"] }}
+
+{{ section["contact_installation_guiconfig"] }}
+
+## Controls
+{{ section["gui_common"] }}
+
+{{ section["gui_knob"] }}
+
+## Block Diagram
+If the image is small, use Ctrl + Mouse Wheel or "View Image" on right click menu to scale.
+
+Diagram only shows overview. It's not exact implementation.
+
+![](img/SpectralPhaser.svg)
+
+## Parameters
+Characters inside of square brackets \[\] represents unit. Following is a list of units used in SpectralPhaser.
+
+- \[dB\] : Decibel.
+
+### Mix
+Output \[dB\]
+
+: Output gain.
+
+Dry/Wet
+
+: Mixing ratio of input and effect output.
+
+ 0 is input only, 1 is effect output only.
+
+Side Chain
+
+: When enabled, the sidechain input is used for frequency masking.
+
+ SpectralPhaser could be used as a vocoder when both `Side Chain` and `Latency` are enabled. In this case, set `Frame Size` to around 2048. If `Frame Size` is small, the effect will be weaker.
+
+ The vocoder mode is not suitable for real-time use because latency is high.
+
+Latency
+
+: When enabled, `Frame Size` will be used as latency in samples.
+
+### LFO
+Waveform
+
+: LFO waveform.
+
+Wave Mod.
+
+: LFO waveform modifier.
+
+Phase
+
+: Initial phase of LFO.
+
+Stereo
+
+: Phase offset of LFOs between left and right channels.
+
+Rate
+
+: LFO frequency multiplier.
+
+ This can be useful to slightly shift the tempo sync timing.
+
+Sync.
+
+: Interval of LFO tempo synchronization.
+
+ 2 numbers corresponds to the numerals in time signatur. (`left/right` = `upper/lower`).
+
+ - Left number correspond to upper numeral of time signature.
+ - Right number correspond to lower numeral of time signature
+
+ The plugin receives musical time as beats, where a beat has a relative length depending on the time signature. Here are some examples:
+
+ - 1 / 1 synchronizes to 1 bar.
+ - 1 / 4 synchronizes to 1 beat (a quarter note), when time signature is N / 4.
+ - 1 / 6 synchronizes to 1 beat, when time signature is N / 6.
+ - 3 / 16 synchronizes to 3 / 4 beat (a dotted 8th note), when time signature is N / 4.
+
+ When time signature is changed, there may be a momentary loss of sync immediately after the change.
+
+### Delay
+Transform
+
+: Type of time to frequency transformation.
+
+ FFT is the normal choice, FWHT and Haar will sound rough.
+
+ **Attention**: Changing `Transform` stops the sound for duration of `Frame Size`. This is because the buffer is reset to avoid loud bursts.
+
+Frame Size
+
+: Length of a frame over which a transform is performed.
+
+ `Frame Size` also represents delay time in samples.
+
+ When `Latency` is enabled, `Frame Size` will be used as latency in samples.
+
+ When `Frame Size` is large and DAW buffer size is small, the sound may stutter. In this case, reduce `Frame Size` to reduce CPU load.
+
+Feedback
+
+: Feedback gain of delay.
+
+### Mask
+LFO modulation can be changed by the small knobs on right side of parameter value.
+
+Waveform
+
+: Waveform of frequency mask.
+
+Mix
+
+: Mixing ratio of frequency mask.
+
+ 0 means no masking, 1 means full masking.
+
+Phase
+
+: Phase of the frequency mask waveform.
+
+ Modulating `Phase` with an LFO produces a sound similar to a phaser.
+
+Freq.
+
+: Frequency of frequency mask waveform.
+
+ Higher the `Freq.`, more notches.
+
+ Setting `Freq.` to 0 disables frequency masking.
+
+Threshold
+
+: When a value in a frequency mask is less than `Threshold`, the corresponding frequency is set to zero.
+
+Rotation
+
+: Amount of phase rotation in the frequency domain.
+
+ This only applies when `Transform` is FFT; when other orthogonal transforms are selected, `Rotation` is used as an amount to swap frequency components.
+
+Spectral Shift
+
+: Frequency shift amount for each feedback.
+
+Octave Down
+
+: Amount of octave down effect. Octave down is applied for each feedback.
+
+ Depending on the settings, the effect may not be noticeable. To get the effect, try setting `Feedback` to 1 and `Octave Down` to around 0.1.
+
+## Change Log
+{%- for version, logs in changelog["SpectralPhaser"].items() %}
+- {{version}}
+ {%- for log in logs["en"] %}
+ - {{ log }}
+ {%- endfor %}
+{%- endfor %}
+
+## Old Versions
+{%- if old_download_link["SpectralPhaser"]|length == 0 %}
+N/A.
+{%- else %}
+ {%- for x in old_download_link["SpectralPhaser"] %}
+- [SpectralPhaser {{ x["version"] }} - VST 3 (github.com)]({{ x["url"] }})
+ {%- endfor %}
+{%- endif %}
+
+## License
+SpectralPhaser is licensed under GPLv3. Complete licenses are linked below.
+
+- [https://github.com/ryukau/VSTPlugins/tree/master/License](https://github.com/ryukau/VSTPlugins/tree/master/License)
+
+If the link above doesn't work, please send email to `ryukau@gmail.com`.
+
+### About VST
+VST is a trademark of Steinberg Media Technologies GmbH, registered in Europe and other countries.
diff --git a/docs/manual/SpectralPhaser/SpectralPhaser_ja.html b/docs/manual/SpectralPhaser/SpectralPhaser_ja.html
new file mode 100644
index 00000000..6be40c4d
--- /dev/null
+++ b/docs/manual/SpectralPhaser/SpectralPhaser_ja.html
@@ -0,0 +1,883 @@
+
+
+
+
+
+
+
+
+ SpectralPhaser_ja – Uhhyou Plugins
+
+
+
+
+
+
+
+ Back to Index
+
+ Update: 2024-10-23
+
+
+ Table of Contents
+
+
+
+
+
+
+
+ SpectralPhaserスペクトラル フェイザ
+ は周波数領域でマスクをかけることでフェイザのような音が出るエフェクタです。
+ FFT に加えて、高速 Walsh-Hadamard 変換 (FWHT) 、 Haar
+ 変換といった直行変換が使えます。
+
+ 注意 : プリセットはサンプリング周波数が 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 のマニュアルを参照してください。
+
+ 注意 : プリセットの無いプラグインもあります。
+ プリセットはページの最上部のリンクからダウンロードできるプラグインパッケージに含まれています。以下はプリセットのインストール手順です。
+
+ ページの最上部のリンクからプラグインをダウンロード。
+ ダウンロードした zip ファイルを解凍。
+ presets
ディレクトリ内の Uhhyou
+ ディレクトリを OS ごとに決められたディレクトリに配置。
+
+ 以下は OS ごとのプリセットの配置先の一覧です。
+
+ Windows :
+ /Users/$USERNAME/Documents/VST3 Presets
+ Linux : $HOME/.vst3/presets
+ macOS : /Users/$USERNAME/Library/Audio/Presets
+
+ プリセットディレクトリの名前はプラグインと同じである必要があります。配置先のディレクトリが無いときは作成してください。
+
+
+ プラグインが DAW に認識されないときは C++ redistributable
+ をインストールしてみてください。インストーラは次のリンクからダウンロードできます。ファイル名は
+ vc_redist.x64.exe
です。
+
+
+ Ubuntu 24.04 では次のパッケージのインストールが必要です。
+ sudo apt install libxcb-cursor0 libxkbcommon-x11-0
+ もし DAW がプラグインを認識しないときは、下のリンクの
+ Package Requirements
を参考にして VST3
+ に必要なパッケージがすべてインストールされているか確認してください。
+
+ REAPER の Linux 版がプラグインを認識しないときは
+ ~/.config/REAPER/reaper-vstplugins64.ini
を削除して
+ REAPER を再起動してみてください。
+
+ 重要 : 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
+
+ プラグインは署名されていない (unsigned) 、または公証されていない
+ (un-notarized)
+ アプリケーションとして認識されることがあります。この場合は、警告メッセージが表示された後に、システム環境設定を開いて「セキュリティとプライバシー」
+ → 「一般」の「このまま開く」ボタンを押してください。以下にリンクした
+ Apple
+ 公式のヘルプページにスクリーンショット付きで同じ手順が掲載されています。「ノータリゼーションを受けていない
+ App や未確認の開発元の App を開きたい場合」を参照してください。
+
+ ここまでの手順を経てまだ動かないときはインストール先を
+ /Library/Audio/Plug-ins/VST3/
あるいは
+ /Users/$USERNAME/Library/Audio/Plug-ins/VST3/
+ のいずれか使っていなかったほうに変えてみてください。
+ 上記の方法がすべて上手くいかなかったときは以下の手順を試してみてください。
+
+ ターミナルを開いて sudo spctl --master-disable
+ を実行。
+ システム環境設定を開いて「セキュリティとプライバシー」 → 「一般」
+ →
+ 「ダウンロードしたアプリケーションの実行許可」と辿り、「全てのアプリケーションを許可」を選択。
+
+ 上記の手順を実行するとシステムのセキュリティが弱くなるので注意してください。元に戻すには以下の手順を実行してください。
+
+ システム環境設定を開いて「セキュリティとプライバシー」 → 「一般」
+ → 「ダウンロードしたアプリケーションの実行許可」と辿り、「App Store
+ と認証済みの開発元からのアプリケーションを許可」を選択。
+ ターミナルを開いて sudo spctl --master-enable
+ を実行。
+
+
+ 注意 この節の内容は macOS
+ パッケージには関連しないと考えられますが未検証です。 (GitHub の
+ issue )
+ full
+ パッケージを利用する場合は以下のコマンドを適用することで利用できるかもしれません。
+ sudo codesign --force --deep -s - /path/to/PluginName.vst3
+ codesign
の利用には Xcode
+ のインストールが必要となるかもしれません。
+
+
+
+ 初回設定時は手動で次のファイルを作成してください。
+
+ 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
にコピペして使ってください。
+
+ style.json
の設定例です。
+ {
+ "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"
+}
+
+ 以下はフォントオプションの一覧です。
+
+ 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) 。
+
+
+
+ Output [dB]
+
+ 出力ゲインです。
+
+ Dry/Wet
+
+ 入力と、エフェクトのかかった出力の比率です。
+ 0 のとき入力のみ、 1 のときエフェクト出力のみになります。
+
+ Side Chain
+
+ 有効にするとサイドチェイン入力を周波数マスクに使います。
+ Latency
+ と同時に有効にすることでボコーダーになります。このとき
+ Frame Size
は 2048 あたりに設定してください。
+ Frame Size
が小さいと効果が薄くなります。
+ ボコーダーとしての使用は大きなレイテンシが出るため、リアルタイム向けではありません。
+
+ Latency
+
+ 有効にすると Frame Size
+ で設定したサンプル数をレイテンシとして DAW に伝えます。
+
+
+
+
+ Waveform
+
+ LFO の波形です。
+
+ Wave Mod.
+
+ LFO の波形を変えるパラメータです。
+
+ Phase
+
+ LFO の初期位相です。
+
+ Stereo
+
+ LFO の位相を左右でずらす量です。
+
+ Rate
+
+ LFO の周波数の倍率です。
+ テンポシンクを少しずらしたいときなどに使えます。
+
+ Sync.
+
+ LFO の周波数の同期間隔です。
+ 左右の数は、それぞれ拍子記号の上下の数字と対応しています。
+ (左 / 右
= 上 / 下
)
+ プラグインは音楽的な経過時間を拍数として受け取ります。そして 1
+ 拍は拍子記号によって長さが相対的に変わります。以下に例をいくつか挙げます。
+
+ 1 / 1 のとき 1 小節に同期。
+ 拍子が N / 4 であれば Sync.
が 1 / 4 のとき 1 拍 (4
+ 分音符) に同期。
+ 拍子が N / 6 であれば Sync.
が 1 / 6 のとき 1
+ 拍に同期。
+ 拍子が N / 4 であれば Sync.
が 3 / 16 のとき 3 / 4 拍
+ (付点 8 分音符) に同期。
+
+ 曲中で拍子記号が変わると、変わった直後に一時的に同期がずれることがあります。
+
+
+
+
+ Transform
+
+ 直行変換の種類です。
+ 通常は FFT を選んでください。 FWHT と Haar
+ はざらざらとした音になります。
+ 注意 : Transform
を変更すると
+ Frame Size
+ の長さだけ音が止まります。爆発的に大きい音を避けるためにバッファがリセットされることが原因です。
+
+ Frame Size
+
+ 直行変換を行うフレームの長さで、単位はサンプル数です。
+ この値がそのままディレイ時間になります。
+ Latency
を有効にしたときは Frame Size
+ と同じサンプル数のレイテンシを DAW に伝えます。
+ Frame Size
が大きく、 DAW
+ のバッファサイズが小さいとき、音がぶつぶつと途切れるようになることがあるかもしれません。このときは計算が間に合っていないので
+ Frame Size
を小さくしてください。
+
+ Feedback
+
+ ディレイのフィードバックです。
+
+
+
+ パラメータの右側の小さいつまみで LFO
+ による変調量を変えられます。
+
+ Waveform
+
+ 周波数マスクの波形です。
+
+ Mix
+
+ 周波数マスクをかける割合です。
+ 0 のときマスクなし、 1 のとき完全にマスクします。
+
+ Phase
+
+ 周波数マスクの波形の位相です。
+ Phase
を LFO
+ で変調するとフェイザと似たような音が出ます。
+
+ Freq.
+
+ 周波数マスクの波形の周波数です。
+ Freq.
が高くなるほど、ノッチの数が多くなります。
+ Freq.
を 0 にすると周波数マスクが無効になります。
+
+ Threshold
+
+ 周波数マスクの値が Threshold
+ よりも小さいとき、その周波数を 0 にします。
+
+ Rotation
+
+ 周波数領域で位相を回転する量です。
+ というのは Transform
が FFT
+ のときだけで、他の直行変換が選択されているときは Rotation
+ に応じて周波数成分の入れ替えが行われます。
+
+ Spectral Shift
+
+ フィードバックごとに周波数成分をシフトする量です。
+
+ Octave Down
+
+ フィードバックごとに周波数成分を約 1
+ オクターブ下に移す割合です。
+ 設定によっては効果があまり出ません。 Feedback
を 1 、
+ Octave Down
を 0.1 あたりに設定すると効果が出ます。
+
+
+
+
+
+ 旧バージョンはありません。
+
+ SpectralPhaser のライセンスは GPLv3 です。 GPLv3
+ の詳細と、利用したライブラリのライセンスは次のリンクにまとめています。
+
+ リンクが切れているときは ryukau@gmail.com
+ にメールを送ってください。
+
+ VST is a trademark of Steinberg Media Technologies GmbH, registered
+ in Europe and other countries.
+
+
+
+
+
diff --git a/docs/manual/SpectralPhaser/SpectralPhaser_ja.md b/docs/manual/SpectralPhaser/SpectralPhaser_ja.md
new file mode 100644
index 00000000..320095a0
--- /dev/null
+++ b/docs/manual/SpectralPhaser/SpectralPhaser_ja.md
@@ -0,0 +1,200 @@
+---
+lang: ja
+...
+
+# SpectralPhaser
+![](img/SpectralPhaser.png)
+
+SpectralPhaserスペクトラル フェイザ は周波数領域でマスクをかけることでフェイザのような音が出るエフェクタです。 FFT に加えて、高速 Walsh-Hadamard 変換 (FWHT) 、 Haar 変換といった直行変換が使えます。
+
+{% for target, download_url in latest_download_url["SpectralPhaser"].items() %}
+- [SpectralPhaser {{ latest_version["SpectralPhaser"] }} `{{ target }}` - VST 3 をダウンロード (github.com)]({{ download_url }})
+{%- endfor %}
+{%- if preset_download_url["SpectralPhaser"]|length != 0%}
+- [プリセットをダウンロード (github.com)]({{ preset_download_url["SpectralPhaser"] }})
+{%- endif %}
+
+**注意**: プリセットはサンプリング周波数が 48000 Hz でなければ想定された音が出ません。
+
+{{ section["package"] }}
+
+{{ section["contact_installation_guiconfig"] }}
+
+## 操作
+{{ section["gui_common"] }}
+
+{{ section["gui_knob"] }}
+
+## ブロック線図
+図が小さいときはブラウザのショートカット Ctrl + マウスホイール や、右クリックから「画像だけを表示」などで拡大できます。
+
+図で示されているのは大まかな信号の流れです。実装と厳密に対応しているわけではないので注意してください。
+
+![](img/SpectralPhaser.svg)
+
+## パラメータ
+角かっこ \[\] で囲まれているのは単位です。以下は単位の一覧です。
+
+- \[dB\] : デシベル (decibel) 。
+
+### Mix
+Output \[dB\]
+
+: 出力ゲインです。
+
+Dry/Wet
+
+: 入力と、エフェクトのかかった出力の比率です。
+
+ 0 のとき入力のみ、 1 のときエフェクト出力のみになります。
+
+Side Chain
+
+: 有効にするとサイドチェイン入力を周波数マスクに使います。
+
+ `Latency` と同時に有効にすることでボコーダーになります。このとき `Frame Size` は 2048 あたりに設定してください。 `Frame Size` が小さいと効果が薄くなります。
+
+ ボコーダーとしての使用は大きなレイテンシが出るため、リアルタイム向けではありません。
+
+Latency
+
+: 有効にすると `Frame Size` で設定したサンプル数をレイテンシとして DAW に伝えます。
+
+### LFO
+Waveform
+
+: LFO の波形です。
+
+Wave Mod.
+
+: LFO の波形を変えるパラメータです。
+
+Phase
+
+: LFO の初期位相です。
+
+Stereo
+
+: LFO の位相を左右でずらす量です。
+
+Rate
+
+: LFO の周波数の倍率です。
+
+ テンポシンクを少しずらしたいときなどに使えます。
+
+Sync.
+
+: LFO の周波数の同期間隔です。
+
+ 左右の数は、それぞれ拍子記号の上下の数字と対応しています。 (`左 / 右` = `上 / 下`)
+
+ プラグインは音楽的な経過時間を拍数として受け取ります。そして 1 拍は拍子記号によって長さが相対的に変わります。以下に例をいくつか挙げます。
+
+ - 1 / 1 のとき 1 小節に同期。
+ - 拍子が N / 4 であれば `Sync.` が 1 / 4 のとき 1 拍 (4 分音符) に同期。
+ - 拍子が N / 6 であれば `Sync.` が 1 / 6 のとき 1 拍に同期。
+ - 拍子が N / 4 であれば `Sync.` が 3 / 16 のとき 3 / 4 拍 (付点 8 分音符) に同期。
+
+ 曲中で拍子記号が変わると、変わった直後に一時的に同期がずれることがあります。
+
+### Delay
+Transform
+
+: 直行変換の種類です。
+
+ 通常は FFT を選んでください。 FWHT と Haar はざらざらとした音になります。
+
+ **注意**: `Transform` を変更すると `Frame Size` の長さだけ音が止まります。爆発的に大きい音を避けるためにバッファがリセットされることが原因です。
+
+Frame Size
+
+: 直行変換を行うフレームの長さで、単位はサンプル数です。
+
+ この値がそのままディレイ時間になります。
+
+ `Latency` を有効にしたときは `Frame Size` と同じサンプル数のレイテンシを DAW に伝えます。
+
+ `Frame Size` が大きく、 DAW のバッファサイズが小さいとき、音がぶつぶつと途切れるようになることがあるかもしれません。このときは計算が間に合っていないので `Frame Size` を小さくしてください。
+
+Feedback
+
+: ディレイのフィードバックです。
+
+### Mask
+パラメータの右側の小さいつまみで LFO による変調量を変えられます。
+
+Waveform
+
+: 周波数マスクの波形です。
+
+Mix
+
+: 周波数マスクをかける割合です。
+
+ 0 のときマスクなし、 1 のとき完全にマスクします。
+
+Phase
+
+: 周波数マスクの波形の位相です。
+
+ `Phase` を LFO で変調するとフェイザと似たような音が出ます。
+
+Freq.
+
+: 周波数マスクの波形の周波数です。
+
+ `Freq.` が高くなるほど、ノッチの数が多くなります。
+
+ `Freq.` を 0 にすると周波数マスクが無効になります。
+
+Threshold
+
+: 周波数マスクの値が `Threshold` よりも小さいとき、その周波数を 0 にします。
+
+Rotation
+
+: 周波数領域で位相を回転する量です。
+
+ というのは `Transform` が FFT のときだけで、他の直行変換が選択されているときは `Rotation` に応じて周波数成分の入れ替えが行われます。
+
+Spectral Shift
+
+: フィードバックごとに周波数成分をシフトする量です。
+
+Octave Down
+
+: フィードバックごとに周波数成分を約 1 オクターブ下に移す割合です。
+
+ 設定によっては効果があまり出ません。 `Feedback` を 1 、 `Octave Down` を 0.1 あたりに設定すると効果が出ます。
+
+## チェンジログ
+{%- for version, logs in changelog["SpectralPhaser"].items() %}
+- {{version}}
+ {%- for log in logs["ja"] %}
+ - {{ log }}
+ {%- endfor %}
+{%- endfor %}
+
+## 旧バージョン
+{%- if old_download_link["SpectralPhaser"]|length == 0 %}
+旧バージョンはありません。
+{%- else %}
+ {%- for x in old_download_link["SpectralPhaser"] %}
+- [SpectralPhaser {{ x["version"] }} - VST 3 (github.com)]({{ x["url"] }})
+ {%- endfor %}
+{%- endif %}
+
+## ライセンス
+SpectralPhaser のライセンスは GPLv3 です。 GPLv3 の詳細と、利用したライブラリのライセンスは次のリンクにまとめています。
+
+- [https://github.com/ryukau/VSTPlugins/tree/master/License](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.
diff --git a/docs/manual/SpectralPhaser/img/SpectralPhaser.drawio b/docs/manual/SpectralPhaser/img/SpectralPhaser.drawio
new file mode 100644
index 00000000..b65171ed
--- /dev/null
+++ b/docs/manual/SpectralPhaser/img/SpectralPhaser.drawio
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/manual/SpectralPhaser/img/SpectralPhaser.png b/docs/manual/SpectralPhaser/img/SpectralPhaser.png
new file mode 100644
index 0000000000000000000000000000000000000000..cef4eff7512a023ae7e10728889e34a6dd4bc2a8
GIT binary patch
literal 26854
zcmeFZc|28p+XuQ(nhY6|GKQkeC4^82WlV%JL_%!yJeM*LNtuUiMP$g(Hcy$7Oexbg
z%RJ9yI@i*DKkxm#=Y7t5&L8LVIe(n;+)uSxd+oJ;>$<+v_48Lzk|jNQ`Y3`Rr1Emo
zw-JO;8$k%-4im$_5D=2}!~Y$zlGCz95VC6Ye+2cG?;j!vGa@g2?T%B=OrNDWb!U;p
z!u+nJ-+^x~4%a#9KejgCPot5hs|sNan?3eI|J*P26XSE=Z=9f1EiAbsr%282((x=$|jJoYVgAFHlf%qd)S`7ySHb&}04mLjHBO
zaCs*&M)-P|*DXIPo=EO5O^6&1txqyNt$ezTm6rXE`t$mcCl6><)KBDSlHf2cg?d~x
zvDEkA&D&VdQu<52WJ4;yeDUMh8)4czjJ(gxlyP^zid0UoURR|~5WvdvDMh6m(di6R
zN?ly-)MJfS_{Pi$d59ZZPu=#`ToUmoSLNdDgOP%S7g
zXKZ-*l0A5WVkG2#(V}F8k#w@^FPoxMvLAl`{>>~;`A}<2p6#4=-l)>0#p$7)n83C+
z)jN0ZveJ@Zv$M&Oh0XCq!>zShBgeOCcaAcK9)eF7VRTJhU7CdgaZEjAkVCuG%G%@G
zHO5&HoPEFOHVwH~32QIX+Sf-qIJbgLF*Rx=RcM#SU@{BSE|Czy6-ZD2%tw+VedhH|
z0)(Xc_*SkmzlD`_pvJSgISX?|4ESS-MC}EmIZ7D*MLtv{Ib#8H>+wl8d8}dY=UpfBgLEAC`4j
z*ZClFoP@Xyk3WXTJ%~AXJ?Z!sHMbdk8}?#^QPuo5WCci)0S^jo+GNU=3hAHdRp1%|xR~wUs!Q%*!
z1ot(q9QSQsOLTqblE=Yk?nrJ=q
zB{xWDz>O+ZIdRO^#!utDG|Q9wJigbHkZQgfRtB4*INC*v$B&qmMdv^HJjZ|Ewy1z3|Vf@;{UtZnf=uz5={rjO5CnkB$kGDHAr8^p!Y{
zz&Q{5>-XwoWoiNgYTsFpnimpgeX0o
zC9$O?t@(On`|u?aseH6(rI^CS&e1fl+Db|>UD$Lpe`fS8c$zU(cIE84nIJwgeXot>
zr4YtC;zLLX*&(m?-d?V+b~=tvs|H{0>IMe~hp@@3Sr83E$*H%dPyO(rkzi0jP*5af
zM3|J6lng=t#hSi;a(lD>pgQ56URIEl1<*Na3jMpj7+kR^4!n=X2Lrxeu>2iH@ZkqPqZbg
zP#^RqXQDB3U7NYa6In9OaZNnYw`II!zAZa?jra9UD7W!<<~sV&YO4S6;Q>TNM~4(y
za49od%|@S}!_TjmvPQAbmv8ZqF^X|`FiH$NWs4lsQMxtKnk0pI4Gj&I2qoqQ#l)P3
zXPUdq?9s(jNadv#G4J2MT?9X09ILah7|_$0!%dgrcxCpIYd@J&W!|}Puw7vBD`&Ps
zk-MGU9fh*9lt=jQ%r83W;{|n{h7NAHiMwr%Mq+ijXuMm-y;Dp-Vq816lz-sy_Z(D<
z+NCA7x?2#W#9@{YxnJ&f3i;@~{75t6`6c6KW?GVfnyIDHMiuJkWp)V<^R%b~Wz73a
zoty1xisK?eTr=VPCW?9bXR_`WT{JDO$6?^1hGp|U{itHQz7`Ej*kM?hx6`PhG!K+?
zda_YM>oPGlh09hCkHs5~qi8jRH@kD;Y=n4W_6W~4+P&X%(}nG-F)9A;Ouy>F<_2DK
z-u-IvMlFpxw|gd|K)G`dx=e!+_EUZ@TdksY%CLp)9+cMSS<_ge59tANY)@zL1w;tp
z6U1Y^WZ+C>IkXl}+MSlzY*0p!6DLj}UghQDNM%DfI|Z4q
zDhKt#8s0K+WMy>~8q?Z$=kI9q8DM>e!zdRw#$};Px?1SM5UveMP6*@GfUB-+gI~f}
zIjE09S?VgVWP(<)?IGbX(?u{i$6+rLPs4v9v1Q~(nwqfv6gBh-U#M(njvt0j{XRVa
z?rU$MHBpPio>;%{X#1Op9h1mF5jo8$E>bJ-zf9*?~rOx)P4N;aZPLtKF!s|MMX>N2*RgG1xxn)
zt)8i=sgDn;i7EJuOZIAxrNGgC&3uc#blA5V@%nH#JK!1F#=45NNPHbsPjC0FwIS%(
zC)MPutE<(@iJL<2^RV|AWbNO4hdYE`wD!WzOKfZN1EIymBKe;_4UJ3eUGXYWE1x?o
zZEVa=Epv^HlA<%abGmk{DfWy!<mnby|A*0|+c5ihJ-ux}pNVU0pYBNsxilf}7Mxnc|8`%-W-%$~-G%eKkDx
z7rgTsdNQd9BN8&Q>o3_hc09t6*{&R^1ALB{SNANpRWOQ*O&RNnQ%|kKFSQHQ&iCN)
zf%<$LQz1+jh?(a!EPD&j;FMSQ-foR2SUQpp^q09B>li0BnohcH%@!ccHwyY`v(F@-J1?)L3zrcwBIq9b>qyBgN9@@_5p;2rNjFYOfU2OC4GhHrm?nZl`hi6YgI9
ze%1Pw$-{@zz2-$ivLmvEePIhwdTK_j;TrPC3yX*Zw6(S6nw8|{-d14vR8S!Gk`3yT
z;^yxWJ@)VhzjDKvbCIXGDDXJr`?p-PXWLgL46vVmJ=CgucPp|LkLOHCIw+YDjd;b2
zIM5$z|Z=L>pl=)LF5685xYVEQf}4{MZ7oPVoV)h*}-~RKhW#E1mWXF)2v}
z1$Xn8&8N8Ru5iag+lMmd$JS8RFgZQVNjI65mUfMgw&oUZ8QaUWs;Vk^);n`c2OaJ3
z?#+5qQbgC2THl^MQXj$~m7^)mMI&Wwoa#qFrRTXVSG*-!tfp9WKWm0KgeH5waJ+w~
z^~Zf&%a1*i(FL?aNC{<$=dxGka&ZJa9UB|Vt(WfQt>%NLZ?ls86vouFD#x&1g@Zam
zR(8qBYQ61z{_xWScn95D1O7O1_n7fl?tz%C!%o=r7|*B1+b#i{e0+RpJ2-SRA0SwB
z!d21Hyh1;d&4J!vy;yl^PW+VY&H=ZLAzx%Jt0^Y*kT)3#iP!>vZyGU+wlge>kCp@C
z35T(=HLMc$a?3x$gcZKw&KeA`;4snb>FHOnGRv+HfW%lF-=U-8jyYLsdxoWs6x*=N
zq)hNnMuKvfe*-9gsLCH4@^3E`Z9H^}Ik|o5G$&o+pyIIy>vMe@fH<63XoUd5EMg5P
z6$J*$e@}7Nk=6yD2vzg_kMxL~Z69R-2?C&@u1*091Hb0Z(1OF5#Q4au5r)=#YjP1c
z=6;=m#sPn-<~xT;es?0YUPj`}_;NUo&W9khUTy7l)1xpswy$4@7dNhkUg@;aE-vKT
zHA~xi1Z^-q9Y_u01)VdorCxLCcpioh5KEZcH>ddV<;~o3!CiNb*Ee5(lE^&1l)~Md
zjCdta7mo;sToMrYCHL~z0q?3U5e-AbIIr|4R0i?rdCw!
zg
z)YN1&-V=NYFbx9(LkP6A7Jdscx6`Lj(<4f@w#z}CMOY3cDJgF_7gqU~6P7wUIw4q&
z=GNBMmuphE*=-a*G5SlJnV5VbP+9XC)1|gxj&028eVATR;radf<#Jm^lEINrI9$IY
zwmxubSN`R%d>k%dEjlf@SHyxTI&03ZKF;h4-eGd&^X-8Hh|@!hW{ukeQxg+WD+w2W
z+KVraxoxjza|FC^!RcuEcd+u?JB@xlfmC*6-jj*$oIZ%yIXVWOKjT=~5w9fo?zX{&
z1_m+@s4Mb0A)~(+=Qq)??pJ@e9N$oU>jSyv8pB^wv$BiPHZ7R5UVrVFaG(
z9|(7;xnQ6{j$c!(P)o5m^6dH`xRyPxsJXs&xc
zgUg#W;xQ=zWUEIO0s4NM>dLp`YW!RqcyjTFnlb?bU1-b=R)%v_ioeA65IL4~-qG}!
zb#TYaLWkMYh(1tSHR1xD5(ocdV?e6w*%RFek&X7m-2+Hhk!|YxkGVd;W^PEGUj+CDOGAf9!Xd%A@b3mtm(y{E4k`gZK
zTnwE@g=f$2L*$G#izD^5EhrC4Z8v%R_;Z?C>Wh}~)T?9np=Aw!etztvJ}of{P14iT
z3x#v=SrT#$KcpXR%w2%%
zIu!5NPk`Jnb)pEsf*|3xP<04Ux@-tN@Qsa$AE@s;Jw4
zmF_CL1&>(#D*w2)QsBvxP+^>(GCUXg3)cWVD_!q*h5PlwNNa}f=yU1q
z_a8n`HQ<#!f2&!?TMm>n!0luqxTHuG$)gjq6wu4y2+(95ZO&Bw^f4zX=^B?LDY3Uf5|;CHun1Dq
zTa4uZrewgRkk>_18KB)2V8q8H;bEO#Qf`qhXeGhL-}k!=2v$zBLGga=*|Ms6p4Q{E
z?QC_DW4d@w?&TdCqH|g8b|(vBQ?87dDHixp?G@;nrQ2V9$>y&q&}o=w*))H;!e0+4
zSzd9oVmnvhvAH6v(CMt5QCGrF6YgU;j1*wHr2gwkUU|kXgoul)D+LL0p`E{(P-m~R=a_#7Q%sF2dx|%o`}8#
zvEzKmWQfb=j>jDhjR>7Rs?Grr*K${5?q=&g$8tbTGN{P_Kmv+Xv;wiBq9XcC-%k5+
zHB|AKfZUlzD|%Ts0!c$d)~V^~)UxKjNquBvHQO^7$R(hp9C7GNZab@;FW8RQ+uMsZ
zaMlFuC4YxoTXdfcE|?6~qk^gEzEWuw&=38Aa(APxoe5b9KzUB9KkwF3UsqFWe>-yb
z?%k0lp#f@%d4R3=1?KD?LX%1{by}=F2?7#(M}Q0q1-+<4keY1Z+pH|IMEA8*0*Zh<
z;bHE5E7EOF1474*yLUU^V#4GOfNJ>sIzh$W&b+Z0S`ti$pJF+HufNaE=Ee7Sb{>Lj
zY>|O&d#~v@y1WS_(Hwu{T=+GC({RNUBe%Ab;duiP0}nMw7ASv;Hcq%EOkZc)a`kS+
z7rhb(()v)QdJumA&LEO2IaO8HkjlipZDabYF4O?)rha}9_ShCK-xv;bWsIds5G|Xo
zTZ_)JT~EOPvce9)XW4Gq+a~u|%S)`nVYcTSD`M@`lp7=eC9fC+2=&g*&B+r)rA*2(
zh8BKc#c@+?(cmL6$HY|Cn(R9FEXZpmYv(c+J`M>
z;-n-b3v9>t6;_u*02B!aSPXiZ0lh2-2QvEmS$msYCM>AM*`BPx;lGpa*>VUNyGZ#f2cFcJ#*#cg?ful
z+X-9EcdzibXkM>%n47Iz;d&{@tuS5-EXaY_E&~ig|z+M7!Ed*P>)a
zs*zT!eLN}7uit%LN8s}1*Pp8H%ntY0v^*NvypZZU5J20uw6z1|+UEgtY*WC}oeS!M
z?;;h>)&9`qiKKE&-v=E2XLkKhDxV8~k~Q64evO=rEa2I#_Wa!QRiJt3s;R33+k%^v
z*m9_vPx`YlEit8k&D$N*-TOs0GNqG>uT@U@oat%6#Gcf3B7i4b&tua_i)m@o4IXGf
zy9P1LfLg|vUn`OpVNM6u)F8YEJ^iMc^k!xSEn%KVH
z)5|dH5IWG=$^P3v)(;ho6w^#kzijyRYUdCFglyZR!jIKfD_7Dsvgwg37fp`y^4O_q
zc$_NvNI*~G#|Zb8FRLpxJ}Wg1TxLduZ(#s&w%PX)3?f$A_wF&&Tcd~=M7*}PGvz{x
z?V!pzBEkS~Lri0!J1NP^`nI>W4nnhWFn6q|tE)5B)9bXCeaQyMS?|aE)D&fQ`@q0_
zREm}ZAYUn|>Yy#&Peu8&)ve@n?*Kxt`1c#4h@|QF@`fa
zLhP+1Oi#17uFp3?LP~lCTGjA<0U;sLmuy$0q@(~|!!f0_67BH)eY+pE$uOdcJ77|X
z08$UY3a6NYsHi~4{L*QE)pJe=I6G
zg;;HGSR<96%sLSi09B?YdIae69j+J%1$0P+;4pZfwKWG&-B5s&Vmkc&-7Q;>9ffn=
zAaem&u&mgjK~z*#pF~8^9Pqw&fRF&hB&pu+V#hMwY{&1rbMyCARjW$8oE=uD)Z3Wq
zww4-s!59D)2tiUz1KOGw2R#2fV5;%k2kTl9{KCSAMa&=-i1
zLbuI}(8bqgx~tDO_-1&b8a^m$?8*t$$z5u-C>{iO32kJ1t)N0iR`w8xam{g8ysd=q
zJA9L5W-bqvX2Ft&1O*M2t@ld_)BA8WVwE_kV{-Qjt>5P5p|X7)h%nt&fn1S|AeAYU
z^fB0K9JPSUk#KQi-@^p}rYJv90{r3Yl%s<~fV6x1?nwEVvd0ot81ntIZD&nU
z;!5oKDuz?1qJN^FO(CDAw`TPSd>*75q@uMWOyK0;1$pilBJwZ6g}K1VS&LiTD~1aS
zVwzH-xDKunW-(cDNo=k1E*I}~$g^sh~ud%6rrz@!wa?7X9z=jMvqUR^QQ~*-8&YGo
zq?Ssqw-+@vMq2sG8VdleIBVoxr0#Vt8Y-qJzZ=Q>!f&EPD3B-UUx*{q_!7#0XacKp
zx#C0}vodxqJ(lU9u3Ae8tM5(D&YobUg`8|Y@eDC+~o3r$`Cim97i^|gGdp?PXTWlRkfE0sgPuu(msZ
zI`(aF)Rcl=cTX_(`2$*TqrhJBdGMz}sn+LmffYgP^8^GV#de^_&IbM(CZ+IQ@CD*e
z_*ZvSaHxq3iI!sHO5+pC(fb5Oj*^^-lXAot+>l=WtUW^`EcU9HRsK623||
z$6{F;juLyLdVgv=Nd72D&v9M1(2S@Jzm-oo@|;Z`@d^v0P~EMU*rh;#uLOcQeuW{g
zxcKzGx00X_0F*OS^y%pOR%%}s$4#whIyujsX+4lRhruQ=z{6Tp;i5s!-KAfYnS1~v
z+DxbsE408l%9a;c^obbKM>qWZaF@NWiz4&D2c{K-G1S+1@yw`jbH=o8k95zav=OEWT<|
zA1o`_hJ8H*>kjb(BSyJrOlj{AZlK_*XEy-|I3&;JA`LQ;AwWi;>M5q5bGe+#bitkX
zJRiu)&CM-rJ4S-~1gL8zY&D1oTJ{I&?M&T;`#WE{93s~Ya`7K)8W1s{P-OxBHiNoi
zo5Jcf=%G>hvvt9Ah!@!D4A3SLezL4Xn{?=@33m7I>S)9d4l<)Ih+#b$_y$R3WemP#
z44>LfTU(X5
z3@34?2?gSpw3F5$3m<5|U+=42`$AVhK*0G>$F&(Ps3|*J>&xh^{NuyZo!|H2W$3L(
zyiH@k9%QL2JO(1bbX#w45O4VgApmiT#QVKPw&0;uS$b~WOL&N`nZ}yhIUI%+4A+fy
zkq@Z4vvrV=V4^tW*hwD0+=mzaq3aIp%sGnXNOMMs+I(`H*M(Tc-Z>AGlsgxo0j#X7
zyusmUB8-yWy+e)6IuO!PM7`KhJD%W5He^MM!C;I+qt3vaHEOejN%BNWC8->5`Erqj
zNcrk2H9UB5?-2wf4>j?uAviy{B_Nzp`VT^$;o9B1CuQ^eGzLkvSi(@H4!)i6iPy%;
z19(nNV}>6cL;jNV2e!wAzySV;p@St*-JNF)Lao)%=YwG91}O9RTtBlt?zzj341ygp
zd?fWm6&lMS=_~wt=^E4#fzX8a>0^FqaHj40gZ=!?zX{R*&n@)72;HAxPN4o}Wr8N(
ze_807Ns#4`XRaeP=q)5?bZ)0Ho~Tn#IO6g#Rrs6mT7bKlwaR=y8w$)f4D^iYZ|F8AZYetaQ34w9ooJgK7!FXCVm!N&r;Akwq}?K|8PJ17$O%G^B5>
zaeO&&xv>#!3QqaEcO!`^C#R-t=@Y
z(FoC~*#iksv^Xm;vEFk4K=8Bb2e{dzHHB5>m+AKLHv8$|h}X*7&Vm{)Vp@K?0YPHVk%ep@(900oc4_S^jgI@iC;z;o7fgJ$k7wo0Xp9LlIm3$T_Er}9du+8KLfl9=k
zBB8r;mn&ZQcLdx^K5_T}f(B=Bm=RDs4GM*#6@~|^yb&*HmNPylFDs%;E-C#2n9{3P
z8OZ@INbQUi)Q?yrl3@E>jDCi}`_&p46rYb)0FSddsD1<%E4bDa5+&^?;EFFg-6!$?
z{(bS^so&Y2`dK=7DSvw7yw}5vM-USjs(FM_Q)lT@2q;ba4-K>`
z;AH^tXo=yT-cgqkPc#-QBEOq;p8zq348hk~(2#)Ck0NtLuzUa&`(#ZoZ0&@valXD8
zCsN7;Tm?QoTttUI4gs(#Dl*@AG}lm6q!px%O8e)D3g$LQx*2R{;D(~#2I`N`i@r2s
zoz7aFY*Dr=yUm3lB0d}*@s%JDuF`Kkb^5doHE8*w#{JR#13KZN2S_VTF&OTWE$dX5
zx&r)08+m~qN~)^#tz;BP#g4LS2hq*k%Zr|(8*rdfjPr1iz18b6(gDYDVH<96E68+h
zQoP(}5tBkBdH)#v(CrzAR0?)nXU)=c+BWSl&!@8L>cD^-b6+T>qVn^N|&2Ohr19f@EmeJt^ovl#?=VyeaI@RAmo-@gc0<2R3)$2ovuK6892~w
zLW1U9%smUAI(0#A17G?X+TF>;H$clrU4N*5>`HNi@M`!8jkA&vmaUbJ)J$WFjSqV{cCr&V1N+8fsi~{u@#_@528At
zdTzofknGNdgR_hv?E*uqE;5p~qV{kXkT)eIbg;C6^Z?yDfS{^G*$q8CCN}w}AOy+T
zE{`=KDh^3qIBuUy1b)ZN;qO@6nVwI#?1EAgTmmSj&kX8j%-w0;5Yj04hOunSl^$q#
zcoCrdk29z<_qqzR6&4nDzJQ#ZJW$X!`~d{#K!pb~PcP!*Pl~
zARB>(!sxs_c@H99|E=TkZp@dnBqo2dpVojD2tW)uOzaKHEO%_8eWw95BR{3t^)0~Y
zsJv48d+Gz?1^xiVM%|vMm>AcZEu9TSXrSN0(+lG00V~ITCm<`~xl1Y>Y$C8|PCzD2
z*CD5EIJR&XkaU}GFNKdkW`bC%Ao#5Og{`i|jd_1-Z)?NNo)Sl10Q!fR+*C9Y6wZZ#
zq@ksCzNZM9|4X(c!0U@n^l(8F-If~OQrxNw@6N;Ai@UUL?AVlC(hP0(@pq3Wk_do$
z@K%g45sjk@B?CJasvhenu3*)5bhrs=keRL=B5?AD$4vwR)KZlQ5I6Be&5s<77uRO-
zXfpvQiBy6G`~rUX+ocv}da{wC@dPOj>g)T`>j~0sFjw|==l6gMJ1sW}sp{$R&I#66
ztZf`K2Sk2gYHe*TSM;v78{B)aD#4X0C^+d+p-1wQoP-1^Ea@uB&Q{J(!q=6Rl^Gmh
zr3t*&E>H>zEb3Oc`=hz92wqSXZbkA81q<~<5q0kznu$64>+S03XnWlpGdfJX>q
zH2@&jYYsc+zgm1aCsg%E#wL&G!UcEgx{^Zq1B}2@mHFXAZ2rU!KmaEY<)JG9Pyy)>
zRYB+(?j8QSQR>Rrf~yZfkU#pl^YzM#AI-S4b);+D26&|vh|TRCXxX8yxB)p^Yj3}l
zYUye5!bFWIi!cTXiVOVPc`Ng>Vp36wr6kc1gRLD2c
zU1)ypM=RuaZshd;7P0*gM1=C+-0L8^m5+77u|k#x=H?^=o_kjzDtZJ#MeU9ZEpMnn
z20Oo3A@h6k#A4G6cwcKn9*e%>=RlD01(t!i5bq*G_yh%ga&q{Cf`ZT>*z4D?odAYM
z??;FGZb6&L(JYPqlA#+6N5g{KhtfUd4cHKHe?io*>guB11@Q!uA#yMOz#9`0NR_ZO
zfb{o1BZC^>8j4rh;5;Xn{Ui(cUmZ_{#f
zDd~hP4j_=Y>@9T;-%lI1NyD4%%SZ6wYRwCk?|%7mm@2afaM^!=Dr?MKjZgQv79UBn
zd2D(*kSWxudX%>=rXd)6q8|JFWN1C~v;Ah4s0N|C)KPZG7>_IhDtVWeU-Zmk!046InI4mHT=#Q;$5g@42x3vil8)|vVy#%Yd@#VQrUXR6N
zouAGB#!=a~w_XCcMQ)IWap6i6Y?q(AlHy_s{e^O6YMT^RMLmz~$7W{m7(#5>
zrL43$G6_^Ip?)VKFo{50Q_6X6ZMa+5*=Yx|eea4weV-%0>?e(yA4#J08~ZgKLPlYY
zqhD_%5W>1(r|pn;2w7cSg{B~8+Nc1n5KLeKG_@C_X8xczN@DMKX9a?UUR~>QXR7Y&
zyh=lrsbv%X{$Fl81rpxyb^;C1?sH^_Qh+xHVNU+l$d>UT2n%Y_?88t_y!dP5M0brD
zGc6jNMc)M;M5r?5_W3{23rNo%)&zi*VhR8Wnp0PvF*%(5z-yX+<^r?-=hQcvy@tdE
z#5bf_2pV&N!GWiNfC_SkCUEhgcujFhNov`XN4=W#d)wm@1jq-C%;I^&!mZ+Z1MKBP
z|JgeS?KAF*Eitr)>MHL;aLpHznRX5XnTb}o!DbG$7WoMDymV&`4>s<^NF*xKJ80(Tt@Z!|Lqgo&7M*@~k{
z?~PsRV+=k)AYM#of8F$DgRVv_qYCs8o)3t-frNAtIew(mhm@|S1(qkYYUz9TVl~Zd
zhii@`eDjSeIqaG~{o2~lS~mYt%xO1R6N@YD%E~2ueUYr%>kvGIXbX^V65zXJ$l!2o
zAi#=Tu91JqrG+l5=@a?D$zI9%L2Lqz4nk-U6%gQi0n(sm^oq+Lw%L|1u`{U*i};1n
zsagZojA}HXoWyanTRRgfma@bSHC!V&$sC9Bayv6EfE>M%N@s`R+^76v-efMWZ+D
z)y=cuoC9_vL?DC?5>4t%tB^(SaWz6XV`xJVr+=YIQUO$+e`++V%qEq(OqUnn{F9$L
zovLbT)h4(~JDo!af51n_`F^cVH2Rj%8_VPP>ucGN&4?eJMBTt((d>N4(<1p(S4$x^
z^=O-!Xr%75Et8}RET=8;x~?wG?wlx-rYdlT&d9&iT!w7CD(XO&PGt>EO-@oAi5Qqi
zBjfP=E<)TXAc)pW^Va2EwdYwNI%piwkWodGSYL9v=CmPmQk&DegU90m@_+kzzYUrCIl95hO37|ITZp7>TzP$S
z2n1EopTKoy^4#WE9+b+0EGL}_5=3_^$|N`>q<@`%cQMqH%LRK7<*a7`3frHiqpNL!
z0;yzX_F>}+nihzIv;lA`cCbGFvPFdH9b#f*W%_n^J>UiSN=-_t0=9U;H4{PukfsK@
zCjtfu90sf$^hl75B9b(>4LuQjgF&Ygc%;YT7NOOCaQjU%M}T2W%7$|h!9wd^2)xDc
z_Ea%XkLUK4L^Md7hlxx?$x2R6n<}+TP0S)cfn>L!PzoBU0;dKk}draf!FSEtc4NK%PfE`NT#ieIt4$YbX>HvSNN-uk~41N;dWFvt!$
zW&_*+rk;a2nSueV9bB=ynvHldZ4VyOtnk>$SOY3s3yP{EQkkL{%Q!(nVY|4GO~^rI
z;3kKv8l`Eu)8{zwz{zPNVGI12u!qiN{W7<5@9&TPm~=xt#4RdAg<}vFN_$6{{WMKL
z?eNt>&XfNdRQZWf{DDBqi3tY@k(wx9m!vE!0)ufRgy82FEQy#GN4IUs&2VeH^uP~F!$
zb|wAh)F`Env8C^+~5KqQFv(4IPV&B$mp$kQ$654PAlPZJ1ctRq$Q&ks2cv)bSh
z4}zdcjNDOIM-Ku?PxOrkcGrZUP0PRhqnaohJ2`2xX@SuRh{+&U^d$~{G()FE;|DMG
zQ8*mn4WreQL?^33pl-{xS{_pbK!a3*;Ai|=KwU$_0FVOW1#%t0pNsnwS~2hMTp&O$
zT(|%>8UOT7T_@A2QxCA8X#a@FkcZ!&rGmDIyx13lYg+Pi!IEto+jR3#LX*xYz5^2R
zxWICt4sxs?AOF0-fBkY>%w@BWkD6l67hrk|DWFw-MoR^u%Q@|1;Ksnr5yV-*&K^PI
zV5ou!Z3OaR1YR4F8X=HM1#1Y%Cgi^(A|mz+6T}iw`ZZa^stV|$M}#rdxK3HDc#CK3
zeFtl-iB`lxG)l&f=r=}iBVI73lmtAmvQL@2_3P4H$vi4=g#WJEkG+CCKSDfGw*pJt
zlK^3Koypk}_bJJC<$`mYfGcIxJ&Q_;h$PTSm{1}>39J-kxcheD?0Y?BFYCJq2-Q|94ck#NMVdQkky)VQ!0du6!tNM5R46tB!zbN>DLC-k1v|&rYWvWbOr+Qlo{EUO6$r0WOX6%KCaTpkY+%=$w{u
zbrl7v7i59OUfY%jz+}OeK?PwSA0J4#fvQfM6A>jkd>rx#V3kU>=WG4^=Q;KHbttHL
zLxWohs<&Dn_3L1WhX^8_;{#)uC6SbQArZ99QyXXKTJ9
z5vPPc6rpZb>+u#97bnIn>$2R1fP4^I`RD4@TC0-(|B
z^9iT9Z8NYVkgkaMnFnK6gT#acu)d+M0^4ODHvI%4rQ(tGfPs$ccO!ot;csB*x`T*?9?9v1DFu(sSY
zjkz0dGw&6oWV%jwaOV))YgUAnvEb8iSZ=bIVK5MnLhJmN=5Htcx);mDG@`%kkGNNtpP;YafV?d*P&Hct0
z`w0o5zw#6;7l;^8@EK`65^z4i_V3xJZ^h_{(Gtbq397$>Q$r0}PdrvX=z)!cW)sxa
z(WEP&y-EguSbpsti%w#fJcir$X((fZv>D7xKtkAnnloN05CcxbqElR$(Q}tSJoDOO
zo{?5w778xi3UjLG*CSuU?9KA8jMnua*S?@j7F?yMA&Gdwa-S&=9h#eF4D|0H{5QoL
zrCs9gr)v!;B8<)?wn()Lz|>bYAMi*pXMyF5F`m>~u5q#G-bi|+M9y6X9q_L(chUX_
zwD~(XPJpD{xmoklTu{{XCPkrW-}}G9;L_lWD)-vB6hdwj(s3X_LG}PLhOev*k8Cd|
z?j1lfv_DP#*V$dM9zFnxGoHxmP|s~cxWLFB{OI$ifw^@Jb3pz9)D#tF{E
zpFVx+s_>K;siO=rX%e`+0rYQVGBq*5p`?UYHlHSns}W6iTUZcVt*h=J5T#aciw5cd
zSuAVFPe2eIq&xyNss$t(jY>QAI~#v>vCz`diFay(1$N_uuL4h`6!Y=I{Q*OAAt8-_
z#B?m(=Du{mFjbD{o(CA+|EIq8U$js!=mln=Jf401OgNZykZA_o;s%yC$m{JqKE}P8
znsY4c^A&p@Jt6?vE{QKy^*I(FTvo^*>mI81r3k)Jd+7=!a%$sm!9*DHCN1p<&pB1KAp;;NfVH*#&9~5|F*boL?1y4&gABjnfpy59Euf<`k)dbuAHXg7FV0g)X2?{-l!$h977};XwE?X38fJidp
z1<^<-6$<$`WM${KXi<%c=4#thG(pE@F##o5K8ka
z21o!SAkbT(d!DS1P491QeF5AHHGClDW@l%Yv9Ww~FlmpW&jI3Z=Z{6At|ZMVVng7PBjFf-V|T)f|Uxmq>>?LJz)mS>Q|@scaMv&2L`A`loy
z8>LOB2N@aJ(!=9TV1x`;!x$j}=w>mvIq0a6reL2fh||SqpBTf2aVm;Q*d5`R97f+`k7;b3}Nux&yV)ct`x0k5Ql|$
zfAa~Ff4o3Jw6Bc+^98x#*dbHhg%%SojGMPmPXC))ZA(~oXJVUB*&Ci7#0wV4tB8ot
z76r+rrEyPa7O^b-B>tB9I4!FM#V14M9@duZ%DyK6-<0
zjrqmk7qfx-4r&jh;539te_R%*SQmpfT#e45_OKgY8_NmN~MA-gm}Ry
z2M7y)jz$F|n}}ES5PU_g+7xXbA||Fa;YR%^m{HE_K7RNB*caN`+J%M@Z-AOfGV_fr
z!oXhGIOK~sv_-gsAh8(g+w{mAl%9ckS+Hy%vDowoa*GKC^S9pJUMd;8Evxv65j%JE
z0HN56g95Q;5vw;I1cUN#XGeYZ?AhGskFnps--auxw5ereboS=Wn=hIkEfcq1YQ69h
z0)+rBbUL9@wsmy)RQr;%Qun4P{jvR4J6X8YNf>2LWq@>35J~o12@lZ`(h2
zmpWg9NCjlT5$4mu!!QU8Dqk1MD!%NEd*f$)VC3H3y`vHI1v2EL^+?_MX`TXn6Ok5k
zUeO~hOX>s@|Cp>f;<|d1rWJ%Wg8R`28lucSeiA8-LSz9b7s1A-Xq%K&g^Ga|hK(Sw
zlBCScrh|l&Y(Y8HWWcP?`F9TU#!W+auI9G*g>n?@6C{I7vElxf~X*j
zS|F0J*TT%r<9z`@)kPiWo~5UQ1Pwb4fH4Q!WlYKUDHJO(Cwj-~?H<>PxcOy&1^PJSNxm~j$T!NbVV_jKPU
z1z__GbHUh|uQWP%Y!-!%^u9U@F(stJfwc@mV3)*&Tic_XE;qU)3p0wl9Y#3LpLhP(
zhhR&f31yNX3#}(oS6^&bmH@m4Ft2p2#|(9mP`?xK2}mMep4fw^k6u~k=_I#q46qEFd=&gib_^)qEc@ctL;z$;rt?F)2e(6^T*e_%*8u79SP661vF1Jw&{&kdmYnNklc-HRbkm
zSOj(`=y(I3L3ck`v(4eUmrt`W<_bzTBpUZeI0+E2iy=b+t26g$Z?U~uf6G21r3ayS
zV=UGZg%z8>P4vw}z~Q!B8u;F5j9fLA)R$RXJ&g=IhY)
z@s_BZ&2$Bq$&Ns$%2V4n+99c~q~7(1(=ra4g!w-~pg9F!P(^i{(c9Kc=u0he$^@
z!B!mFuk5rnS^T~-nDa~_6mFx$mkszZ7LH2r;UL4tMtKcF(%_lt=rDjT24UkIxDm*U
zzA%ddIdi-fr%8SWUR}G0kK8G?=Yy%&chnpH1@hy
z@`E2q^$Vc^2%SK{eC%6vX^SmUZg1+50{m6ebKYN+1C{4Uk9pDGJrvX;H#s>8$VSYW
zvN)@8IVfmZ76
z^UfpG+@@eHzFPGIt*F)j45|%~2cja`9o?z?YYds_Cngmf;Vd-^C8te&M#Y>K-b_59
z`SFQYyHUs0wd7#sl9QMQgp!Pc_g(P)Q5cEo3E&xsZsgX$>{C@OK;m_TWrUuS~Yn
zARp4w8bloD;@(Xc!@vK8Jwh6_co44N_A^scxu9H+=1|wmb=srHi7?VypC5>nxHK*zj(_V-(y4VQ1s<(h_ZAsS?}1j`XoKavBJFB!+qB^U-^H9-!G
z7+K!T0Q2Wpye&52%T5S5AI=^?zCfOA5pn;$@>VRus9|}d@(IzB+ap*r?K*iGLNsGt
zut7%q&2!-zBJl~!xs!H1@aGQDeFJe!=%*I6pAGETx!1YbbzQmkQQm{?9u~%XED86-
zaL=#cKuJYSP(&X_Cpma|6Mx!xdwUl;&NCvYBCEU_0BS^edW;S_J-uSCS!DBW#-PG=
zJu8muB2~M9(F=7|Rn>gvTl)K*w}oUeL{xuU#}16+_Av%V#t1`J+epro6Jih1ALmK~
z=Re>CC!c`8GjLoLV=aHCt8;L2N;x}Ufo@9kPzQw>(Tz-B&axPkT~kiZ$oOvv#7hHx
zLEu#VKd^_v{##4`6MOLgCr}brBUIg9I+)m|*|R}x35N>&)K7c*^mW15TJXR3qlTag
zad2}#@3WAFvmydDdX=l6J_5f+iQ<(zmL%lltl
zY((P0qd$NERRTcu=i|q4gf}1vJ=r08vigk3#wH0qzDmgtQ6$xpe6+9jApZA&RxCD=
z0Jc-p!T{0%6>QNqyKuEUdKb>6%&JCkeb1O1g@7~EI9P^hpP;x#RUw$7=
z8T{{9<0Di_Y()hVP$-S8^z>W}tzR%$hI)r+Fcgb@iodmd0mM%jzwfjMpn>k_0VyRg
z_?LHeV51ahCB2h@n!@xqEG>BfcR=MbHXhGdrWSF(Lcy(i>E{!{SWMliP=js*++*%7
z$q(>e(35gcz+`H!hBGm29g+0u(+T7w1cEGhn>baO&<#%hMjChnkubSmIhks333wuJ
zd7u-9M=2}Ywy%KN+V3*Wz3F=4b&P$&^;BN=P{yl-NXGr5CI80bjRCo|CMTZYXK%pN
zH}i2xE}HPkn3RU2mmppbmo7}M@=+d|cZF+eRdnC^^V5wsh$$=TgHGBnWQot58sTVQ>r@C*lQYkP#hZKsh^nCn5=i8dZ}Z
zaTF2~a?ts1y$!4O$zBVgg2=I-uxSp0z?`Np%!8$;Z-BD!@c1fhATtCY5pF2h;8id-
z{!0=MVByD)ANnwv=`<271Pc9`#uL?)aBE>%avMQmkHhVMh<+j^=uTdX9nJoogLeC?
z?q2?*snZ#-!yE=Po1YkH)Qwe_hKm9q0g5WZTw)B_6OKgl3fS}kG~TZ?+2{^ze~?%>
z!A}^He+rwhaDJEaCCl--@Dac*-~|ib6I}1Ff|3KE7MfV++IXTTz$jKr7nVIBa!8Ql
zYyz15U`OD*pn?NfQU1M&=Dq7m&ZTlXrnvY9@Iq@Ibj(6e@rVDlIYUFk_A%Jf=2H36
zH7?OUFK1%ygZU5+fpM_LbzAf9+=Ivh2u5hG0|t0=Z&NoF05;?;TX~rw2B5EnK}-51
z&wWh|Z@)c2Pc%9_H%u%W>jT9U6vzr)^I
zl>X>oW%vad1nyXvw-Lc01nZZsgAW3h1N|*k$rMuqkf~wqI{G~L@@8${VS_Zp4RQX!
zCo`}s+gG}hvrqGSZKM$#?E4eV^E3rMz}NZctloM!Ax(Iy;lO_bfa+O?@t^bUqv#?f
z%?EENu`mes8{libkOEfyKq%GW1A`7F=#~weMKG!Z_Q~iGcTl6W&IhCh!2LrcAp#Bv
z2=E#JZ{d&>FPIyPGq-|4v9l6}W<{8J11E&a@Xa5PM5ganssTF%Kr9b3jxgL0->0<=
z*#w}5WI||EFe}Rk%h8o<6gcBkYCS>>Nj%sws^58>0UpR?$h&p0x4#xuE0cQO+0}Je
zrxP$Az}P@E?cagk{oYrvUsqWai~tUTl&NtR`3G1FAMvx$<2ZX<@Mtq$x6~Q`DexRf
z7^L2w&i{;Q@_(3Dm78Idmx)CDT;qwvoK3iwUl=+I$tX}SND<94m&;!p8;w8p!W;qY
zk#Gpngba>a8H)i=LU#HX)9VDepd?xl1Yy&uW@a#IO~Rl{p9TLBw#u_wpVJX@+gQl)
zoNpCS>?YLs)2#>fH;w>9dI}QWp-5i6h>=gg=S{5PG6+6JTL?M1a;zixqQqK7jVGu|
z$V@$y*c=#^x+oWWu`G;uxI_9TCWleInSTJLH-eUymarj>lwJ062aiY=mPyx4`yI{v
z)4WFrbFLe{ky(DK{7$;Y1;(F4{%m8p-?VEa_l@O$DhdC&oBLbB;57DNl|)5e{)y?P
zJ>cOWnt}Nw1!5=i2I~B~ckj@P&C6?y9=-GwmG?vuEh8h$npeRFl?o-U>pTdI%|hcf
z(AP&m0<;o|M^j#Z`gQ&P7yEUfpGi5)6hYbAGmU|bXK3u=VJ({r(tRFUc-sO&9GJ@k
z;t2nRF9brK$|VYpjzRz-Zl}HC8UWq7T>!?C5)LfCfsO=?9&+HY>&$ty76ih~5a1B(
z+qcp<6~#N++5z9ce?KqrAtOUtUj9gKw|PI}f(jbS59a&JCg$g5fi=K>YAL2L`h2a^
z6#OH^E0|75={H1pFfi{U3zPze{1w1uH0$4^DuYcWmc}8|;;{wMwZjNitgNR>vp9h9%X?@P7r$(HC@MH?%Kek-fK(r0SGQ98w?$Ok{?P7_y87*+zB#S^lFzE0^xqr0jI@9<@KS-(wf{$FR~`;^
z{>Q&4+O|TGT2ZUbBu9=MD=W(Ux}+qzX~z*|l@S?H(evc0)gdLKY>l!aqht{Eql3YO
za+ZWKIdWHy1>eQsyysB0)BC-tZq*?idNAh2@AWJ-vEcRf9jqMp^yLthsm9w6jq4Ef~XjT5yX;q%RvtLp0wRQf=p
z;GeP`T|kJEO9MYN+p8?g0GJV~KLHE6tKJ@bwtKbKM>mGl#qkHj!vq{qKbu`@^=|lv
z#T@2RdHDprn3~SSfeVt1hEDNv9Zc>)>tQl81ymj^!G}cl>dGz64@Y2M!;lMK3`G6F
z%1x$-JI~8;Hc9VJ0$vgC@4o9-RlO`v!rJ-*OLf&M=nHTWAqMi8GjFY-A#n&=q`GU~
zgT$zS1C<$uxtT3>rh{D5S0(<}X}@(FQqO81+qi`IPqm)J2)Q#D%8Y#%H+bu10@fnu
zw)J-@l!2c0zzmt}=5=2NB%$+y6O3*-DE@17^7zJK}l|WXP(&H;xo6Mh$S3U
zv55IkZJLKeuze!}4~@lGN>@)0BQPE!f;bJi>3yYxYv7h(G3*Ig
zi~Tezr}@uSnxzXd5CVH~mk##SYxTh1Q|fK=!~92B=zM!${rF>&w^nw8_Z_upTKoK6
zH(l3iYllIpEk^CmbUux4X{WA_xCzA8icqx~PUE{WBQ8Y?e@|G>tB{4v~u}n>7@h-7dPNYLYoifu-6urwnz-PX
zb*}EpReL*{wlBS<6XDa}vNk9O&3AWq&z_y6C>J679ch*JQr;CQg5&?11qkZWFCOC4
zq|`&e0?3N?Elt<&D1QE23TQs`*3WBe#VLpf>0VwcHk9nL;_m)DIXPFTG}!T=zYzar(*H4s(bD?0iPqnTncAV7Ca_cF|6*s!b*jeQKEFq
z=_zCz$%7ELLoK&RwK}S7Uyb+B6Odn?Y>|r6=B?-8{Dpz>X(qH=P-dcs;kidUhKmN?
zUY+c@z#Z@4#y5BaDJI#-Z<$;`{=oaulCk5glsU%&%`0GL*`A__NlRBW;)CNZQCB$}
z=5EvTHJxU_>nY@Nxq5m=gx2ni+j4_oq~PS*AixB?ntN>07)mMNsW$z6lHtYZPura;
zfk9HR@){C=X4~@U*QG?}-qSkEVsk%s+wk`eAFF~0APeh6FzBe=)JoAln
ziX&iFNM-Q{pf_4d&Rvba@*c|fzErnj%20}_IrKnsdhXZ4*#IdM8yovC*?2jBnlEhG6rJ0o{kZ2Gi6&~m1khq5{TINuQkc9yLww?eP
z*`O
zz!IlnhLja)DJhIbqt+xng)DDNhkImY*e-UQo{f+fb-JY*H4R7t;A624Io+p#8uAG`
zDHsS;qozPjyEwRl+(qud4RG5}SXs(c<8hF1cjn?Jz?lFzS%M_v5c`a1Tghbp-qB#=
z-;rp-QRBhoLGZ}lH$|&sbSQ4d0zj3#eFqNUC8AQEt;xzzQrG9BC8t9LP|BH^H5Y>K
zvhfVqw78WJ9NfXHXgKA$A+mE_Kv4wWNHOL!?W45%#D2#mLyoPEGQx&k1Y%9*+nn*w
zJ2qK3)5O`2EBwOs69)RIE8!)^P>bzSE0xJ)T9fsFHN?JPu6!FBjbD4t>LEIV
z2t^drSV?uf952_OWV4k6A2b*A+28lM;wU5-3jp`-4-6z>==92E^_Ao#f%XR*N?*KS
zWAtyjs`2J!-JWT2yQ>&zZ`fL)K1B7o<0rI$oDv9wpHxbGq$2^&r>j*QLNc+;xGL$qO9QBH4$i(F%l43Wy)NV
zSvaKG`zYpYKeh^
zi%SefHsY#7^8LwRPwF_DQNeyMfE^>R`;Lag0!lDA)Y8QyG
zb}?bw^q4>V?re`@q6I!Q>_B^a?90`oLu===(^e5cj?C
z78eh)iOfTYCV2??>5R-eRn?kXt9+!Nj|3NPR^O4J_e&X1KIZ9=eP+q&EuW38?YK?-
zpiF^jNJ32Y-RZLUlYn!U?Tqy&BB`QzX>v`=l3po`Gbkz0#4ldV0Gx;iu7r`b_|sOO
z<20Z3X03T?w{AW9160f8V)!ntt-%t|3P2KjllC1HDUt#)<=HYg@(~GR53zn^g^ULT
zBbN`@ZarL*Xq+UsZS$Mel?{jluwX|nwuYS+cV|5h*QOT+a@l%J-
zt3;jqw2!1DkV}9-hRZK|ezNrOajp{8wcexma_;6sz7bK5Mw^9kx>lOY!<4JKVvl5(
zD(qVK5=IT5UDmR|w8d{RLOdE*w>~Mc*`l`2YHp(L95I-4O^^_Q6-GP0y!*erpE5DL
zwzF2{N&E2-Sw)mw{V#1?2+Tcr4a@oTc3{pr9ksjmRh+d}EJ^{sV1a9q@_~m{q+4~#
zJYM*9JYC4}2B$kptx)tpYS#5|mCN#$dn13ANueK|nq2>}0BkLXM2P19J@NWr>v9!{
zD>59d0pXh0#J-kAli-}wo3o*Ep81WP+P0Vv4!HF%&+92U&$(piv*<}|TRPJr2Fp5j
zbW-+4-IAN;#~pDkyW(r$bTM((WoAMF{oA;Dje!OLroZBJG<=}tZ1d)q%=TeVD6L{M
z3f7-km<%EvbUKmtX}`}rHlZp*KO1V<%eu1Zhe5?9OukLArW>U!swgcZ=&+Vq(Wg7t
z>H+7G=Ba|XMl1)2Tg&g2rJt>Pk7$j#fZIL<2|j!vrU=wZ@Fs6UJ}IEAF3&vTYqiky
zZJQ$7v%|#cZf)`uxd?2Lm*uDP2ew#}TSgmzW<5p1KGEOS4Cr$<46|VL{^0dqyol8=
z-c){PDA0)6;nG`ftfjNL+;Mm`cyI`tgad-amx>q?m3(#gn2!
zV`Q<*VI4xpHn2@tIMcbU#4mawFAGUhj}W^8_nb}Ue^{*1^f>t?OG-feP!t;CW2`RG
zoTWf2J?h>vw0%#)Wh*_gPf&J&8Qcz+a@CtRllAU+B29PG>GY~Fwb0O7B@TA`(V-Ik
z8^m)la$QEN8E?xqFfg#O0K_6kWcgt(gHiXr^uTwtB!}U0g|7jUOhB=+A?u7>tWV1h
z-P;fu5fM0fm7$`lnqb{OoNJQ)Jjw8RYt1Za>47h%YjpoLC^;?o`78JM72Q+B)H3q7
tA50^kH$A<(8s*e`#i5`|8T~X_A8MPw{m|%fd~p%AnQmd0v3^h3{{U+2vOxd<
literal 0
HcmV?d00001
diff --git a/docs/manual/SpectralPhaser/img/SpectralPhaser.svg b/docs/manual/SpectralPhaser/img/SpectralPhaser.svg
new file mode 100644
index 00000000..2e9b2d8a
--- /dev/null
+++ b/docs/manual/SpectralPhaser/img/SpectralPhaser.svg
@@ -0,0 +1,3 @@
+
+
+Fwd. Transform SpectralPhaser Output Input LFO Bwd. Transform Feedback Mask 1 Frame Delay
Frequency Domain
\ No newline at end of file
diff --git a/docs/manual/SpectralPhaser/img/VST_Compatible_Logo_Steinberg_negative.svg b/docs/manual/SpectralPhaser/img/VST_Compatible_Logo_Steinberg_negative.svg
new file mode 100644
index 00000000..f03d67ac
--- /dev/null
+++ b/docs/manual/SpectralPhaser/img/VST_Compatible_Logo_Steinberg_negative.svg
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+