commit 2651726bd1e53d56a0a4fcd3c1eaac6edfd654b5
parent c361adb5616c367fb89bac8dd79a13bc41133563
Author: Jatin Chowdhury <[email protected]>
Date: Sat, 4 Sep 2021 17:37:43 -0700
Update user manual for version 2.9.0
Diffstat:
19 files changed, 105 insertions(+), 67 deletions(-)
diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml
@@ -26,7 +26,9 @@ jobs:
- name: Build manual
working-directory: ${{github.workspace}}/Manual
- run: make
+ run: |
+ make clean
+ make
- name: Deploy manual
uses: appleboy/scp-action@master
diff --git a/Manual/ChowTapeManual.pdf b/Manual/ChowTapeManual.pdf
Binary files differ.
diff --git a/Manual/ChowTapeManual.tex b/Manual/ChowTapeManual.tex
@@ -38,7 +38,7 @@ ChowTape for iOS can be downloaded from the
\begin{figure}[ht]
\center
- \includegraphics[width=0.45\columnwidth]{../Refs/Pictures/sony_tc-260.jpg}
+ \includegraphics[width=0.45\columnwidth]{sony_tc-260.jpg}
\caption{\label{TapeMachine}{\it A Sony TC 260 reel-to-reel tape machine}}
\end{figure}
@@ -56,11 +56,12 @@ controls even allow the user to achieve more ``extreme''
results than would be possible with a physical tape machine.
\subsubsection{Main Controls}
-\boldtheme{Input Gain} controls the gain level going into the
-rest of the plugin. Note that abnormally large levels can
-cause the plugin to become unstable, so it is recommended
-that sound levels are below unity gain going into the plugin,
-and any extra gain should come from the input gain control. %@TODO: more notes on stability
+\boldtheme{Input Gain} controls the gain level going into
+the rest of the plugin. Note that abnormally large levels
+can cause the plugin to become unstable, so it is recommended
+that sound levels are at or below unity gain going into the
+plugin, and any extra gain should come from the input gain
+control.
\newpar
\boldtheme{Dry/Wet} allows the user to choose how much of the
signal they want to the plugin's processing to affect.
@@ -99,7 +100,7 @@ through the plugin unaffected.
\begin{figure}[ht]
\center
\includegraphics[height=0.35\paperheight]{../Plugin/Screenshots/Tape.png}
- \caption{\label{h_bias}{\it Tape hysteresis controls}}
+ \caption{\label{hysteresis_controls}{\it Tape hysteresis controls}}
\end{figure}
%
% \begin{figure}[ht]
@@ -138,9 +139,9 @@ the hysteresis process. This differs from the input gain in that
it affects the nonlinear characteristic of the hysteresis process.
\newpar
\boldtheme{Saturation} controls the level at which the hysteresis
-function saturates. Higher values correspond to a lower Saturation
+function saturates. Higher values correspond to a lower saturation
point, resulting in a more distorted sound.
-\newpar
+\newline
\boldtheme{Bias} controls the amount of bias used by the tape
recorder. Tape bias is the addition of an inaudible high-frequency
signal to the audio signal\footnote{\href{https://hccc.org.uk/acbias.html}{More information on tape biasing}}.
@@ -175,6 +176,37 @@ is recommended to use higher-order solvers for mix busses
and key tracks in a mix, while using lower-order solvers for
less important tracks.
+\begin{figure}[ht]
+ \center
+ \includegraphics[height=0.32\paperheight]{../Plugin/Screenshots/Comp.png}
+ \caption{\label{comp_controls}{\it Tape compression controls}}
+\end{figure}
+%
+\subsubsection{Compression Controls}
+The compression section applies a characteristic
+compression curve to the signal, which can be useful
+for reducing the dynamic range of the signal before
+going into the hysteresis processing.
+\newpar
+\boldtheme{Amount} controls the level at which the
+compression curve starts to take effect. At 0 dB, the
+compression has no effect on the signal. At 9 dB, any
+signal above -9 dB will start to be compressed.
+\newpar
+The \boldtheme{Attack} parameter controls how quickly
+the compression will start to take effect once the
+signal enters the range where it is being compressed.
+\newpar
+Similarly, the \boldtheme{Release} parameter controls
+how quickly the compression backs off once the signal
+is no longer in the compression region.
+%
+\begin{figure}[ht]
+ \center
+ \includegraphics[width=0.75\columnwidth]{../Simulations/Compression/compression_curves.png}
+ \caption{\label{comp_curves}{\it Tape compression characteristic curves}}
+\end{figure}
+
\subsubsection{Tone Controls}
The tone section applies a set of pre-/post-emphasis filters
to the signal before and after the hysteresis processing
@@ -191,8 +223,8 @@ between the bass and treble sections of the filter.
\begin{figure}[ht]
\center
- \includegraphics[height=0.32\paperheight]{../Plugin/Screenshots/Loss.png}
- \caption{\label{h_bias}{\it Loss filter controls}}
+ \includegraphics[height=0.45\paperheight]{../Plugin/Screenshots/Loss.png}
+ \caption{\label{loss_controls}{\it Loss filter controls}}
\end{figure}
%
\begin{figure}[ht]
@@ -259,7 +291,7 @@ applies an amplitude envelope to the tape noise.
\begin{figure}[ht]
\center
\includegraphics[height=0.32\paperheight]{../Plugin/Screenshots/Degrade.png}
- \caption{\label{h_bias}{\it Degradation controls.}}
+ \caption{\label{degrade_controls}{\it Degradation controls.}}
\end{figure}
\subsubsection{Chew Controls}
@@ -281,7 +313,7 @@ captured from an original Sony TC-260 tape machine.
\begin{figure}[ht]
\center
\includegraphics[height=0.32\paperheight]{../Plugin/Screenshots/Wow.png}
- \caption{\label{h_bias}{\it Wow controls.}}
+ \caption{\label{wow_controls}{\it Wow controls.}}
\end{figure}
%
\boldtheme{Depth} controls the depth of the flutter and
@@ -333,8 +365,6 @@ or \href{https://github.com/jatinchowdhury18/AnalogTapeModel/issues}{create an i
on GitHub. GitHub issues are preferred, since they are publicly
visible.
-\vspace{8em}
-
\subsection{Acknowledgements}
Thanks to Yann from SINK Music for helping to create this
user manual, as well as all the users of ChowTape who have
diff --git a/Manual/sony_tc-260.jpg b/Manual/sony_tc-260.jpg
Binary files differ.
diff --git a/Plugin/Screenshots/CHEW.png b/Plugin/Screenshots/CHEW.png
Binary files differ.
diff --git a/Plugin/Screenshots/Comp.png b/Plugin/Screenshots/Comp.png
Binary files differ.
diff --git a/Plugin/Screenshots/Degrade.png b/Plugin/Screenshots/Degrade.png
Binary files differ.
diff --git a/Plugin/Screenshots/Filters.png b/Plugin/Screenshots/Filters.png
Binary files differ.
diff --git a/Plugin/Screenshots/Flutter.png b/Plugin/Screenshots/Flutter.png
Binary files differ.
diff --git a/Plugin/Screenshots/Gain.png b/Plugin/Screenshots/Gain.png
Binary files differ.
diff --git a/Plugin/Screenshots/Loss.png b/Plugin/Screenshots/Loss.png
Binary files differ.
diff --git a/Plugin/Screenshots/Tape.png b/Plugin/Screenshots/Tape.png
Binary files differ.
diff --git a/Plugin/Screenshots/Tone.png b/Plugin/Screenshots/Tone.png
Binary files differ.
diff --git a/Plugin/Screenshots/Wow.png b/Plugin/Screenshots/Wow.png
Binary files differ.
diff --git a/Plugin/Screenshots/full_gui.png b/Plugin/Screenshots/full_gui.png
Binary files differ.
diff --git a/Plugin/Source/Headless/ScreenshotHelper.cpp b/Plugin/Source/Headless/ScreenshotHelper.cpp
@@ -79,7 +79,7 @@ void ScreenshotHelper::takeScreenshots (const ArgumentList& args)
std::unique_ptr<AudioProcessorEditor> editor (plugin->createEditorIfNeeded());
// make sure all plugin sections are enabled
- StringArray onOffIDs { "ifilt_onoff", "hyst_onoff", "tone_onoff", "loss_onoff", "chew_onoff", "deg_onoff", "flutter_onoff" };
+ StringArray onOffIDs { "ifilt_onoff", "hyst_onoff", "tone_onoff", "loss_onoff", "chew_onoff", "deg_onoff", "flutter_onoff", "comp_onoff" };
for (auto param : plugin->getParameters())
{
if (auto* paramCast = dynamic_cast<RangedAudioParameter*> (param))
diff --git a/Simulations/Compression/compression.py b/Simulations/Compression/compression.py
@@ -0,0 +1,56 @@
+
+# %%
+import numpy as np
+import matplotlib.pyplot as plt
+
+# %%
+def db2lin(x):
+ return 10**(x / 20)
+
+def lin2db(x):
+ return 20 * np.log10(np.abs(x) + 1.0e-24)
+
+
+def saturate_db(x_db, db_plus):
+ window = 2 * db_plus if db_plus > 0 else -1000
+ y_db = np.zeros_like(x_db)
+ for idx, x_val in enumerate(x_db):
+ y_val = x_val + db_plus
+ if x_val >= -window:
+ y_val = np.log(x_val + window + 1) - db_plus
+
+ y_db[idx] = y_val
+
+ return y_db
+
+def saturate(x, db_plus):
+ sign = np.sign(x)
+ x_db = lin2db(x)
+ y_db = saturate_db(x_db, db_plus)
+ y = db2lin(y_db) * sign
+ return y
+
+# %%
+x = np.linspace(-18, 6)
+# x = np.linspace(-13, -11)
+
+for db in [0, 1, 2, 3, 4, 5, 6]:
+ plt.plot(x, saturate_db(x, db), label=f'Compression Amount: {db} dB')
+
+plt.legend()
+plt.xlabel('Input Level [dB]')
+plt.ylabel('Output Level [dB]')
+plt.title('Tape Compression Characteristic Curves')
+plt.grid()
+plt.savefig('compression_curves.png')
+plt.show()
+
+# %%
+# x = np.linspace(-2, 2)
+
+# for db in [0, 1, 2, 3, 4, 5, 6]:
+# plt.plot(x, saturate(x, db))
+
+# plt.grid()
+
+# %%
diff --git a/Simulations/Compression/compression_curves.png b/Simulations/Compression/compression_curves.png
Binary files differ.
diff --git a/Simulations/compression.py b/Simulations/compression.py
@@ -1,50 +0,0 @@
-
-# %%
-import numpy as np
-import matplotlib.pyplot as plt
-
-# %%
-def db2lin(x):
- return 10**(x / 20)
-
-def lin2db(x):
- return 20 * np.log10(np.abs(x) + 1.0e-24)
-
-
-def saturate_db(x_db, db_plus):
- window = 2 * db_plus if db_plus > 0 else -1000
- y_db = np.zeros_like(x_db)
- for idx, x_val in enumerate(x_db):
- y_val = x_val + db_plus
- if x_val >= -window:
- y_val = np.log(x_val + window + 1) - db_plus
-
- y_db[idx] = y_val
-
- return y_db
-
-def saturate(x, db_plus):
- sign = np.sign(x)
- x_db = lin2db(x)
- y_db = saturate_db(x_db, db_plus)
- y = db2lin(y_db) * sign
- return y
-
-# %%
-x = np.linspace(-18, 6)
-# x = np.linspace(-13, -11)
-
-for db in [0, 1, 2, 3, 4, 5, 6]:
- plt.plot(x, saturate_db(x, db))
-
-plt.grid()
-
-# %%
-x = np.linspace(-2, 2)
-
-for db in [0, 1, 2, 3, 4, 5, 6]:
- plt.plot(x, saturate(x, db))
-
-plt.grid()
-
-# %%