adsr1

Attack/decay/sustain/release envelope with modulation inputs and build in vca. NB! Connect the "e" output to the "e" input for the gate to work. (Sorry I am still learning code, so I am not sure how I connect the "e" in and "e" internally in the object yet. "On" button turn envelope on. When "off" input is passed through with no gate.
Author: Johannes Taelman - Edited by Jaffasplaffa
License: BSD
Github: jaffa/old/adsr1.axo

Inlets

frac32 e

bool32.risingfalling gate

frac32.bipolar attack time modulation

frac32.bipolar decay time modulation

frac32.bipolar sustail level modulation

frac32.bipolar release time modulation

frac32buffer i

Outlets

frac32buffer o

frac32.positive envelope output

Parameters

frac32.s.map a

frac32.s.map d

frac32.s.map r

frac32.u.map s

bool32.tgl on

Declaration
int32_t prev;
int32_t step;

int8_t stage;
int ntrig;
int32_t val;
Init
stage = 0;
ntrig = 0;
val = 0;
Control Rate
// vca
step = (inlet_e - prev) >> 4;
int32_t i = prev;
prev = inlet_e;

// env
if ((inlet_g > 0) && !ntrig) {
  stage = 1;
  ntrig = 1;
}
if (!(inlet_g > 0) && ntrig) {
  stage = 0;
  ntrig = 0;
}
if (stage == 0) {
  int32_t r1;
  int32_t r2;
  MTOF(-param_r - inlet_r, r1);
  r1 = 0x7FFFFFFF - (r1 >> 2);
  val = ___SMMUL(val, r1) << 1;
} else if (stage == 1) {
  int32_t a;
  MTOF(-param_a - inlet_a, a);
  a = a >> 2;
  val = val + a;
  if (val < 0) {
    val = 0x7FFFFFFF;
    stage = 2;
  }
} else if (stage == 2) {
  int32_t s = __USAT(param_s + inlet_s, 27);
  int32_t d;
  MTOF(-param_d - inlet_d, d);
  d = 0x7FFFFFFF - (d >> 2);
  val = (s << 4) + (___SMMUL(val - (s << 4), d) << 1);
}
outlet_e = val >> 4;
Audio Rate
// Env off
outlet_o = inlet_i;

// Env on
if (param_on) {

  outlet_o = ___SMMUL(inlet_i, i) << 5;
  i += step;
}

Privacy

© 2024 Zrna Research