AnalogTapeModel

Physical modelling signal processing for analog tape recording
Log | Files | Refs | Submodules | README | LICENSE

commit 13e05658be828404e334b09a615c1b8335c71f07
parent 0d8a1c315d07f0385adce5c28a0a68350bcf3f9f
Author: NeelKanth333 <79251492+NeelKanth333@users.noreply.github.com>
Date:   Thu,  8 Apr 2021 07:22:10 +0530

fine control over depth slider (#177)

* added 0.1x button

* implemented code for finer control over depth slider

* implemented point1x control

* refinements

* added param attrib
Diffstat:
MPlugin/Source/GUI/Assets/gui.xml | 506+++++++++++++++++++++++++++++++++++++++++--------------------------------------
MPlugin/Source/GUI/OnOffManager.cpp | 2+-
MPlugin/Source/Processors/Degrade/DegradeProcessor.cpp | 9+++++++--
MPlugin/Source/Processors/Degrade/DegradeProcessor.h | 1+
4 files changed, 269 insertions(+), 249 deletions(-)

diff --git a/Plugin/Source/GUI/Assets/gui.xml b/Plugin/Source/GUI/Assets/gui.xml @@ -1,246 +1,260 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<magic> - <Styles> - <Style name="default"> - <Nodes/> - <Classes> - <plot-view border="2" background-color="black" border-color="silver" display="contents"/> - <nomargin margin="0" padding="0" border="0"/> - <group margin="5" padding="5" border="2" flex-direction="column"/> - <Slider background-color="00000000" caption-color="FFFFFFFF" slider-text-outline="00000000" - slider-type="rotary-horizontal-vertical" slider-textbox="textbox-below" - lookAndFeel="MyLNF" slider-background="ff595c6b" slider-track="ff9cbcbd" - slidertext-width="80" slidertext-height="17" caption-size="21.25"> - <media/> - </Slider> - </Classes> - <Types> - <Slider border="0" slider-type="rotary-horizontal-vertical" slider-textbox="textbox-below"/> - <ToggleButton border="0" max-height="50" caption-size="0" text="Active"/> - <TextButton border="0" max-height="50" caption-size="0"/> - <ComboBox border="0" max-height="50" caption-size="0"/> - <Plot border="0" margin="0" padding="0" background-color="00000000" - radius="0"/> - <XYDragComponent border="0" margin="0" padding="0" background-color="00000000" - radius="0"/> - </Types> - </Style> - </Styles> - <View id="root" resizable="1" resize-corner="1" flex-direction="column" - padding="0" width="580" height="620" background-color="FF8B3232" - background-image="Background_svg" image-placement="stretch"> - <View max-height="100" padding="0" margin="0" background-color=""> - <View margin="2" padding="" background-color="00000000" flex-direction="column" - flex-grow="0.75"> - <View flex-grow="0.333" background-color="00000000"/> - <TitleComp background-color="00000000" title="Chow Tape Model" font="28" - padding="3" flex-grow="1.0"/> - <InfoComp background-color="00000000" text1="FFEAA92C" flex-grow="0.7" - padding="0" margin="5" border=""/> - <View background-color="00000000" flex-grow="0.33"/> - </View> - <Plot source="scope" plot-color="FFEAA92C" padding="0" background-color="33000000" - plot-decay="0.0" plot-fill-color="FFFFFFFF"/> - </View> - <View padding="0" margin="" background-color="" lookAndFeel=""> - <View display="tabbed" padding="0" background-color="FF31323A" lookAndFeel="MyLNF"> - <View flex-direction="column" tab-color="" background-color="FF31323A" - padding="0" tab-caption="Gain"> - <Slider caption="Input Gain [dB]" parameter="ingain" class="Slider" name="Input Gain" - padding="0" margin="0" tooltip="Sets the input gain to the tape model in Decibels."/> - <Slider caption="Dry/Wet" parameter="drywet" class="Slider" tooltip="Sets dry/wet mix of the entire plugin." - padding="0" margin="0" name="Dry/Wet" slider-track="FF0BBDC2"/> - <Slider caption="Output Gain [dB]" parameter="outgain" class="Slider" - padding="0" margin="0" name="Output Gain" tooltip="Sets the output gain from the tape model in Decibels."/> - </View> - <View flex-direction="column" tab-color="" background-color="FF31323A" - padding="0" tab-caption="Filters" margin="0"> - <Slider caption="Low Cut" parameter="ifilt_low" class="Slider" name="Low Cut" - tooltip="Applies a low cut filter before applying tape processing."/> - <Slider caption="High Cut" parameter="ifilt_high" class="Slider" name="High Cut" - tooltip="Applies a high cut filter before applying tape processing."/> - <TextButton parameter="ifilt_makeup" text="Makeup" background-color="00000000" - margin="0" padding="5" button-color="00000000" flex-grow="0.35" - button-on-color="FF8B3232" lookAndFeel="SpeedButtonLNF" name="Makeup" - tooltip="Adds the signal cut out by the cut filters back to the processed signal."/> - <PowerButton background-color="00000000" max-height="25" min-height="20" margin="0" - padding="0" button-color="ff595c6b" button-on-color="FFEAA92C" - parameter="ifilt_onoff" name="Filters On/Off" tooltip="Turns the pre-processing filters on or off."/> - </View> - </View> - <View display="tabbed" padding="0" background-color="FF31323A" lookAndFeel="MyLNF"> - <View flex-direction="column" tab-color="" background-color="FF31323A" - padding="0" tab-caption="Tape" margin="0"> - <View margin="0" padding="0" flex-grow="0.05" background-color="00000000"/> - <Slider caption="Bias" parameter="width" class="Slider" name="Bias" padding="0" - margin="0" tooltip="Controls the amount of bias used by the tape recorder. Turning down the bias can create &quot;deadzone&quot; distortion."/> - <Slider caption="Saturation" parameter="sat" class="Slider" name="Saturation" - padding="0" margin="0" tooltip="Controls the amount of tape saturation applied to the signal."/> - <Slider caption="Drive" parameter="drive" class="Slider" name="Drive" - padding="0" margin="0" tooltip="Controls the amount of amplification done during the tape magnetisation process. Note that unlike the &quot;Input Gain&quot;, this amplification is highly nonlinear."/> - <PowerButton flex-grow="1.0" margin="0" padding="0" background-color="00000000" - button-on-color="FFEAA92C" min-height="20" max-height="25" button-color="ff595c6b" - parameter="hyst_onoff" name="Tape On/Off" tooltip="Turns the tape processing on or off."/> - </View> - <View flex-direction="column" tab-color="" background-color="FF31323A" - padding="0" tab-caption="Tone" margin="0"> - <View margin="0" padding="0" flex-grow="0.05" background-color="00000000"/> - <Slider caption="Treble" parameter="h_treble" class="Slider" name="Treble" - padding="0" margin="0" tooltip="Controls the treble response of the pre/post-emphasis filters."/> - <Slider caption="Bass" parameter="h_bass" class="Slider" name="Bass" - padding="0" margin="0" tooltip="Controls the bass response of the pre/post-emphasis filters."/> - <Slider caption="Frequency" parameter="h_tfreq" class="Slider" name="Transition Frequency" - padding="0" margin="0" tooltip="Controls the transition frequency between the bass and treble sections of the EQ."/> - <PowerButton max-height="25" min-height="20" margin="0" padding="0" background-color="00000000" - button-color="ff595c6b" button-on-color="FFEAA92C" parameter="tone_onoff" - name="Tone On/Off" tooltip="Turns the tone control processing on or off."/> - </View> - </View> - <View display="tabbed" padding="0" background-color="FF31323A" flex-grow="1.5" - lookAndFeel="MyLNF"> - <View flex-direction="column" tab-caption="Loss" tab-color="" background-color="FF31323A" - padding="0" margin="0"> - <Slider caption="Gap [microns]" parameter="gap" slider-type="linear-horizontal" - class="Slider" padding="0" slider-background="ff595c6b" slider-track="ff9cbcbd" - name="Gap" tooltip="Sets the width of the playhead gap. Certain frequencies that resonate with the gap width will be emphasized." - slidertext-height="18" caption-placement="top-left"/> - <Slider caption="Thickness [microns]" parameter="thick" class="Slider" - slider-type="linear-horizontal" padding="0" slider-background="ff595c6b" - slider-track="ff9cbcbd" name="Thickness" tooltip="Sets the thickness of the tape. Thicker tape has a more muted high-frequency response." - caption-placement="top-left"/> - <Slider caption="Spacing [microns]" parameter="spacing" slider-type="linear-horizontal" - class="Slider" padding="0" slider-background="ff595c6b" slider-track="ff9cbcbd" - name="Spacing" tooltip="Sets the spacing between the tape and the playhead. A larger spacing means more high frequency signal is lost during playback." - caption-placement="top-left"/> - <Slider caption="Azimuth [degrees]" parameter="azimuth" slider-type="linear-horizontal" - class="Slider" padding="0" slider-background="ff595c6b" slider-track="ff9cbcbd" - name="Azimuth" tooltip="Sets the azimuth angle between the playhead and the tape. This can create a stereo widening effect at higher tape speeds." - caption-placement="top-left"/> - <Slider caption="Speed [ips]" parameter="speed" slider-type="linear-horizontal" - class="Slider" padding="0" slider-background="ff595c6b" slider-track="ff9cbcbd" - name="Speed" tooltip="Sets the speed of the tape as it affects the playhead loss effects. Note that this control does not affect the wow/flutter processing." - caption-placement="top-left"/> - <View flex-grow="0.53" margin="0" padding="2" background-color="00000000"> - <TextButton margin="0" padding="2" text="3.75" button-color="00000000" background-color="00000000" - onClick="set_speed_3.75" lookAndFeel="SpeedButtonLNF" button-on-color="00000000" - name="3.75 ips" tooltip="Snaps the tape speed to 3.75 inches per second."/> - <TextButton text="7.5" margin="0" padding="2" button-color="00000000" background-color="00000000" - onClick="set_speed_7.50" lookAndFeel="SpeedButtonLNF" button-on-color="00000000" - name="7.5 ips" tooltip="Snaps the tape speed to 7.5 inches per second."/> - <TextButton margin="0" padding="2" text="15" button-color="00000000" button-on-color="00000000" - background-color="00000000" onClick="set_speed_15.00" lookAndFeel="SpeedButtonLNF" - name="15 ips" tooltip="Snaps the tape speed to 15 inches per second."/> - <TextButton margin="0" padding="2" background-color="00000000" onClick="set_speed_30.00" - lookAndFeel="SpeedButtonLNF" text="30" button-color="00000000" - button-on-color="00000000" name="30 ips" tooltip="Snaps the tape speed to 30 inches per second."/> - </View> - <View flex-grow="0.01" background-color="00000000"/> - <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" - min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" - parameter="loss_onoff" name="Loss On/Off" tooltip="Turns the loss filters on or off."/> - </View> - <View tab-caption="Degrade" padding="0" flex-direction="column" background-color="FF31323A" - margin="0"> - <View margin="0" padding="0" flex-grow="0.15" background-color="00000000"/> - <Slider parameter="deg_depth" caption="Depth" class="Slider" name="Depth" - tooltip="Sets the depth of the tape degradation." - margin="0" slider-type="linear-horizontal" max-height="70"/> - <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> - <Slider caption="Amount" parameter="deg_amt" class="Slider" name="Amount" - margin="0" tooltip="Sets the amount of the tape that is degraded. At large values all of the tape will be affected, at small values only some sections will be affected." - slider-type="linear-horizontal" max-height="70"/> - <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> - <Slider parameter="deg_var" caption="Variance" class="Slider" name="Variance" - margin="0" tooltip="Sets the variance of the tape degradation. Use lower values for uniform degradation, or higher values for variation across different sections of tape." - slider-type="linear-horizontal" max-height="70"/> - <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> - <Slider parameter="deg_env" caption="Envelope" class="Slider" name="Envelope" - margin="0" tooltip="Sets the amount of amplitude envelope applied to the tape degradation. At 0, the degradation will have no envelope." - slider-type="linear-horizontal" max-height="70"/> - <View margin="0" padding="0" flex-grow="0.15" background-color="00000000"/> - <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" - min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" - parameter="deg_onoff" name="Degrade On/Off" tooltip="Turns the degradation processing on or off."/> - </View> - <View tab-caption="CHEW" padding="0" flex-direction="column" background-color="FF31323A" - margin="0"> - <View margin="0" padding="0" flex-grow="0.05" background-color="00000000"/> - <Slider parameter="chew_depth" caption="Depth" padding="0" margin="0" - class="Slider" name="Chew Depth" tooltip="Controls how intensely the tape has been chewed up."/> - <Slider caption="Frequency" parameter="chew_freq" padding="0" margin="0" - class="Slider" name="Chew Frequency" tooltip="Controls the amount of time in between chewed-up sections of tape."/> - <Slider caption="Variance" parameter="chew_var" padding="0" margin="0" - class="Slider" name="Chew Variance" tooltip="Controls the amount of variance in the chew frequency."/> - <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" - min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" - parameter="chew_onoff" name="Chew On/Off" tooltip="Turns the chew processing on or off."/> - </View> - </View> - <View display="tabbed" padding="0" margin="2" background-color="FF31323A" lookAndFeel="MyLNF"> - <View tab-caption="Flutter" flex-direction="column" background-color="FF31323A"> - <FlutterMenu margin="0" padding="0" background-color="00000000" - max-height="30" name="Flutter Sync" tooltip="Snaps the flutter rate to a synchronized value."/> - <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> - <Slider caption="Depth" parameter="depth" max-height="150" class="Slider" - name="Flutter Depth" tooltip="Sets depth of the tape flutter." - margin="0" padding="0"/> - <Slider caption="Rate" parameter="rate" class="Slider" max-height="150" - name="Flutter Rate" tooltip="Sets the rate of the tape flutter." - margin="0" padding="0"/> - <Plot source="flutter" plot-decay="0.8" background-color="FF1E1F22" - flex-grow="0.8" plot-color="FFEAA92C" plot-fill-color="CC8B3232"/> - <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" - min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" - parameter="flutter_onoff" name="Wow/Flutter On/Off" tooltip="Turns the wow and flutter processing on or off."/> - </View> - <View tab-caption="Wow" flex-direction="column" background-color="FF31323A" padding="0" margin="3"> - <WowMenu margin="0" padding="0" background-color="00000000" - max-height="30" name="Wow Sync" tooltip="Snaps the wow rate to a synchronized value."/> - <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> - <Slider caption="Depth" parameter="wow_depth" max-height="150" class="Slider" - name="Wow Depth" tooltip="Sets the depth of the tape wow." margin="0" - padding="0" slider-type="linear-horizontal"/> - <Slider caption="Rate" parameter="wow_rate" class="Slider" max-height="150" - name="Wow Rate" tooltip="Sets the rate of the tape wow." margin="0" - padding="0" slider-type="linear-horizontal"/> - <Slider caption="Variance" parameter="wow_var" class="Slider" max-height="150" - name="Wow Variance" tooltip="Sets the amount of variance in the tape wow." margin="0" - padding="0" slider-type="linear-horizontal"/> - <Slider caption="Drift" parameter="wow_drift" class="Slider" max-height="150" - name="Wow Drift" tooltip="Sets the amount of drift in the tape wow." margin="0" - padding="0" slider-type="linear-horizontal"/> - <Plot source="wow" plot-decay="0.8" flex-grow="1.45" background-color="FF1E1F22" - plot-color="FFEAA92C" plot-fill-color="CC8B3232"/> - <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" - min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" - parameter="flutter_onoff" name="Wow/Flutter On/Off" tooltip="Turns the wow and flutter processing on or off."/> - </View> - </View> - </View> - <TooltipComp flex-grow="0.15" background-color="00000000" tooltip-name="FFEAA92C" - tooltip-text="FFFFFFFF"/> - <View max-height="35" margin="0" padding="0" background-color="FF31323A" - flex-grow="0.1"> - <View background-color="00000000" flex-grow="0.1"/> - <ComboBox caption="Oversampling" parameter="os" class="Slider" caption-size="0" - padding="0" combo-text="FFEAA92C" combo-background="00000000" - max-height="100" margin="" lookAndFeel="ComboBoxLNF" name="Oversampling" - tooltip="Sets the amount of oversampling used for the hysteresis processing. More oversampling will reduce aliasing artifacts, but requires more CPU resources."/> - <ComboBox lookAndFeel="ComboBoxLNF" padding="0" border="0" background-color="00000000" - name="Hysteresis Mode" caption="Hysteresis Mode" caption-size="0" - combo-text="FFEAA92C" caption-color="FFFFFFFF" max-height="100" - margin="" parameter="mode" combo-background="00000000" tooltip="Selects the mode to use for hysteresis processing. Choose between 2nd/4th order Runge-Kutta method, 4 or 8 Newton-Raphson iterations, or revert to version 1.0."/> - <View flex-grow="0.1" background-color="00000000"/> - <ComboBox lookAndFeel="ComboBoxLNF" padding="0" border="0" background-color="00000000" - name="Mix Group" caption="Mix Group" caption-size="0" flex-grow="0.85" - combo-text="FFEAA92C" caption-color="FFFFFFFF" max-height="100" - margin="0" parameter="mix_group" combo-background="00000000" - tooltip="Adds this plugin to a mix group. When the plugin is added to a group, the group parameters will be copied to this plugin, and their parameters will remain in sync."/> - <MixGroupViz flex-grow="0.3" margin="5" padding="0" background-color="00000000"/> - <presets margin="5" padding="0" background-color="00000000" border-color="595C6B" - radius="" border="" lookAndFeel="PresetsLNF" flex-grow="1.9" - max-height="100"/> - </View> - </View> -</magic> +<?xml version="1.0" encoding="UTF-8"?> + +<magic> + <Styles> + <Style name="default"> + <Nodes/> + <Classes> + <plot-view border="2" background-color="black" border-color="silver" display="contents"/> + <nomargin margin="0" padding="0" border="0"/> + <group margin="5" padding="5" border="2" flex-direction="column"/> + <Slider background-color="00000000" caption-color="FFFFFFFF" slider-text-outline="00000000" + slider-type="rotary-horizontal-vertical" slider-textbox="textbox-below" + lookAndFeel="MyLNF" slider-background="ff595c6b" slider-track="ff9cbcbd" + slidertext-width="80" slidertext-height="17" caption-size="21.25"> + <media/> + </Slider> + </Classes> + <Types> + <Slider border="0" slider-type="rotary-horizontal-vertical" slider-textbox="textbox-below"/> + <ToggleButton border="0" max-height="50" caption-size="0" text="Active"/> + <TextButton border="0" max-height="50" caption-size="0"/> + <ComboBox border="0" max-height="50" caption-size="0"/> + <Plot border="0" margin="0" padding="0" background-color="00000000" + radius="0"/> + <XYDragComponent border="0" margin="0" padding="0" background-color="00000000" + radius="0"/> + </Types> + </Style> + </Styles> + <View id="root" resizable="1" resize-corner="1" flex-direction="column" + padding="0" width="580" height="620" background-color="FF8B3232" + background-image="Background_svg" image-placement="stretch"> + <View max-height="100" padding="0" margin="0" background-color=""> + <View margin="2" padding="" background-color="00000000" flex-direction="column" + flex-grow="0.75"> + <View flex-grow="0.333" background-color="00000000"/> + <TitleComp background-color="00000000" title="Chow Tape Model" font="28" + padding="3" flex-grow="1.0"/> + <InfoComp background-color="00000000" text1="FFEAA92C" flex-grow="0.7" + padding="0" margin="5" border=""/> + <View background-color="00000000" flex-grow="0.33"/> + </View> + <Plot source="scope" plot-color="FFEAA92C" padding="0" background-color="33000000" + plot-decay="0.0" plot-fill-color="FFFFFFFF"/> + </View> + <View padding="0" margin="" background-color="" lookAndFeel=""> + <View display="tabbed" padding="0" background-color="FF31323A" lookAndFeel="MyLNF"> + <View flex-direction="column" tab-color="" background-color="FF31323A" + padding="0" tab-caption="Gain"> + <Slider caption="Input Gain [dB]" parameter="ingain" class="Slider" name="Input Gain" + padding="0" margin="0" tooltip="Sets the input gain to the tape model in Decibels."/> + <Slider caption="Dry/Wet" parameter="drywet" class="Slider" tooltip="Sets dry/wet mix of the entire plugin." + padding="0" margin="0" name="Dry/Wet" slider-track="FF0BBDC2"/> + <Slider caption="Output Gain [dB]" parameter="outgain" class="Slider" + padding="0" margin="0" name="Output Gain" tooltip="Sets the output gain from the tape model in Decibels."/> + </View> + <View flex-direction="column" tab-color="" background-color="FF31323A" + padding="0" tab-caption="Filters" margin="0"> + <Slider caption="Low Cut" parameter="ifilt_low" class="Slider" name="Low Cut" + tooltip="Applies a low cut filter before applying tape processing."/> + <Slider caption="High Cut" parameter="ifilt_high" class="Slider" name="High Cut" + tooltip="Applies a high cut filter before applying tape processing."/> + <TextButton parameter="ifilt_makeup" text="Makeup" background-color="00000000" + margin="0" padding="5" button-color="FF33343D" flex-grow="0.35" + button-on-color="FFB41717" lookAndFeel="LookAndFeel_V3" name="Makeup" + tooltip="Adds the signal cut out by the cut filters back to the processed signal." + button-off-text="FFFFFFFF" button-on-text="FFFFFFFF"/> + <PowerButton background-color="00000000" max-height="25" min-height="20" margin="0" + padding="0" button-color="ff595c6b" button-on-color="FFEAA92C" + parameter="ifilt_onoff" name="Filters On/Off" tooltip="Turns the pre-processing filters on or off."/> + </View> + </View> + <View display="tabbed" padding="0" background-color="FF31323A" lookAndFeel="MyLNF"> + <View flex-direction="column" tab-color="" background-color="FF31323A" + padding="0" tab-caption="Tape" margin="0"> + <View margin="0" padding="0" flex-grow="0.05" background-color="00000000"/> + <Slider caption="Bias" parameter="width" class="Slider" name="Bias" padding="0" + margin="0" tooltip="Controls the amount of bias used by the tape recorder. Turning down the bias can create &quot;deadzone&quot; distortion."/> + <Slider caption="Saturation" parameter="sat" class="Slider" name="Saturation" + padding="0" margin="0" tooltip="Controls the amount of tape saturation applied to the signal."/> + <Slider caption="Drive" parameter="drive" class="Slider" name="Drive" + padding="0" margin="0" tooltip="Controls the amount of amplification done during the tape magnetisation process. Note that unlike the &quot;Input Gain&quot;, this amplification is highly nonlinear."/> + <PowerButton flex-grow="1.0" margin="0" padding="0" background-color="00000000" + button-on-color="FFEAA92C" min-height="20" max-height="25" button-color="ff595c6b" + parameter="hyst_onoff" name="Tape On/Off" tooltip="Turns the tape processing on or off."/> + </View> + <View flex-direction="column" tab-color="" background-color="FF31323A" + padding="0" tab-caption="Tone" margin="0"> + <View margin="0" padding="0" flex-grow="0.05" background-color="00000000"/> + <Slider caption="Treble" parameter="h_treble" class="Slider" name="Treble" + padding="0" margin="0" tooltip="Controls the treble response of the pre/post-emphasis filters."/> + <Slider caption="Bass" parameter="h_bass" class="Slider" name="Bass" + padding="0" margin="0" tooltip="Controls the bass response of the pre/post-emphasis filters."/> + <Slider caption="Frequency" parameter="h_tfreq" class="Slider" name="Transition Frequency" + padding="0" margin="0" tooltip="Controls the transition frequency between the bass and treble sections of the EQ."/> + <PowerButton max-height="25" min-height="20" margin="0" padding="0" background-color="00000000" + button-color="ff595c6b" button-on-color="FFEAA92C" parameter="tone_onoff" + name="Tone On/Off" tooltip="Turns the tone control processing on or off."/> + </View> + </View> + <View display="tabbed" padding="0" background-color="FF31323A" flex-grow="1.5" + lookAndFeel="MyLNF"> + <View flex-direction="column" tab-caption="Loss" tab-color="" background-color="FF31323A" + padding="0" margin="0"> + <Slider caption="Gap [microns]" parameter="gap" slider-type="linear-horizontal" + class="Slider" padding="0" slider-background="ff595c6b" slider-track="ff9cbcbd" + name="Gap" tooltip="Sets the width of the playhead gap. Certain frequencies that resonate with the gap width will be emphasized." + slidertext-height="18" caption-placement="top-left"/> + <Slider caption="Thickness [microns]" parameter="thick" class="Slider" + slider-type="linear-horizontal" padding="0" slider-background="ff595c6b" + slider-track="ff9cbcbd" name="Thickness" tooltip="Sets the thickness of the tape. Thicker tape has a more muted high-frequency response." + caption-placement="top-left"/> + <Slider caption="Spacing [microns]" parameter="spacing" slider-type="linear-horizontal" + class="Slider" padding="0" slider-background="ff595c6b" slider-track="ff9cbcbd" + name="Spacing" tooltip="Sets the spacing between the tape and the playhead. A larger spacing means more high frequency signal is lost during playback." + caption-placement="top-left"/> + <Slider caption="Azimuth [degrees]" parameter="azimuth" slider-type="linear-horizontal" + class="Slider" padding="0" slider-background="ff595c6b" slider-track="ff9cbcbd" + name="Azimuth" tooltip="Sets the azimuth angle between the playhead and the tape. This can create a stereo widening effect at higher tape speeds." + caption-placement="top-left"/> + <Slider caption="Speed [ips]" parameter="speed" slider-type="linear-horizontal" + class="Slider" padding="0" slider-background="ff595c6b" slider-track="ff9cbcbd" + name="Speed" tooltip="Sets the speed of the tape as it affects the playhead loss effects. Note that this control does not affect the wow/flutter processing." + caption-placement="top-left"/> + <View flex-grow="0.53" margin="0" padding="2" background-color="00000000"> + <TextButton margin="0" padding="2" text="3.75" button-color="00000000" background-color="00000000" + onClick="set_speed_3.75" lookAndFeel="SpeedButtonLNF" button-on-color="00000000" + name="3.75 ips" tooltip="Snaps the tape speed to 3.75 inches per second."/> + <TextButton text="7.5" margin="0" padding="2" button-color="00000000" background-color="00000000" + onClick="set_speed_7.50" lookAndFeel="SpeedButtonLNF" button-on-color="00000000" + name="7.5 ips" tooltip="Snaps the tape speed to 7.5 inches per second."/> + <TextButton margin="0" padding="2" text="15" button-color="00000000" button-on-color="00000000" + background-color="00000000" onClick="set_speed_15.00" lookAndFeel="SpeedButtonLNF" + name="15 ips" tooltip="Snaps the tape speed to 15 inches per second."/> + <TextButton margin="0" padding="2" background-color="00000000" onClick="set_speed_30.00" + lookAndFeel="SpeedButtonLNF" text="30" button-color="00000000" + button-on-color="00000000" name="30 ips" tooltip="Snaps the tape speed to 30 inches per second."/> + </View> + <View flex-grow="0.01" background-color="00000000"/> + <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" + min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" + parameter="loss_onoff" name="Loss On/Off" tooltip="Turns the loss filters on or off."/> + </View> + <View tab-caption="Degrade" padding="0" flex-direction="column" background-color="FF31323A" + margin="0"> + <View flex-direction="column" max-height="140" background-color="FF1E1F22" + flex-grow="2.0" flex-shrink="2.0" padding="0"> + <View max-height="5"/> + <Slider parameter="deg_depth" caption="Depth" class="Slider" name="Depth" + tooltip="Sets the depth of the tape degradation." slider-type="linear-horizontal" + max-height="70" margin="0" min-height="0" slidertext-width="80" + flex-grow="2.5" flex-shrink="2.5" padding=""/> + <TextButton flex-align-self="auto" parameter="deg_point1x" max-height="160" background-color="FF31323A" + button-on-color="FFB41717" button-color="FF33343D" text="0.1x" + button-off-text="FFFFFFFF" button-on-text="FFFFFFFF" height="" + width="" min-height="0.0" padding="0" caption-placement="centred" + min-width="" margin="5" caption="" flex-grow="1.0" flex-shrink="0.1" + name="0.1x" lookAndFeel="LookAndFeel_V3" tooltip="Scales the Depth value by 0.1 to allow for more subtle degradation"/> + </View> + <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> + <Slider caption="Amount" parameter="deg_amt" class="Slider" name="Amount" + margin="0" tooltip="Sets the amount of the tape that is degraded. At large values all of the tape will be affected, at small values only some sections will be affected." + slider-type="linear-horizontal" max-height="70"/> + <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> + <Slider parameter="deg_var" caption="Variance" class="Slider" name="Variance" + margin="0" tooltip="Sets the variance of the tape degradation. Use lower values for uniform degradation, or higher values for variation across different sections of tape." + slider-type="linear-horizontal" max-height="70"/> + <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> + <Slider parameter="deg_env" caption="Envelope" class="Slider" name="Envelope" + margin="0" tooltip="Sets the amount of amplitude envelope applied to the tape degradation. At 0, the degradation will have no envelope." + slider-type="linear-horizontal" max-height="70"/> + <View margin="0" padding="0" flex-grow="0.15" background-color="00000000"/> + <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" + min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" + parameter="deg_onoff" name="Degrade On/Off" tooltip="Turns the degradation processing on or off."/> + </View> + <View tab-caption="CHEW" padding="0" flex-direction="column" background-color="FF31323A" + margin="0"> + <View margin="0" padding="0" flex-grow="0.05" background-color="00000000"/> + <Slider parameter="chew_depth" caption="Depth" padding="0" margin="0" + class="Slider" name="Chew Depth" tooltip="Controls how intensely the tape has been chewed up."/> + <Slider caption="Frequency" parameter="chew_freq" padding="0" margin="0" + class="Slider" name="Chew Frequency" tooltip="Controls the amount of time in between chewed-up sections of tape."/> + <Slider caption="Variance" parameter="chew_var" padding="0" margin="0" + class="Slider" name="Chew Variance" tooltip="Controls the amount of variance in the chew frequency."/> + <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" + min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" + parameter="chew_onoff" name="Chew On/Off" tooltip="Turns the chew processing on or off."/> + </View> + </View> + <View display="tabbed" padding="0" margin="2" background-color="FF31323A" + lookAndFeel="MyLNF"> + <View tab-caption="Flutter" flex-direction="column" background-color="FF31323A"> + <FlutterMenu margin="0" padding="0" background-color="00000000" max-height="30" + name="Flutter Sync" tooltip="Snaps the flutter rate to a synchronized value."/> + <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> + <Slider caption="Depth" parameter="depth" max-height="150" class="Slider" + name="Flutter Depth" tooltip="Sets depth of the tape flutter." + margin="0" padding="0"/> + <Slider caption="Rate" parameter="rate" class="Slider" max-height="150" + name="Flutter Rate" tooltip="Sets the rate of the tape flutter." + margin="0" padding="0"/> + <Plot source="flutter" plot-decay="0.8" background-color="FF1E1F22" + flex-grow="0.8" plot-color="FFEAA92C" plot-fill-color="CC8B3232"/> + <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" + min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" + parameter="flutter_onoff" name="Wow/Flutter On/Off" tooltip="Turns the wow and flutter processing on or off."/> + </View> + <View tab-caption="Wow" flex-direction="column" background-color="FF31323A" + padding="0" margin="3"> + <WowMenu margin="0" padding="0" background-color="00000000" max-height="30" + name="Wow Sync" tooltip="Snaps the wow rate to a synchronized value."/> + <View margin="0" padding="0" flex-grow="0.1" background-color="00000000"/> + <Slider caption="Depth" parameter="wow_depth" max-height="150" class="Slider" + name="Wow Depth" tooltip="Sets the depth of the tape wow." margin="0" + padding="0" slider-type="linear-horizontal"/> + <Slider caption="Rate" parameter="wow_rate" class="Slider" max-height="150" + name="Wow Rate" tooltip="Sets the rate of the tape wow." margin="0" + padding="0" slider-type="linear-horizontal"/> + <Slider caption="Variance" parameter="wow_var" class="Slider" max-height="150" + name="Wow Variance" tooltip="Sets the amount of variance in the tape wow." + margin="0" padding="0" slider-type="linear-horizontal"/> + <Slider caption="Drift" parameter="wow_drift" class="Slider" max-height="150" + name="Wow Drift" tooltip="Sets the amount of drift in the tape wow." + margin="0" padding="0" slider-type="linear-horizontal"/> + <Plot source="wow" plot-decay="0.8" flex-grow="1.45" background-color="FF1E1F22" + plot-color="FFEAA92C" plot-fill-color="CC8B3232"/> + <PowerButton margin="0" padding="0" background-color="00000000" max-height="25" + min-height="20" button-color="ff595c6b" button-on-color="FFEAA92C" + parameter="flutter_onoff" name="Wow/Flutter On/Off" tooltip="Turns the wow and flutter processing on or off."/> + </View> + </View> + </View> + <TooltipComp flex-grow="0.15" background-color="00000000" tooltip-name="FFEAA92C" + tooltip-text="FFFFFFFF"/> + <View max-height="35" margin="0" padding="0" background-color="FF31323A" + flex-grow="0.1"> + <View background-color="00000000" flex-grow="0.1"/> + <ComboBox caption="Oversampling" parameter="os" class="Slider" caption-size="0" + padding="0" combo-text="FFEAA92C" combo-background="00000000" + max-height="100" margin="" lookAndFeel="ComboBoxLNF" name="Oversampling" + tooltip="Sets the amount of oversampling used for the hysteresis processing. More oversampling will reduce aliasing artifacts, but requires more CPU resources."/> + <ComboBox lookAndFeel="ComboBoxLNF" padding="0" border="0" background-color="00000000" + name="Hysteresis Mode" caption="Hysteresis Mode" caption-size="0" + combo-text="FFEAA92C" caption-color="FFFFFFFF" max-height="100" + margin="" parameter="mode" combo-background="00000000" tooltip="Selects the mode to use for hysteresis processing. Choose between 2nd/4th order Runge-Kutta method, 4 or 8 Newton-Raphson iterations, or revert to version 1.0."/> + <View flex-grow="0.1" background-color="00000000"/> + <ComboBox lookAndFeel="ComboBoxLNF" padding="0" border="0" background-color="00000000" + name="Mix Group" caption="Mix Group" caption-size="0" flex-grow="0.85" + combo-text="FFEAA92C" caption-color="FFFFFFFF" max-height="100" + margin="0" parameter="mix_group" combo-background="00000000" + tooltip="Adds this plugin to a mix group. When the plugin is added to a group, the group parameters will be copied to this plugin, and their parameters will remain in sync."/> + <MixGroupViz flex-grow="0.3" margin="5" padding="0" background-color="00000000"/> + <presets margin="5" padding="0" background-color="00000000" border-color="595C6B" + radius="" border="" lookAndFeel="PresetsLNF" flex-grow="1.9" + max-height="100"/> + </View> + </View> +</magic> + diff --git a/Plugin/Source/GUI/OnOffManager.cpp b/Plugin/Source/GUI/OnOffManager.cpp @@ -9,7 +9,7 @@ static const std::unordered_map<String, StringArray> triggerMap { { String ("tone_onoff"), StringArray ({ "Bass", "Treble", "Transition Frequency" }) }, { String ("loss_onoff"), StringArray ({ "Gap", "Thickness", "Spacing", "Speed", "3.75 ips", "7.5 ips", "15 ips", "30 ips" }) }, { String ("chew_onoff"), StringArray ({ "Chew Depth", "Chew Frequency", "Chew Variance" }) }, - { String ("deg_onoff"), StringArray ({ "Depth", "Amount", "Variance", "Envelope" }) }, + { String ("deg_onoff"), StringArray ({ "Depth", "Amount", "Variance", "Envelope", "0.1x" }) }, { String ("flutter_onoff"), StringArray ({ "Flutter Depth", "Flutter Rate", "Wow Depth", "Wow Rate", "Wow Variance", "Wow Drift" }) }, }; diff --git a/Plugin/Source/Processors/Degrade/DegradeProcessor.cpp b/Plugin/Source/Processors/Degrade/DegradeProcessor.cpp @@ -2,6 +2,7 @@ DegradeProcessor::DegradeProcessor (AudioProcessorValueTreeState& vts) { + point1xParam = vts.getRawParameterValue ("deg_point1x"); onOffParam = vts.getRawParameterValue ("deg_onoff"); depthParam = vts.getRawParameterValue ("deg_depth"); amtParam = vts.getRawParameterValue ("deg_amt"); @@ -11,6 +12,7 @@ DegradeProcessor::DegradeProcessor (AudioProcessorValueTreeState& vts) void DegradeProcessor::createParameterLayout (std::vector<std::unique_ptr<RangedAudioParameter>>& params) { + params.push_back (std::make_unique<AudioParameterBool> ("deg_point1x", "Degrade Point1x", false)); params.push_back (std::make_unique<AudioParameterBool> ("deg_onoff", "Degrade On/Off", false)); params.push_back (std::make_unique<AudioParameterFloat> ("deg_depth", "Degrade Depth", 0.0f, 1.0f, 0.0f)); params.push_back (std::make_unique<AudioParameterFloat> ("deg_amt", "Degrade Amount", 0.0f, 1.0f, 0.0f)); @@ -20,12 +22,15 @@ void DegradeProcessor::createParameterLayout (std::vector<std::unique_ptr<Ranged void DegradeProcessor::cookParams() { + auto point1x = static_cast<bool> (point1xParam->load()); + auto depthValue = point1x ? depthParam->load() * 0.1f : depthParam->load(); + float freqHz = 200.0f * powf (20000.0f / 200.0f, 1.0f - *amtParam); - float gainDB = -24.0f * *depthParam; + float gainDB = -24.0f * depthValue; for (int ch = 0; ch < 2; ++ch) { - noiseProc[ch].setGain (0.5f * *depthParam * *amtParam); + noiseProc[ch].setGain (0.5f * depthValue * *amtParam); filterProc[ch].setFreq (jmin (freqHz + (*varParam * (freqHz / 0.6f) * (random.nextFloat() - 0.5f)), 0.49f * fs)); } diff --git a/Plugin/Source/Processors/Degrade/DegradeProcessor.h b/Plugin/Source/Processors/Degrade/DegradeProcessor.h @@ -18,6 +18,7 @@ public: void processBlock (AudioBuffer<float>& buffer, MidiBuffer& midi); private: + std::atomic<float>* point1xParam = nullptr; std::atomic<float>* onOffParam = nullptr; std::atomic<float>* depthParam = nullptr; std::atomic<float>* amtParam = nullptr;