// a macro class. creates a texture out of a function that returns a continuous sound.

XFadeTexture {
 *ar { arg inputPatchFunc, sustainTime = 4.0, transitionTime = 4.0, numChannels = 1,
   maxRepeats, mul = 1.0, add = 0.0;
  var env, period;
  
  period = transitionTime + sustainTime;
  
  env = Env.new(
   #[ 0.0,         1.0,          1.0,          0.0],
    [ transitionTime, sustainTime, transitionTime ],
    'welch'
  );
    
  ^Spawn.ar({ arg spawn, i, synth;
   EnvGen.kr(env, timeScale: synth.tempo.reciprocal) * inputPatchFunc.value(spawn, i, synth);
   },
   numChannels, period, maxRepeats, mul, add
  )
 }
}


OverlapTexture {
 *ar { arg inputPatchFunc, sustainTime = 4.0, transitionTime = 4.0, density = 2,
   numChannels = 1, maxRepeats, mul = 1.0, add = 0.0;
  var env, period;
  
  period = (2 * transitionTime + sustainTime) / density;
  
  env = Env.new(
   #[ 0.0,         1.0,          1.0,          0.0],
    [ transitionTime, sustainTime, transitionTime ],
    'welch'
  );
    
  ^Spawn.ar({ arg spawn, i, synth;
   EnvGen.kr(env, timeScale: synth.tempo.reciprocal) * inputPatchFunc.value(spawn, i, synth);
   },
   numChannels, period, maxRepeats, mul, add
  )
 }
}

TrigXFade {
 *ar { arg inputPatchFunc, trig, transitionTime = 0.01, numChannels = 1,
   maxRepeats, mul = 1.0, add = 0.0;
  var envgen, env, tspawn, prevSynth;
   
  env = Env.new(
    [ 1.0,         1.0,             0.0],
    [ transitionTime, transitionTime   ],
    'linear', 1
  );
  
  thisSynth.sched(0, { tspawn.source.trigger }); // start first event..
  
  ^tspawn = TSpawn.ar({ arg spawn, i, synth;
    if (prevSynth.notNil, { // second and subsequent events
     env.levels.put(0, 0.0);  // begin at zero amp.
     prevSynth.release;
    });
    prevSynth = synth;
    envgen = EnvGen.kr(env);
    envgen * inputPatchFunc.value(spawn, i, synth);
   },
   numChannels, maxRepeats, trig, mul, add
  )
 }
}


This page was created by SimpleText2Html 1.0.3 on 22-Feb-100.