p0 = output start time (seconds) p1 = duration (seconds) p2 = amplitude multiplier (relative multiplier of grain intensity (p14, p15) p3 = random seed (any integer; if 0, seed from system clock) [default: 0] p4 = oscillator configuration (0: wavetable, 1: FM) [default: 0] p5 = randomize oscillator starting phase (0: no, 1: yes) [default: yes] p6 = reference to grain envelope table p7 = reference to grain waveform table p8 = modulation frequency multiplier (sets frequency of modulator for FM synthesis) p9 = index of modulation (FM synthesis) p10 = minimum grain frequency (Hz) p11 = maximum grain frequency (hz) p12 = minimum grain speed (I think this is the number of grains/second) p13 = maximum grain speed (ditto) p14 = minimum grain intensity (in dB for some reason, decibels above 0)) p15 = maximum grain intensity (I'm not sure how this translates to actual amplitude) p16 = grain density (I have no idea what units are used. Try "1") p17 = grain pan (0-1 stereo; 0.5 is middle) [optional; required if stereo output] p18 = grain pan randomization (1: full stereo randomization; 0: no randomization from p17 value) [optional; required if stereo output] p2 (amplitude), p8 (mod. freq.), p9 (mod. index), p10 (min. grain freq.), p11 (max. grain freq.), p12 (min. grain speed), p13 (max. grain speed), p14 (min. grain intensity), p15 (max. grain intensity), p16 (grain density), p17 (grain pan) and p18 (grain pan randomization) can receive dynamic updates from a table or real-time control source. p6 (grain envelope), p7 (grain waveform) should be references to pfield table-handles. Author: John Gibson, 4/15/00; rev for v4, JGG, 7/25/04 JGRAN was derived from a Cecilia module (StochasticGrains) by Mathieu Bezkorowajny and Jean Piche.
This instrument uses non-interpolating oscillators for efficiency, so make large tables for the grain waveform and grain envelope.
Note that amplitude is given in dB as the grain intensity between two values (p14, "MININTENSITY" and p15, "MAXINTENSITY"). The amp parameter (p2, "AMP") is thus an overall scaling multiplier. The dB values start at a base of 0 (i.e. positive, not negative down from a reference value).
The pitch of each grain is determined by the constraints of p10 ("MINFREQ") and p11 ("MAXFREQ"). In the case of FM synthesis, this will be set as the carrier frequency of each synthesized grain. The modulator frequency is determined by multiplying this base frequency by the value of p8 ("MODFREQMULT").
JGRAN can produce either stereo or mono output. If used with
stereo output, p17 ("PAN") and p18 ("PANRANDOM") need to be
specified.
Sample Scores
very basic:
rtsetparams(44100, 2) load("JGRAN") dur = 16 amp = 3 // overall amplitude envelope env = maketable("line", 1000, 0,0, 1,1, 2,1, 4,0) // grain envelope genv = maketable("window", 1000, "hanning") // grain waveform gwave = maketable("wave", 10000, "sine") // modulation frequency multiplier mfreqmult = maketable("line", "nonorm", 1000, 0,2, 1,2.1) // slight increase // index of modulation envelope (per grain) modindex = maketable("line", "nonorm", 1000, 0,0, 1,5) // increasing index // grain frequency minfreq = 500 maxfreq = maketable("line", "nonorm", 1000, 0,500, 1,550) // increasing maximum // grain speed minspeed = maketable("line", "nonorm", 1000, 0,100, 1,10) // decreasing minimum maxspeed = 100 // grain intensity (decibels above 0) mindb = 80 maxdb = 80 // grain density density = maketable("line", "nonorm", 1000, 0,1, 1,1, 2,.8) // slight decrease // grain stereo location -- image centered in middle pan = 0.5 // grain stereo location randomization panrand = maketable("line", "nonorm", 1000, 0,0, 1,1) // increasingly randomized JGRAN(start=0, dur, amp * env, seed=1, type=1, ranphase=1, genv, gwave, mfreqmult, modindex, minfreq, maxfreq, minspeed, maxspeed, mindb, maxdb, density, pan, panrand)
rtsetparams(44100, 2) load("JGRAN") dur = 10 amp = .5 // overall amplitude envelope env = maketable("line", 1000, 0,0, 6,1, 9,1, 10,0) // grain envelope genv = maketable("window", 10000, "hanning") // grain waveform gwave = maketable("wave", 10000, 1, .1, .05) // modulation frequency multiplier mfreqmult = maketable("random", "nonorm", 1000, "high", min=0, max=1, seed=1) // index of modulation envelope (per grain) modindex = maketable("line", "nonorm", 1000, 0,0, 1,6) // grain frequency minfreq = maxfreq = 500 // grain speed minspeed = 20 maxspeed = 90 // grain intensity (decibels above 0) mindb = 80 maxdb = 80 density = 1 // grain stereo location pan = 0.5 // grain stereo location randomization panrand = maketable("line", "nonorm", 1000, 0,0, 1,1) JGRAN(start=0, dur, amp * env, seed=1, type=1, ranphase=1, genv, gwave, mfreqmult, modindex, minfreq, maxfreq, minspeed, maxspeed, mindb, maxdb, density, pan, panrand) // a second grain stream, with some different params env = maketable("line", 1000, 0,0, 1,1, 4,1, 10,0) minfreq = 1000 maxfreq = 1100 panrand = maketable("line", "nonorm", 1000, 0,1, 1,0) amp = 2 JGRAN(start=0, dur, amp * env, seed=2, type=0, ranphase=1, genv, gwave, mfreqmult, modindex, minfreq, maxfreq, minspeed, maxspeed, mindb, maxdb, density, pan, panrand)
rtsetparams(44100, 2, 256) load("JGRAN") dur = 60 amp = 4 // overall amplitude envelope env = maketable("line", 1000, 0,0, 1,1, 2,1, 4,0) // grain envelope genv = maketable("window", 1000, "hanning") // grain waveform gwave = maketable("wave", 10000, "sine") // modulation frequency multiplier mfreqmult = 0 // index of modulation envelope (per grain) modindex = 0 // grain frequency minfreq = maxfreq = 500 //maxfreq = maketable("line", "nonorm", 1000, 0,500, 1,550) // grain speed //minspeed = maketable("line", "nonorm", 1000, 0,100, 1,10) minspeed = maxspeed = makeconnection("mouse", "x", 1, 200, 1, 20, "speed") // grain intensity (decibels above 0) mindb = 80 maxdb = 80 // grain density //density = maketable("line", "nonorm", 1000, 0,1, 1,1, 2,.8) density = makeconnection("mouse", "y", 1, 100, 1, 20, "density") // grain stereo location pan = 0.5 // grain stereo location randomization panrand = 0 JGRAN(start=0, dur, amp * env, seed=0, type=0, ranphase=1, genv, gwave, mfreqmult, modindex, minfreq, maxfreq, minspeed, maxspeed, mindb, maxdb, density, pan, panrand)