p0 = output start time (seconds) p1 = duration (seconds) p2 = overall amplitude (absolute, for 16-bit soundfiles: 0-32768) p3 = reference to wavetable p4, p5, p6, p7, ... pN-3, pN-2, pN-1, pN starting with p4, the next N pfields are quadruplets describing an individaul oscillator: - frequency (Hz) - amplitude (relative multiplier of overall amplitude (p2)) - initial phase (0-360 degrees, not updateable) - pan (0-1 stereo; 0.5 is middle) there is no limit on the number of quadruplets that may be specified. p2 (amplitude), p4 (freq), p5 (partial amp), p7 (pan), and the same parameters for additional partials, can receive updates from a table or real-time control source. p3 (wavetable) should be a reference to a pfield table-handle. Author: John Gibson, 3/9/06 (<------- john likes to live ahead of his time! BGG, 6/14/2005)
For rapidly-varying control envelopes, you may want to set the reset rate higher than the default 1000 times/second. Use the reset scorefile command to do this.
MULTIWAVE can produce mono or stereo output.
Sample Scores
very basic:
rtsetparams(44100, 2) load("MULTIWAVE") ampenv = maketable("line", 1000, 0,0, 1,1, 2,0) wave = maketable("wave", 1000, 1) srand() MULTIWAVE(0, 4.3, ampenv*35000, wave, irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random(), irand(100, 700), 1, 0, random())
rtsetparams(44100, 2) load("MULTIWAVE") dur = 60 amp = 15000 wave = maketable("wave", 2000, 1) line = maketable("line", 1000, 0,0, 1,1, 9,1, 10,0) rfreq = 1 freq1 = makerandom("linear", rfreq, min=200, max=1000, seed=1) freq1 = makefilter(freq1, "smooth", 90) lag = 60 amp1 = makeconnection("mouse", "Y", 0, 1, 0, lag, "amp") pan1 = makeconnection("mouse", "X", 1, 0, .5, lag, "pan") MULTIWAVE(0, dur, amp * line, wave, freq1, amp1, phase1=0, pan1, freq1 * 1.05, amp1, phase1, pan1 * .7)
rtsetparams(44100, 2) load("MULTIWAVE") reset(5000) ampenv = maketable("line", 1000, 0,0, 1,1, 4,1, 5,0) wave = maketable("wave", 1000, 1) fadeup = maketable("line", 1000, 0,0, 1,1) fadedown = maketable("line", 1000, 0,1, 1,0) outsk = 0 dur = 0.21 for (i = 0; i < 35; i += 1) { MULTIWAVE(outsk, dur, ampenv*60000, wave, irand(100, 1400), fadedown, 0, random(), irand(100, 1400), fadedown, 0, random(), irand(100, 1400), fadedown, 0, random(), irand(100, 1400), fadedown, 0, random(), irand(100, 1400), fadedown, 0, random(), irand(100, 1400), fadedown, 0, random(), irand(100, 1400), fadedown, 0, random(), irand(100, 1400), fadeup, 0, random(), irand(100, 1400), fadeup, 0, random(), irand(100, 1400), fadeup, 0, random(), irand(100, 1400), fadeup, 0, random(), irand(100, 1400), fadeup, 0, random(), irand(100, 1400), fadeup, 0, random(), irand(100, 1400), fadeup, 0, random()) outsk = outsk + dur }
rtsetparams(44100, 2, 128) load("MULTIWAVE") dur = 60 masteramp = 20000 minfreq = 50 maxfreq = 1500 glide = 50 // quantize freqs to this number (in Hz); set to zero for no quantum //quantum = 100 quantum = 0 wave = maketable("wave", 5000, 1) line = maketable("line", 1000, 0,0, 1,1, 9,1, 10,0) numwaves = 10 freq = {} pan = {} for (i = 0; i < numwaves; i += 1) { lfofreq = 0.007 + (i * 1.4) rfreq = makeLFO("sine", lfofreq, min = 0.2 + (i * 0.03), min * 3.5) min = minfreq + (i * 10) max = maxfreq - (i * 70) rand = makerandom("linear", rfreq, min, max, seed = i + 1) freq[i] = makefilter(rand, "smooth", glide) if (quantum) freq[i] = makefilter(freq[i], "quantize", quantum) min = mod(i, 2) if (min == 0) max = 1 else max = 0 pan[i] = makeLFO("sine", 0.007 + (i * 0.026), min, max) } amp = 1 phase = 0 MULTIWAVE(0, dur, masteramp * line, wave, freq[0], amp, phase, pan[0], freq[1], amp, phase, pan[1], freq[2], amp, phase, pan[2], freq[3], amp, phase, pan[3], freq[4], amp, phase, pan[4], freq[5], amp, phase, pan[5], freq[6], amp, phase, pan[6], freq[7], amp, phase, pan[7], freq[8], amp, phase, pan[8], freq[9], amp, phase, pan[9])
rtsetparams(44100, 2) load("MULTIWAVE") dur = 60 masteramp = 30000 // in linear octaves minpitch = 6.00 maxpitch = 10.00 glide = 50 wave = maketable("wave", 5000, 1, 0, .02) line = maketable("line", 1000, 0,0, 1,1, 8,1, 10,0) pitchtable = maketable("literal", "nonorm", 0, 6.00, 7.00, octpch(7.05), octpch(7.07), 8.00, octpch(8.07), octpch(8.08), 9.00, octpch(9.07) ) numwaves = 10 freq = {} amp = {} pan = {} for (i = 0; i < numwaves; i += 1) { lfofreq = 0.007 + (i * 1.4) rfreq = makeLFO("sine", lfofreq, min = 0.2 + (i * 0.03), min * 3.5) min = minpitch + (i * octpch(0.03)) max = maxpitch - (i * octpch(0.02)) freq[i] = makerandom("low", rfreq, min, max, seed = i + 2) freq[i] = makefilter(freq[i], "constrain", pitchtable, 0.95) freq[i] = makefilter(freq[i], "smooth", glide) freq[i] = makeconverter(freq[i], "cpsoct") min = i % 2 if (min == 0) max = 1 else max = 0 amp[i] = makeLFO("sine", 0.06 + (i * 0.04), 0.2, 1) pan[i] = makeLFO("sine", 0.007 + (i * 0.026), min, max) } phase = 0 MULTIWAVE(0, dur, masteramp * line, wave, freq[0], amp[0], phase, pan[0], freq[1], amp[1], phase, pan[1], freq[2], amp[2], phase, pan[2], freq[3], amp[3], phase, pan[3], freq[4], amp[4], phase, pan[4], freq[5], amp[5], phase, pan[5], freq[6], amp[6], phase, pan[6], freq[7], amp[7], phase, pan[7], freq[8], amp[8], phase, pan[8], freq[9], amp[9], phase, pan[9])