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);
    }
}
Ejemplo n.º 2
0
/* 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();
}