1 #include "ADClip7.h"
2 #include "Air.h"
3 #include "Apicolypse.h"
4 #include "BassDrive.h"
5 #include "BitGlitter.h"
6 #include "BlockParty.h"
7 #include "BrightAmbience2.h"
8 #include "BussColors4.h"
9 #include "ButterComp2.h"
10 #include "Capacitor.h"
11 #include "Cojones.h"
12 #include "Compresaturator.h"
13 #include "CrunchyGrooveWear.h"
14 #include "DeBess.h"
15 #include "DeckWrecka.h"
16 #include "DeEss.h"
17 #include "Density.h"
18 #include "DeRez2.h"
19 #include "Drive.h"
20 #include "DrumSlam.h"
21 #include "DustBunny.h"
22 #include "Focus.h"
23 #include "Fracture.h"
24 #include "Galactic.h"
25 #include "GrooveWear.h"
26 #include "HardVacuum.h"
27 #include "Hombre.h"
28 #include "Infinity.h"
29 #include "IronOxide5.h"
30 #include "Logical4.h"
31 #include "Loud.h"
32 #include "MatrixVerb.h"
33 #include "Melt.h"
34 #include "Mojo.h"
35 #include "NCSeventeen.h"
36 #include "Noise.h"
37 #include "OneCornerClip.h"
38 #include "PocketVerbs.h"
39 #include "Point.h"
40 #include "Pop.h"
41 #include "Pressure4.h"
42 #include "PyeWacket.h"
43 #include "SingleEndedTriode.h"
44 #include "Slew.h"
45 #include "Slew2.h"
46 #include "Spiral2.h"
47 #include "StarChild.h"
48 #include "Surge.h"
49 #include "TripleSpread.h"
50 #include "ToTape6.h"
51 #include "UnBox.h"
52 #include "Verbity.h"
53 #include "VariMu.h"
54 #include "VoiceOfTheStarship.h"
55 #include <map>
56 
57 namespace {
58 template<typename T>
create(int id,double sr,int dp)59 std::unique_ptr<AirWinBaseClass> create(int id, double sr, int dp)
60 {
61    auto res = std::make_unique<T>(id);
62    res->sr = sr;
63    res->displayPrecision = dp;
64    return res;
65 }
66 } // anonymous namespace
67 
pluginRegistry()68 std::vector<AirWinBaseClass::Registration> AirWinBaseClass::pluginRegistry()
69 {
70    /*
71     * Static function, only called from audio thread, safe to have a static member here to avoid
72     * rebuild too often.
73     */
74    static std::vector<AirWinBaseClass::Registration> reg;
75 
76    if( ! reg.empty() )
77       return reg;
78 
79    /*
80    ** Register here with streaming ID (which must be increasing and can never change) and display order ID (which can be
81    ** really anything you want) and display name. So basically always add stuff to the end of this list but set the
82    ** display order to whatever you want. The nice thing is the display order doesn't need to be contiguous and the
83    ** order displayed is just a sort. So here I use values in steps of 10 so I can put stuff in between.
84    */
85 
86    // Set up some group names
87    std::string gnClipping = "Clipping";
88    std::string gnDynamics = "Dynamics";
89    std::string gnFilter = "Filter";
90    std::string gnLoFi = "Lo-Fi";
91    std::string gnNoise = "Noise";
92    std::string gnAmbience = "Ambience";
93    std::string gnSaturation = "Saturation And More";
94    std::string gnStereo = "Stereo";
95    std::string gnTape = "Tape";
96 
97    int id = 0; // add new effects only at the end of this list!
98 
99    reg.emplace_back(create<ADClip7::ADClip7>, id++, 10, gnClipping, "AD Clip");
100    reg.emplace_back(create<BlockParty::BlockParty>, id++, 20, gnDynamics, "Block Party");
101    reg.emplace_back(create<ButterComp2::ButterComp2>, id++, 30, gnDynamics, "Butter Comp");
102    reg.emplace_back(create<Compresaturator::Compresaturator>, id++, 40, gnDynamics, "Compresaturator");
103    reg.emplace_back(create<Logical4::Logical4>, id++, 50, gnDynamics, "Logical");
104    reg.emplace_back(create<Mojo::Mojo>, id++, 355, gnSaturation, "Mojo");
105    reg.emplace_back(create<OneCornerClip::OneCornerClip>, id++, 70, gnClipping, "One Corner Clip");
106    reg.emplace_back(create<Point::Point>, id++, 80, gnDynamics, "Point");
107    reg.emplace_back(create<Pop::Pop>, id++, 90, gnDynamics, "Pop");
108    reg.emplace_back(create<Pressure4::Pressure4>, id++, 100, gnDynamics, "Pressure");
109    reg.emplace_back(create<PyeWacket::Pyewacket>, id++, 110, gnDynamics, "Pye Wacket");
110    reg.emplace_back(create<Surge::Surge>, id++, 120, gnDynamics, "Surge");
111    reg.emplace_back(create<VariMu::VariMu>, id++, 130, gnDynamics, "Vari-Mu");
112 
113    reg.emplace_back(create<BitGlitter::BitGlitter>, id++, 140, gnLoFi, "Bit Glitter");
114    reg.emplace_back(create<CrunchyGrooveWear::CrunchyGrooveWear>, id++, 150, gnLoFi, "Crunchy Groove Wear");
115    reg.emplace_back(create<DeRez2::DeRez2>, id++, 160, gnLoFi, "DeRez");
116    reg.emplace_back(create<DeckWrecka::Deckwrecka>, id++, 170, gnLoFi, "Deck Wrecka");
117    reg.emplace_back(create<DustBunny::DustBunny>, id++, 180, gnNoise, "Dust Bunny");
118    reg.emplace_back(create<GrooveWear::GrooveWear>, id++, 190, gnLoFi, "Groove Wear");
119 
120    reg.emplace_back(create<Noise::Noise>, id++, 200, gnNoise, "Noise");
121    reg.emplace_back(create<VoiceOfTheStarship::VoiceOfTheStarship>, id++, 210, gnNoise, "Voice Of The Starship");
122 
123    reg.emplace_back(create<BrightAmbience2::BrightAmbience2>, id++, 220, gnAmbience, "Bright Ambience");
124    reg.emplace_back(create<Hombre::Hombre>, id++, 425, gnFilter, "Hombre");
125    reg.emplace_back(create<Melt::Melt>, id++, 240, gnAmbience, "Melt");
126    reg.emplace_back(create<PocketVerbs::PocketVerbs>, id++, 250, gnAmbience, "Pocket Verbs");
127    reg.emplace_back(create<StarChild::StarChild>, id++, 260, gnAmbience, "Star Child");
128 
129    reg.emplace_back(create<Apicolypse::Apicolypse>, id++, 270, gnSaturation, "Apicolypse");
130    reg.emplace_back(create<BassDrive::BassDrive>, id++, 280, gnSaturation, "Bass Drive");
131    reg.emplace_back(create<Cojones::Cojones>, id++, 290, gnSaturation, "Cojones");
132    reg.emplace_back(create<Density::Density>, id++, 300, gnSaturation, "Density");
133    reg.emplace_back(create<Drive::Drive>, id++, 310, gnSaturation, "Drive");
134    reg.emplace_back(create<Focus::Focus>, id++, 320, gnSaturation, "Focus");
135    reg.emplace_back(create<Fracture::Fracture>, id++, 330, gnSaturation, "Fracture");
136    reg.emplace_back(create<HardVacuum::HardVacuum>, id++, 340, gnSaturation, "Hard Vacuum");
137    reg.emplace_back(create<Loud::Loud>, id++, 350, gnSaturation, "Loud");
138    reg.emplace_back(create<NCSeventeen::NCSeventeen>, id++, 360, gnSaturation, "NC-17");
139    reg.emplace_back(create<Spiral2::Spiral2>, id++, 390, gnSaturation, "Spiral");
140    reg.emplace_back(create<UnBox::UnBox>, id++, 400, gnSaturation, "Unbox");
141 
142    reg.emplace_back(create<DeBess::DeBess>, id++, 420, gnFilter, "De-Bess");
143    reg.emplace_back(create<AirWindowsNoOp>, id++, -1, gnFilter, "NoOp (Was: DeEss)");
144 
145    reg.emplace_back(create<SingleEndedTriode::SingleEndedTriode>, id++, 380, gnSaturation, "Single-Ended Triode");
146 
147    reg.emplace_back(create<IronOxide5::IronOxide5>, id++, 450, gnTape, "Iron Oxide");
148    reg.emplace_back(create<ToTape6::ToTape6>, id++, 460, gnTape, "To Tape");
149 
150    reg.emplace_back(create<Air::Air>, id++, 400, gnFilter, "Air");
151 
152    reg.emplace_back(create<BussColors4::BussColors4>, id++, 285, gnSaturation, "Buss Colors");
153    reg.emplace_back(create<DrumSlam::DrumSlam>, id++, 46, gnDynamics, "Drum Slam");
154 
155    reg.emplace_back(create<Capacitor::Capacitor>, id++, 415, gnFilter, "Capacitor");
156    reg.emplace_back(create<Slew::Slew>, id++, 113, gnClipping, "Slew 1");
157    reg.emplace_back(create<Slew2::Slew2>, id++, 114, gnClipping, "Slew 2");
158 
159    // 1.9 additions
160    reg.emplace_back(create<Galactic::Galactic>, id++, 227, gnAmbience, "Galactic" );
161    reg.emplace_back(create<Infinity::Infinity>, id++, 230, gnAmbience, "Infinity" );
162    reg.emplace_back(create<MatrixVerb::MatrixVerb>, id++, 235, gnAmbience, "MatrixVerb" );
163    reg.emplace_back(create<Verbity::Verbity>, id++, 265, gnAmbience, "Verbity" );
164 
165    reg.emplace_back(create<TripleSpread::TripleSpread>, id++, 440, gnStereo, "Triple Spread" );
166    return reg;
167 }
168 
pluginRegistryOrdering()169 std::vector<int> AirWinBaseClass::pluginRegistryOrdering()
170 {
171    // See above on static
172    static auto res = std::vector<int>();
173    if( ! res.empty() )
174       return res;
175 
176    auto r = pluginRegistry();
177    auto q = std::map<std::string, std::map<int, int>>();
178 
179    for( auto const &el : r )
180    {
181       if( el.displayOrder >= 0 )
182          q[el.groupName][el.displayOrder] = el.id;
183       else
184          q[el.groupName][100000000] = -1;
185    }
186    for( auto const &sm : q )
187    {
188       for( auto const &tm : sm.second )
189       {
190          res.push_back( tm.second );
191       }
192    }
193    return res;
194 }