int MIX::init(double p[], int n_args) { const float outskip = p[0]; const float inskip = p[1]; float dur = p[2]; if (dur < 0.0) dur = -dur - inskip; if (rtsetoutput(outskip, dur, this) == -1) return DONT_SCHEDULE; if (rtsetinput(inskip, this) == -1) return DONT_SCHEDULE; // no input for (int i = 0; i < inputChannels(); i++) { outchan[i] = (int) p[i + 4]; if (outchan[i] + 1 > outputChannels()) return die("MIX", "You wanted output channel %d, but have only specified " "%d output channels", outchan[i], outputChannels()); } initamp(dur, p, 3, 1); return nSamps(); }
int STEREO::init(double p[], int n_args) { nargs = n_args; outslots = n_args - MATRIX_PFIELD_OFFSET; const float outskip = p[0]; const float inskip = p[1]; float dur = p[2]; if (dur < 0.0) dur = -dur - inskip; if (n_args <= MATRIX_PFIELD_OFFSET) return die("STEREO", "You need at least one channel assignment."); if (rtsetoutput(outskip, dur, this) == -1) return DONT_SCHEDULE; if (rtsetinput(inskip, this) == -1) return DONT_SCHEDULE; // no input if (outputChannels() != 2) return die("STEREO", "Output must be stereo."); initamp(dur, p, 3, 1); if (fastUpdate) updatePans(p); return nSamps(); }
int FMINST::init(double p[], int n_args) { nargs = n_args; float outskip = p[0]; float dur = p[1]; if (rtsetoutput(outskip, dur, this) == -1) return DONT_SCHEDULE; if (outputChannels() > 2) return die("FMINST", "Can't handle more than 2 output channels."); carfreqraw = p[3]; if (carfreqraw < 15.0) carfreq = cpspch(carfreqraw); else carfreq = carfreqraw; modfreqraw = p[4]; if (modfreqraw < 15.0) modfreq = cpspch(modfreqraw); else modfreq = modfreqraw; double *wavetable = NULL; int tablelen = 0; if (n_args > 8) { // handle table coming in as optional p8 TablePField wavetable = (double *) getPFieldTable(8, &tablelen); } if (wavetable == NULL) { wavetable = floc(WAVET_GEN_SLOT); if (wavetable == NULL) return die("FMINST", "Either use the wavetable pfield (p8) or make " "an old-style gen function in slot %d.", WAVET_GEN_SLOT); tablelen = fsize(WAVET_GEN_SLOT); } carosc = new Ooscili(SR, carfreq, wavetable, tablelen); modosc = new Ooscili(SR, modfreq, wavetable, tablelen); if (n_args < 10) { // no p9 guide PField, must use gen table indexenv = floc(INDEX_GEN_SLOT); if (indexenv == NULL) return die("FMINST", "Either use the index guide pfield (p9) or make " "an old-style gen function in slot %d.", INDEX_GEN_SLOT); int len = fsize(INDEX_GEN_SLOT); tableset(SR, dur, len, indtabs); } initamp(dur, p, 2, 1); if (fastUpdate) { minindex = p[5]; indexdiff = p[6] - minindex; pan = p[7]; } return nSamps(); }
int WAVETABLE::init(double p[], int n_args) { float outskip = p[0]; float dur = p[1]; if (rtsetoutput(outskip, dur, this) == -1) return DONT_SCHEDULE; if (outputChannels() > 2) return die("WAVETABLE", "Can't handle more than 2 output channels."); initamp(dur, p, 2, AMP_GEN_SLOT); freqraw = p[3]; float freq; if (freqraw < 15.0) freq = cpspch(freqraw); else freq = freqraw; spread = p[4]; wavetable = NULL; int tablelen = 0; if (n_args > 5) // handle table coming in as optional p5 TablePField wavetable = (double *) getPFieldTable(5, &tablelen); if (wavetable == NULL) { wavetable = floc(WAVET_GEN_SLOT); if (wavetable) tablelen = fsize(WAVET_GEN_SLOT); else { rtcmix_advise("WAVETABLE", "No wavetable specified, so using sine wave."); tablelen = 1024; wavetable = new double [tablelen]; ownWavetable = true; const double twopi = M_PI * 2.0; for (int i = 0; i < tablelen; i++) wavetable[i] = sin(twopi * ((double) i / tablelen)); } } if (tablelen > 32767) return die("WAVETABLE", "wavetable must have fewer than 32768 samples."); osc = new Ooscili(SR, freq, wavetable, tablelen); return nSamps(); }
int IINOISE::init(double p[], int n_args) { float outskip = p[0]; float dur = p[1]; pan = p[3]; if (rtsetoutput(outskip, dur, this) == -1) return DONT_SCHEDULE; initamp(dur, p, 2, 1); float cf[MAXFILTER], bw[MAXFILTER], gain[MAXFILTER]; nresons = get_iir_filter_specs(cf, bw, gain); if (nresons == 0) die("IINOISE", "You must call setup() first to describe filters."); for (int i = 0; i < nresons; i++) { // NB: All the IIR insts used the RMS scale factor. resons[i] = new Oreson(SR, cf[i], bw[i], Oreson::kRMSResponse); resonamp[i] = gain[i]; } return nSamps(); }
int TRANS::init(double p[], int n_args) { nargs = n_args; if (nargs < 5) return die("TRANS", "Usage: TRANS(start, inskip, dur, amp, trans[, inchan, pan])"); const float outskip = p[0]; const float inskip = p[1]; float dur = p[2]; if (dur < 0.0) dur = -dur - inskip; inchan = (nargs > 5) ? (int) p[5] : 0; pctleft = (nargs > 6) ? p[6] : 0.5; if (rtsetoutput(outskip, dur, this) == -1) return DONT_SCHEDULE; if (rtsetinput(inskip, this) == -1) return DONT_SCHEDULE; if (inchan >= inputChannels()) { return die("TRANS", "You asked for channel %d of a %d-channel file.", inchan, inputChannels()); } // to trigger first read in run() inframe = RTBUFSAMPS; initamp(dur, p, 3, 1); oneover_cpsoct10 = 1.0 / cpsoct(10.0); if (fastUpdate) // no transp updates _increment = cpsoct(10.0 + octpch(p[4])) * oneover_cpsoct10; return nSamps(); }