123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- /*
- Cabinet.cc
-
- Copyright 2002-7 Tim Goetze <tim@quitte.de>
-
- http://quitte.de/dsp/
- CabinetI - 16th order IIR filters modeled after various impulse responses
- from Steve Harris' 'imp' plugin. Limited to 44.1 kHz sample rate.
- CabinetII - 32nd order IIR filters modeled after the same impulse responses
- using a different algorithm. Versions for 44.1 / 48 / 88.2 / 96 kHz sample
- rates, switched at runtime.
- */
- /*
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA or point your web browser to http://www.gnu.org.
- */
- #include "basics.h"
- #include "Cabinet.h"
- #include "Descriptor.h"
- Model16
- CabinetI::models [] =
- {
- {
- 1, /* identity */
- {1},
- {0},
- 1,
- }, {
- 16, /* unmatched, off-axis */
- {0.44334744339382504, 0.49764265352620912, 0.19936863766114088, 0.0038388115609433826, -0.072080744430548876, -0.092589757815768933, -0.023760971045285254, 0.058929802988203807, 0.11073296313735595, 0.14389046518738619, 0.052981055774577353, -0.11817321919764193, -0.22957467728465422, -0.26301284181138151, -0.25586853638823448, -0.10768194462289554},
- {0.0, 0.71138736215182674, 0.19571088506350195, -0.086897678126924227, -0.18344238266155902, -0.13338660100611671, -0.017424587504494098, 0.062014975470330351, 0.077979014877680469, 0.039134631327482176, -0.046646061538403727, -0.040653480351542266, 0.068462230153713749, 0.14313162261479676, 0.058844200671679531, -0.17878548463526983},
- 1 / 4.4,
- }, {
- 16, /* unmatched */
- {0.58952373363852417, 0.43625942509584309, 0.235412203403113, 0.048252951521505258, -0.1002076253350956, -0.14467958356216026, -0.074304873528329402, 0.060945557247412331, 0.15959845551788171, 0.20970924189636411, 0.15361368007229703, 0.025339061869183478, -0.11824836967489599, -0.19384403813690479, -0.19295873693806628, -0.058904754435169508},
- {0.0, 0.6596380198994729, 0.20825670531468143, -0.10508784276271754, -0.24698905246649294, -0.21519418569376192, -0.10057489587096909, -0.006175810942624007, -0.0019249936836196989, -0.045827268144865707, -0.10184708094147235, -0.09177820187618313, -0.017740067693127175, 0.058828573780348989, 0.010559807576350673, -0.19412688465216324},
- 1 / 5.7,
- }, {
- 16, /* superchamp */
- {0.5335550129666069, 0.61768496153556829, 0.2080126894040209, -0.0067283013134491337, -0.10433152421155355, -0.16159936513841233, -0.10593018443866807, -0.091854930675998661, 0.0023550324496513643, 0.14327516190088724, 0.14688292534697539, 0.089539872443625601, -0.053854769352683005, -0.15693904535289377, -0.083502230074838577, 0.0090113128614708465},
- {0.0, 0.67745858591653696, 0.044802106922746734, -0.1932642251200547, -0.18922360327572652, -0.052980570047914469, 0.020446992577988904, -0.028951451474818618, -0.085212072485126716, -0.12241212382510525, -0.089259371449674357, 0.010469056928395087, 0.049019357277555603, 0.037212453438250505, -0.046374612934843573, -0.045133341919937828},
- 1 / 4.0,
- }, {
- 16, /* fender-vibrolux-68 */
- {0.68447985102464837, 0.61538710771230021, -0.28804707230137599, -0.23656583372846893, 0.083100874242250655, -0.027792816938813913, 0.055558334440593965, 0.044458161718059774, -0.25467542393376252, -0.33660492613760157, -0.024663941486403884, 0.1172751972420942, -0.021832135450802759, 0.21440383631745469, 0.20828506390107443, -0.10289957687018361},
- {0.0, 0.50968169360260451, -0.48159141882733714, -0.10856607456906017, -0.026802006374108955, -0.24967309940249552, -0.21422424792787859, 0.019271890369619571, 0.08065394481240884, -0.061665636719946543, 0.031613782215493547, 0.069574436103950893, -0.07180222507768147, -0.14447996563879059, 0.012044815820150268, -0.0073237976200291044},
- 1 / 2.0,
- }, {
- 16, /* marshall */
- {0.38455665328113242, 0.50304089890302783, 0.33653970418909934, 0.085604896315814846, -0.070239383452479598, -0.10479060878654689, -0.060150883776583335, 0.030121882977878822, 0.12441775056532201, 0.18287316824579156, 0.17035705141865287, 0.10315414401519916, 0.036357097566567576, 0.024474446155666255, 0.042359967009557103, 0.059946316626725109},
- {0.0, 0.68167571829534335, 0.16877527811114035, -0.17427551663276897, -0.25780056810728452, -0.16065744581310681, -0.032007062964857856, 0.033882840656718101, -0.0038880045892747792, -0.084876415098991506, -0.13865107122780057, -0.10073571899064113, -0.013199668806255366, 0.038170305284592504, -0.026492576852036546, -0.12667775510054707},
- 1 / 4.2,
- }
- };
- /* //////////////////////////////////////////////////////////////////////// */
- void
- CabinetI::init()
- {
- h = 0;
- model = 0;
- }
- void
- CabinetI::switch_model (int m)
- {
- if (m < 0) m = 0;
- else if (m > 5) m = 5;
- model = m;
- n = models[m].n;
- a = models[m].a;
- b = models[m].b;
- gain = models[m].gain * DSP::db2lin (getport(2));
- memset (x, 0, sizeof (x));
- memset (y, 0, sizeof (y));
- }
- void
- CabinetI::activate()
- {
- switch_model ((int) getport(1));
- gain = models[model].gain * DSP::db2lin (getport(2));
- }
- template <sample_func_t F>
- void
- CabinetI::one_cycle (int frames)
- {
- sample_t * s = ports[0];
- int m = (int) getport (1);
- if (m != model) switch_model (m);
- sample_t g = models[model].gain * DSP::db2lin (getport(2));
- double gf = pow (g / gain, 1 / (double) frames);
- sample_t * d = ports[3];
- for (int i = 0; i < frames; ++i)
- {
- register cabinet_float out = s[i] + normal;
-
- x[h] = out;
-
- out *= a[0];
- for (int j = 1, z = h - 1; j < n; --z, ++j)
- {
- z &= 15;
- out += a[j] * x[z];
- out += b[j] * y[z];
- }
- y[h] = out;
- h = (h + 1) & 15;
-
- F (d, i, gain * out, adding_gain);
- gain *= gf;
- }
- }
- /* //////////////////////////////////////////////////////////////////////// */
- PortInfo
- CabinetI::port_info [] =
- {
- {
- "in",
- INPUT | AUDIO,
- {BOUNDED, -1, 1}
- }, {
- "model",
- INPUT | CONTROL,
- {BOUNDED | INTEGER | DEFAULT_1, 0, 5}
- }, {
- "gain (dB)",
- INPUT | CONTROL,
- {BOUNDED | DEFAULT_0, -24, 24}
- }, {
- "out",
- OUTPUT | AUDIO,
- {0}
- }
- };
- /* //////////////////////////////////////////////////////////////////////// */
- template <> void
- Descriptor<CabinetI>::setup()
- {
- UniqueID = 1766;
- Label = "CabinetI";
- Properties = HARD_RT;
- Name = CAPS "CabinetI - Loudspeaker cabinet emulation";
- Maker = "Tim Goetze <tim@quitte.de>";
- Copyright = "GPL, 2002-7";
- /* fill port info and vtable */
- autogen();
- }
- /* CabinetII ////////////////////////////////////////////////////////////// */
- #include "Cabinet-Models32.h"
- void
- CabinetII::init()
- {
- if (fs < 46000)
- models = models44100;
- else if (fs < 72000)
- models = models48000;
- else if (fs < 92000)
- models = models88200;
- else
- models = models96000;
- h = 0;
- model = 0;
- }
- void
- CabinetII::switch_model (int m)
- {
- model = m;
- n = models[m].n;
- a = models[m].a;
- b = models[m].b;
- gain = models[m].gain * DSP::db2lin (getport(2));
- memset (x, 0, sizeof (x));
- memset (y, 0, sizeof (y));
- }
- void
- CabinetII::activate()
- {
- switch_model ((int) getport(1));
- }
- template <sample_func_t F>
- void
- CabinetII::one_cycle (int frames)
- {
- sample_t * s = ports[0];
- int m = (int) getport (1);
- if (m != model) switch_model (m);
- sample_t g = models[model].gain * DSP::db2lin (getport(2));
- double gf = pow (g / gain, 1 / (double) frames);
- sample_t * d = ports[3];
- for (int i = 0; i < frames; ++i)
- {
- register cabinet_float out = s[i] + normal;
-
- x[h] = out;
-
- out *= a[0];
- for (int j = 1, z = h - 1; j < n; --z, ++j)
- {
- z &= 31;
- out += a[j] * x[z];
- out += b[j] * y[z];
- }
- y[h] = out;
- h = (h + 1) & 31;
-
- F (d, i, gain * out, adding_gain);
- gain *= gf;
- }
- }
- /* //////////////////////////////////////////////////////////////////////// */
- PortInfo
- CabinetII::port_info [] =
- {
- {
- "in",
- INPUT | AUDIO,
- {BOUNDED, -1, 1}
- }, {
- "model",
- INPUT | CONTROL,
- {BOUNDED | INTEGER | DEFAULT_1, 0, 7}
- }, {
- "gain (dB)",
- INPUT | CONTROL,
- {BOUNDED | DEFAULT_0, -24, 24}
- }, {
- "out",
- OUTPUT | AUDIO,
- {0}
- }
- };
- /* //////////////////////////////////////////////////////////////////////// */
- template <> void
- Descriptor<CabinetII>::setup()
- {
- UniqueID = 2581;
- Label = "CabinetII";
- Properties = HARD_RT;
- Name = CAPS "CabinetII - Refined loudspeaker cabinet emulation";
- Maker = "Tim Goetze <tim@quitte.de>";
- Copyright = "GPL, 2002-7";
- /* fill port info and vtable */
- autogen();
- }
|