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); } }
/* ----------------------------------------------------------------- init --- */ int MROOM::init(double p[], int n_args) { float outskip = p[0]; float inskip = p[1]; float dur = p[2]; ovamp = p[3]; xdim = p[4]; ydim = p[5]; float rvbtime = p[6]; reflect = p[7]; innerwidth = p[8]; inchan = n_args > 9 ? (int)p[9] : AVERAGE_CHANS; int quant = n_args > 10 ? (int)p[10] : DEFAULT_QUANTIZATION; if (outputchans != 2) return die("MROOM", "Requires stereo output."); float ringdur = (rvbtime > MAX_DELAY) ? rvbtime : MAX_DELAY; if (rtsetoutput(outskip, dur + ringdur, this) == -1) return DONT_SCHEDULE; if (rtsetinput(inskip, this) == -1) return DONT_SCHEDULE; insamps = (int)(dur * SR + 0.5); if (inchan >= inputChannels()) return die("MROOM", "You asked for channel %d of a %d-channel input file.", inchan, inputChannels()); if (inputChannels() == 1) inchan = 0; // ***FIXME: input validation for trajectory points? int ntimes = get_timeset(timepts, xvals, yvals); if (ntimes == 0) return die("MROOM", "Must have at least two timeset calls before MROOM."); traject(ntimes); tableset(SR, dur, POS_ARRAY_SIZE, xpostabs); tableset(SR, dur, POS_ARRAY_SIZE, ypostabs); int delsamps = (int)(MAX_DELAY * SR + 0.5); delayline = new float[delsamps]; delset(SR, delayline, deltabs, MAX_DELAY); /* Array dimensions taken from lib/rvbset.c (+ 2 extra for caution). */ int rvbsamps = (int)((0.1583 * SR) + 18 + 2); rvbarrayl = new float[rvbsamps]; rvbarrayr = new float[rvbsamps]; rvbset(SR, rvbtime, 0, rvbarrayl); rvbset(SR, rvbtime, 0, rvbarrayr); amparray = floc(1); if (amparray) { int amplen = fsize(1); tableset(SR, dur, amplen, amptabs); } else rtcmix_advise("MROOM", "Setting phrase curve to all 1's."); aamp = ovamp; /* in case amparray == NULL */ skip = (int)(SR / (float)resetval); quantskip = (int)(SR / (float)quant); return nSamps(); }
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(); }