MULTIWAVE -- wavetable/additive synthesis instrument
in RTcmix/insts/std


quick syntax:
MULTIWAVE(outsk, dur, AMP, WAVETABLE, FREQ1, AMP1, phase1, PAN1, ... FREQN, AMPN, phaseN, PANN)


   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)



MULTIWAVE can be used to create a wide range of sounds. Using PField controls, each individual part can be controlled with a fair degree of independence, equivalent to an efficient version of many WAVETABLE notes running simultaneously.



Usage Notes

This is a fairly straightforward instrument. Because all the fundamental parameters for each oscillator used may be specified (amp envelope, phase, pan, frequency (enveloped!)), true additive synthesis can be achieved using MULTIWAVE. For basic wavetable synthesis, use WAVETABLE.

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())


slightly more advanced:
   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)


fun stuff!
   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
   }


more fun stuff!
   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])


even more fun stuff!
   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])



See Also

makeconverter, makefilter, makeLFO, makerandom, maketable, cpspch, AMINST, FMINST, HALFWAVE, VWAVE, SYNC, WAVESHAPE, WAVETABLE, WAVY, WIGGLE