Skip to content

Commit

Permalink
Update to Latest Airwin
Browse files Browse the repository at this point in the history
  • Loading branch information
baconpaul committed May 10, 2024
1 parent 5c49921 commit 0a54362
Show file tree
Hide file tree
Showing 28 changed files with 6,497 additions and 889 deletions.
2 changes: 1 addition & 1 deletion libs/airwindows
Submodule airwindows updated 605 files
23 changes: 23 additions & 0 deletions res/awpdoc/HighImpact.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# HighImpact is distorted grit and punch without fatness. This is also another little window into Airwindows history, as this is the point where I began putting out the for-pay plugins for free through Patreon. The post is presented in its entirety as a picture of where I was at on April 9, 2017. By now I have put out more than 300 plugins and I'm still going, but this was when I'd done 47 and all the most sought-after ones were still being held back as goals… here is the original post.

Sometimes it’s all in the name.

High Impact has been one of the Airwindows secret weapons for a long time. It’s a pretty basic idea: know how Density distorts and makes audio huge and fat, and Drive distorts and doesn’t make stuff as fat? High Impact answers the question, ‘what if you could distort and not make things fatter AT ALL’.

This is not EQ I’m talking about, though it can come off like EQ depending on what you feed into it. High Impact combines a distortion and anti-distortion circuit to reshape the transfer function of the audio, as follows: crank it up, and quiet subtle samples aren’t turned up much. Then medium samples are turned up a LOT, and then the loudest samples are distorted and hit a wall past which they can’t go. The result is an obvious distort which doesn’t bloat things. It’s a ‘dial-a-rasp’, or ‘dial-a-slam’ for percussive noises, and though the concept is two different kinds of overdrive combined, it’s an Airwindows plugin so it’s not overprocessed, it’s super raw.

That suits this plugin super well, and that’s why the AU-only High Impact has been a secret weapon for many people for years—and now it’s out for Mac and PC VST.

A word about the ‘secret weapon’ thing: I hate that. Do as I do, and communicate openly. Airwindows plugins are not preset things that you hide somewhere to add magic sauce to your mixes. They require intention, and there’s no one right way to use them: Airwindows plugins are like if a certain mic modeler you can rent that offers ‘silky expensive microphone models’ had just a blank ugly faceplate with just one knob, ‘silky’. And you could use it as a guitar stompbox if you wanted, not even a microphone anymore, and it was no longer connected to a ‘magic gear item’ so you’d have to ask, ‘HOW silky does this sound need to be, in my mix?’ because there was no one right answer.

That’s what Airwindows is like. For High Impact, read ‘raspy’ or ‘mean’ or ‘grindy’, whatever describes the sound for you. Now you’ve got an extra parameter: instead of just bass, treble, loud, soft (or even fat and thin) you’ve got ‘aggro’ on a knob. That can relate to any bit of audio you’re working with… and your ‘secret sauce’ is not the plugin, but your sense of taste (or tastelessness) in using and abusing it. So, don’t keep Airwindows plugins a secret weapon. I hate that. Tell people what you’re using, so I can get more supporters and keep doing all this, on a bigger and bigger scale.

Speaking of which, I have a Patreon milestone! As of a couple days ago, I hit $600 a month, and I’ve recently changed that to be the point where I start releasing the Kagi catalog! Now, people sometimes bail as the first of the month rolls around (and also I don’t get paid quite the full amount shown). So, it’s possible this milestone will go poof as we reach May, in which case we’re still waiting. BUT, if the dust settles and it’s still over $600 going into May, I will put out Iron Oxide 4 (the second most popular plugin I have EVER made) as free AU/VST!

(oh my God, I look so young in that video o_O )

If I’m still over $600 when May begins, you get THAT plugin free. My hope is that, as I reach this stage, people get more of an idea of what’s possible out of my Patreon project. All this time, I’ve been putting out more than 47 plugins entirely from the ‘freebie pile’, and not touching the ones that kept me in business a decade. Now, we start to get into the serious ones, the ones worth $50 to a lot of people. I’ve even drawn up a timeline on the Patreon, showing when each plugin will come out if I stay above $600. (if I clear $1000 they go twice as fast and I’ll revise the timeline accordingly!)

Here’s where things REALLY get interesting. Hang on to your DAWs, because we’re about to go full warp drive :)


16 changes: 12 additions & 4 deletions src/ModuleAdd.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,16 @@ int Biquad_unused = AirwinRegistry::registerAirwindow({"Biquad", "Biquads", 45,
int Biquad2_unused = AirwinRegistry::registerAirwindow({"Biquad2", "Biquads", 49, "Biquad2 is the Airwindows biquad filter that's more sweepable and synthy.", airwinconsolidated::Biquad2::kNumParameters, []() { return std::make_unique<airwinconsolidated::Biquad2::Biquad2>(0); }, -1, { }});
#include "autogen_airwin/BiquadDouble.h"
int BiquadDouble_unused = AirwinRegistry::registerAirwindow({"BiquadDouble", "Biquads", 46, "BiquadDouble is a handy Airwindows cascaded biquad filter: steeper roll-off before resonance.", airwinconsolidated::BiquadDouble::kNumParameters, []() { return std::make_unique<airwinconsolidated::BiquadDouble::BiquadDouble>(0); }, -1, { }});
#include "autogen_airwin/BiquadHiLo.h"
int BiquadHiLo_unused = AirwinRegistry::registerAirwindow({"BiquadHiLo", "Unclassified", -1, "", airwinconsolidated::BiquadHiLo::kNumParameters, []() { return std::make_unique<airwinconsolidated::BiquadHiLo::BiquadHiLo>(0); }, -1, { }});
#include "autogen_airwin/BiquadNonLin.h"
int BiquadNonLin_unused = AirwinRegistry::registerAirwindow({"BiquadNonLin", "Biquads", 43, "BiquadNonLin is Capacitor2, but for biquad filtering.", airwinconsolidated::BiquadNonLin::kNumParameters, []() { return std::make_unique<airwinconsolidated::BiquadNonLin::BiquadNonLin>(0); }, -1, { "Latest" }});
#include "autogen_airwin/BiquadOneHalf.h"
int BiquadOneHalf_unused = AirwinRegistry::registerAirwindow({"BiquadOneHalf", "Biquads", 47, "BiquadOneHalf is an interleaved biquad filter like Biquad.", airwinconsolidated::BiquadOneHalf::kNumParameters, []() { return std::make_unique<airwinconsolidated::BiquadOneHalf::BiquadOneHalf>(0); }, -1, { }});
#include "autogen_airwin/BiquadPlus.h"
int BiquadPlus_unused = AirwinRegistry::registerAirwindow({"BiquadPlus", "Biquads", 44, "BiquadPlus is Biquad plus zipper noise suppression! For twiddling the controls.", airwinconsolidated::BiquadPlus::kNumParameters, []() { return std::make_unique<airwinconsolidated::BiquadPlus::BiquadPlus>(0); }, -1, { }});
#include "autogen_airwin/BiquadStack.h"
int BiquadStack_unused = AirwinRegistry::registerAirwindow({"BiquadStack", "Unclassified", -1, "", airwinconsolidated::BiquadStack::kNumParameters, []() { return std::make_unique<airwinconsolidated::BiquadStack::BiquadStack>(0); }, -1, { }});
#include "autogen_airwin/BiquadTriple.h"
int BiquadTriple_unused = AirwinRegistry::registerAirwindow({"BiquadTriple", "Biquads", 48, "BiquadTriple is a handy Airwindows cascaded biquad filter: steeper roll-off before resonance.", airwinconsolidated::BiquadTriple::kNumParameters, []() { return std::make_unique<airwinconsolidated::BiquadTriple::BiquadTriple>(0); }, -1, { }});
#include "autogen_airwin/BitGlitter.h"
Expand Down Expand Up @@ -210,10 +214,6 @@ int ConsoleMDChannel_unused = AirwinRegistry::registerAirwindow({"ConsoleMDChann
int ConsoleXBuss_unused = AirwinRegistry::registerAirwindow({"ConsoleXBuss", "Unclassified", -1, "", airwinconsolidated::ConsoleXBuss::kNumParameters, []() { return std::make_unique<airwinconsolidated::ConsoleXBuss::ConsoleXBuss>(0); }, -1, { }});
#include "autogen_airwin/ConsoleXChannel.h"
int ConsoleXChannel_unused = AirwinRegistry::registerAirwindow({"ConsoleXChannel", "Unclassified", -1, "", airwinconsolidated::ConsoleXChannel::kNumParameters, []() { return std::make_unique<airwinconsolidated::ConsoleXChannel::ConsoleXChannel>(0); }, -1, { }});
#include "autogen_airwin/ConsoleXSubIn.h"
int ConsoleXSubIn_unused = AirwinRegistry::registerAirwindow({"ConsoleXSubIn", "Unclassified", -1, "", airwinconsolidated::ConsoleXSubIn::kNumParameters, []() { return std::make_unique<airwinconsolidated::ConsoleXSubIn::ConsoleXSubIn>(0); }, -1, { }});
#include "autogen_airwin/ConsoleXSubOut.h"
int ConsoleXSubOut_unused = AirwinRegistry::registerAirwindow({"ConsoleXSubOut", "Unclassified", -1, "", airwinconsolidated::ConsoleXSubOut::kNumParameters, []() { return std::make_unique<airwinconsolidated::ConsoleXSubOut::ConsoleXSubOut>(0); }, -1, { }});
#include "autogen_airwin/ContentHideD.h"
int ContentHideD_unused = AirwinRegistry::registerAirwindow({"ContentHideD", "Utility", 367, "ContentHideD mutes audio except for brief glimpses.", airwinconsolidated::ContentHideD::kNumParameters, []() { return std::make_unique<airwinconsolidated::ContentHideD::ContentHideD>(0); }, -1, { "Latest" }});
#include "autogen_airwin/Creature.h"
Expand Down Expand Up @@ -260,6 +260,8 @@ int Discontinuity_unused = AirwinRegistry::registerAirwindow({"Discontinuity", "
int Distance_unused = AirwinRegistry::registerAirwindow({"Distance", "Filter", 239, "Distance is a sound design or reverb far-away-izer.", airwinconsolidated::Distance::kNumParameters, []() { return std::make_unique<airwinconsolidated::Distance::Distance>(0); }, -1, { }});
#include "autogen_airwin/Distance2.h"
int Distance2_unused = AirwinRegistry::registerAirwindow({"Distance2", "Filter", 238, "Distance2 is a versatile space shaper for creating depth.", airwinconsolidated::Distance2::kNumParameters, []() { return std::make_unique<airwinconsolidated::Distance2::Distance2>(0); }, -1, { "Latest" }});
#include "autogen_airwin/Distance3.h"
int Distance3_unused = AirwinRegistry::registerAirwindow({"Distance3", "Unclassified", -1, "", airwinconsolidated::Distance3::kNumParameters, []() { return std::make_unique<airwinconsolidated::Distance3::Distance3>(0); }, -1, { }});
#include "autogen_airwin/Distortion.h"
int Distortion_unused = AirwinRegistry::registerAirwindow({"Distortion", "Distortion", 125, "Distortion is a slightly dark analog-style distortion with several presets, like Focus.", airwinconsolidated::Distortion::kNumParameters, []() { return std::make_unique<airwinconsolidated::Distortion::Distortion>(0); }, -1, { "Latest" }});
#include "autogen_airwin/DitherFloat.h"
Expand Down Expand Up @@ -492,6 +494,8 @@ int PDChannel_unused = AirwinRegistry::registerAirwindow({"PDChannel", "Consoles
int Pafnuty_unused = AirwinRegistry::registerAirwindow({"Pafnuty", "Unclassified", -1, "Pafnuty is a Chebyshev filter, that adds harmonics.", airwinconsolidated::Pafnuty::kNumParameters, []() { return std::make_unique<airwinconsolidated::Pafnuty::Pafnuty>(0); }, -1, { }});
#include "autogen_airwin/Pafnuty2.h"
int Pafnuty2_unused = AirwinRegistry::registerAirwindow({"Pafnuty2", "Effects", 192, "Pafnuty2 is a Chebyshev filter, that adds harmonics, and fits in the VCV Rack port.", airwinconsolidated::Pafnuty2::kNumParameters, []() { return std::make_unique<airwinconsolidated::Pafnuty2::Pafnuty2>(0); }, -1, { "Latest" }});
#include "autogen_airwin/Parametric.h"
int Parametric_unused = AirwinRegistry::registerAirwindow({"Parametric", "Unclassified", -1, "", airwinconsolidated::Parametric::kNumParameters, []() { return std::make_unique<airwinconsolidated::Parametric::Parametric>(0); }, -1, { }});
#include "autogen_airwin/PaulDither.h"
int PaulDither_unused = AirwinRegistry::registerAirwindow({"PaulDither", "Dithers", 139, "PaulDither is a highpassed TPDF dither. (quieter, airier)", airwinconsolidated::PaulDither::kNumParameters, []() { return std::make_unique<airwinconsolidated::PaulDither::PaulDither>(0); }, -1, { "Recommended" }});
#include "autogen_airwin/PaulWide.h"
Expand Down Expand Up @@ -526,6 +530,8 @@ int Point_unused = AirwinRegistry::registerAirwindow({"Point", "Dynamics", 179,
int Pop_unused = AirwinRegistry::registerAirwindow({"Pop", "Dynamics", 163, "Pop is a crazy overcompressor with a very exaggerated sound.", airwinconsolidated::Pop::kNumParameters, []() { return std::make_unique<airwinconsolidated::Pop::Pop>(0); }, -1, { }});
#include "autogen_airwin/Pop2.h"
int Pop2_unused = AirwinRegistry::registerAirwindow({"Pop2", "Dynamics", 160, "Pop2 adds control and punch to Pop.", airwinconsolidated::Pop2::kNumParameters, []() { return std::make_unique<airwinconsolidated::Pop2::Pop2>(0); }, -1, { "Recommended", "Latest" }});
#include "autogen_airwin/Pop3.h"
int Pop3_unused = AirwinRegistry::registerAirwindow({"Pop3", "Unclassified", -1, "", airwinconsolidated::Pop3::kNumParameters, []() { return std::make_unique<airwinconsolidated::Pop3::Pop3>(0); }, -1, { }});
#include "autogen_airwin/PowerSag.h"
int PowerSag_unused = AirwinRegistry::registerAirwindow({"PowerSag", "Effects", 208, "PowerSag is for emulating power supply limitations in analog modeling.", airwinconsolidated::PowerSag::kNumParameters, []() { return std::make_unique<airwinconsolidated::PowerSag::PowerSag>(0); }, -1, { }});
#include "autogen_airwin/PowerSag2.h"
Expand Down Expand Up @@ -638,6 +644,8 @@ int StereoDoubler_unused = AirwinRegistry::registerAirwindow({"StereoDoubler", "
int StereoEnsemble_unused = AirwinRegistry::registerAirwindow({"StereoEnsemble", "Ambience", 20, "StereoEnsemble is a sort of hyperchorus blast from the past.", airwinconsolidated::StereoEnsemble::kNumParameters, []() { return std::make_unique<airwinconsolidated::StereoEnsemble::StereoEnsemble>(0); }, -1, { "Latest" }});
#include "autogen_airwin/StereoFX.h"
int StereoFX_unused = AirwinRegistry::registerAirwindow({"StereoFX", "Stereo", 299, "StereoFX is an aggressive stereo widener.", airwinconsolidated::StereoFX::kNumParameters, []() { return std::make_unique<airwinconsolidated::StereoFX::StereoFX>(0); }, -1, { "Latest" }});
#include "autogen_airwin/StoneFireComp.h"
int StoneFireComp_unused = AirwinRegistry::registerAirwindow({"StoneFireComp", "Unclassified", -1, "", airwinconsolidated::StoneFireComp::kNumParameters, []() { return std::make_unique<airwinconsolidated::StoneFireComp::StoneFireComp>(0); }, -1, { }});
#include "autogen_airwin/Stonefire.h"
int Stonefire_unused = AirwinRegistry::registerAirwindow({"Stonefire", "Filter", 211, "Stonefire is the non-EQ EQ designed for ConsoleX.", airwinconsolidated::Stonefire::kNumParameters, []() { return std::make_unique<airwinconsolidated::Stonefire::Stonefire>(0); }, -1, { "Recommended", "Latest" }});
#include "autogen_airwin/StudioTan.h"
Expand Down
123 changes: 123 additions & 0 deletions src/autogen_airwin/BiquadHiLo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
/* ========================================
* BiquadHiLo - BiquadHiLo.h
* Copyright (c) airwindows, Airwindows uses the MIT license
* ======================================== */

#ifndef __BiquadHiLo_H
#include "BiquadHiLo.h"
#endif
#include <cmath>
#include <algorithm>
namespace airwinconsolidated::BiquadHiLo {

AudioEffect* createEffectInstance(audioMasterCallback audioMaster) {return new BiquadHiLo(audioMaster);}

BiquadHiLo::BiquadHiLo(audioMasterCallback audioMaster) :
AudioEffectX(audioMaster, kNumPrograms, kNumParameters)
{
A = 0.0;
B = 0.0;

fpdL = 1.0; while (fpdL < 16386) fpdL = rand()*UINT32_MAX;
fpdR = 1.0; while (fpdR < 16386) fpdR = rand()*UINT32_MAX;
//this is reset: values being initialized only once. Startup values, whatever they are.

_canDo.insert("plugAsChannelInsert"); // plug-in can be used as a channel insert effect.
_canDo.insert("plugAsSend"); // plug-in can be used as a send effect.
_canDo.insert("x2in2out");
setNumInputs(kNumInputs);
setNumOutputs(kNumOutputs);
setUniqueID(kUniqueId);
canProcessReplacing(); // supports output replacing
canDoubleReplacing(); // supports double precision processing
programsAreChunks(true);
vst_strncpy (_programName, "Default", kVstMaxProgNameLen); // default program name
}

BiquadHiLo::~BiquadHiLo() {}
VstInt32 BiquadHiLo::getVendorVersion () {return 1000;}
void BiquadHiLo::setProgramName(char *name) {vst_strncpy (_programName, name, kVstMaxProgNameLen);}
void BiquadHiLo::getProgramName(char *name) {vst_strncpy (name, _programName, kVstMaxProgNameLen);}
//airwindows likes to ignore this stuff. Make your own programs, and make a different plugin rather than
//trying to do versioning and preventing people from using older versions. Maybe they like the old one!

static float pinParameter(float data)
{
if (data < 0.0f) return 0.0f;
if (data > 1.0f) return 1.0f;
return data;
}

void BiquadHiLo::setParameter(VstInt32 index, float value) {
switch (index) {
case kParamA: A = value; break;
case kParamB: B = value; break;
default: break; // unknown parameter, shouldn't happen!
}
}

float BiquadHiLo::getParameter(VstInt32 index) {
switch (index) {
case kParamA: return A; break;
case kParamB: return B; break;
default: break; // unknown parameter, shouldn't happen!
} return 0.0; //we only need to update the relevant name, this is simple to manage
}

void BiquadHiLo::getParameterName(VstInt32 index, char *text) {
switch (index) {
case kParamA: vst_strncpy (text, "Highpas", kVstMaxParamStrLen); break;
case kParamB: vst_strncpy (text, "Lowpass", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this is our labels for displaying in the VST host
}

void BiquadHiLo::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
case kParamA: float2string (A, text, kVstMaxParamStrLen); break;
case kParamB: float2string (B, text, kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} //this displays the values and handles 'popups' where it's discrete choices
}

void BiquadHiLo::getParameterLabel(VstInt32 index, char *text) {
switch (index) {
case kParamA: vst_strncpy (text, "", kVstMaxParamStrLen); break;
case kParamB: vst_strncpy (text, "", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
}
}

VstInt32 BiquadHiLo::canDo(char *text)
{ return (_canDo.find(text) == _canDo.end()) ? -1: 1; } // 1 = yes, -1 = no, 0 = don't know

bool BiquadHiLo::getEffectName(char* name) {
vst_strncpy(name, "BiquadHiLo", kVstMaxProductStrLen); return true;
}

VstPlugCategory BiquadHiLo::getPlugCategory() {return kPlugCategEffect;}

bool BiquadHiLo::getProductString(char* text) {
vst_strncpy (text, "airwindows BiquadHiLo", kVstMaxProductStrLen); return true;
}

bool BiquadHiLo::getVendorString(char* text) {
vst_strncpy (text, "airwindows", kVstMaxVendorStrLen); return true;
}
bool BiquadHiLo::parameterTextToValue(VstInt32 index, const char *text, float &value) {
switch(index) {
case kParamA: { auto b = string2float(text, value); return b; break; }
case kParamB: { auto b = string2float(text, value); return b; break; }

}
return false;
}
bool BiquadHiLo::canConvertParameterTextToValue(VstInt32 index) {
switch(index) {
case kParamA: return true;
case kParamB: return true;

}
return false;
}
} // end namespace
Loading

0 comments on commit 0a54362

Please sign in to comment.