void REVERBIT::doupdate() { double p[8]; update(p, 8, kRvbTime | kRvbPct | kCutoffFreq); amp = update(3, insamps); // env spans only input dur if (amparray) amp *= tablei(currentFrame(), amparray, amptabs); if (p[4] != reverbtime) { reverbtime = p[4]; if (reverbtime <= 0.0) reverbtime = 0.0001; rvbset(SR, reverbtime, 1, rvbarray); } reverbpct = p[5]; if (reverbpct < 0.0) reverbpct = 0.0; else if (reverbpct > 1.0) reverbpct = 1.0; if (usefilt && p[7] != cutoff) { cutoff = p[7]; if (cutoff <= 0.0) cutoff = 0.01; toneset(SR, cutoff, 0, tonedata); } }
/* Initializes the tone filters for simulating wall absorption. <wallfac> is a value between 0 and 10. */ void MBASE::set_walls(float wallfac) { float cutoff, cf; wallfac /= 10.0; wallfac *= wallfac; /* now an expon. value between 0 and 1 */ cutoff = wallfac * SR / 2; /* sets -3db pt. between 0 & N.F. */ cutoff = (cutoff <= SR / 2) ? cutoff : SR / 2; /* set limit at N.F. */ for (int i = 0; i < 2; i++) { for (int j = 1; j < m_paths; j++) { /* skip first pair (direct sigs) */ cf = (j > 4) ? cutoff * .6 : cutoff; /* more filt for 2nd */ toneset(SR, cf, 1, m_vectors[i][j].Walldata); /* gen. wall reflect */ } } }
int REVERBIT::init(double p[], int n_args) { float outskip = p[0]; float inskip = p[1]; float dur = p[2]; reverbtime = p[4]; reverbpct = p[5]; rtchan_delaytime = p[6]; cutoff = p[7]; dcblock = n_args > 8 ? (p[8] != 0.0) : true; // default is "yes" float ringdur = n_args > 9 ? p[9] : reverbtime + RVTSLOP; if (outputChannels() != 2) return die("REVERBIT", "Output must be stereo."); if (rtsetinput(inskip, this) == -1) return DONT_SCHEDULE; if (inputChannels() > 2) return die("REVERBIT", "Can't have more than 2 input channels."); if (rtsetoutput(outskip, dur + ringdur, this) == -1) return DONT_SCHEDULE; insamps = (int) (dur * SR); if (reverbtime <= 0.0) return die("REVERBIT", "Reverb time must be greater than 0."); if (reverbpct < 0.0 || reverbpct > 1.0) return die("REVERBIT", "Reverb percent must be between 0 and 1 inclusive."); if (rtchan_delaytime <= 0.0) return die("REVERBIT", "Right chan delay time must be greater than 0."); if (cutoff < 0.0) return die("REVERBIT", "Cutoff frequency should be positive (or zero to " "disable filter)."); usefilt = (cutoff > 0.0); if (usefilt) toneset(SR, cutoff, 1, tonedata); else rtcmix_advise("REVERBIT", "Low-pass filter disabled."); float maxdeltime = rtchan_delaytime; // If delay time is very short, make delay line longer than necessary. if (rtchan_delaytime < MIN_DELAY) maxdeltime *= DELAY_FACTOR; int delsamps = (int) (maxdeltime * SR + 0.5); delarray = new float[delsamps]; delset(SR, delarray, deltabs, maxdeltime); // Array dimensions taken from lib/rvbset.c (+ 2 extra for caution). int rvbsamps = (int)((0.1583 * SR) + 18 + 2); rvbarray = new float[rvbsamps]; rvbset(SR, reverbtime, 0, rvbarray); amparray = floc(1); if (amparray) { int amplen = fsize(1); tableset(SR, dur, amplen, amptabs); } prev_in[0] = prev_out[0] = 0.0; // for DC-blocker prev_in[1] = prev_out[1] = 0.0; return nSamps(); }