nativeSawsync

Saw wave oscillator with "active" control Bandwith limited
Author: Johannes Taelman(editted by Remco van der Most)
License: BSD
Github: sss/osc/nativeSawsync.axo

Inlets

frac32.bipolar pitch

frac32buffer sync, resets oscillator phase on rising zero-crossing

bool32 active

Outlets

frac32buffer.bipolar saw wave, anti-aliased

Parameters

frac32.s.map.pitch pitch

Declaration
int32_t osc_p;
static const int blepvoices = 4;
int16_t *oscp[blepvoices];
int32_t vgain[blepvoices];
uint32_t nextvoice;
int32_t i0;
Init
int j;
for (j = 0; j < blepvoices; j++)
  oscp[j] = &blept[BLEPSIZE - 1];
nextvoice = 0;
i0 = 0;
Control Rate
if (inlet_active > 0) {

  int32_t freq;
  MTOFEXTENDED(param_pitch + inlet_pitch, freq);
  int j;
  int16_t *lastblep = &blept[BLEPSIZE - 1];
  for (j = 0; j < BUFSIZE; j++) {
    int i;
    int p;
    p = osc_p;
    osc_p = p + freq;
    int i1 = inlet_sync[j] >> 2;
    if ((i1 > 0) && !(i0 > 0)) { // phase reset
      nextvoice = (nextvoice + 1) & (blepvoices - 1);
      int32_t x = 64 - ((-i0 << 6) / (i1 - i0));
      oscp[nextvoice] = &blept[x];
      vgain[nextvoice] = vgain[nextvoice] =
          (((x * (freq >> 7)) + (((uint32_t)p) >> 1))) >> 18;
      osc_p = x * (freq >> 6);
    } else if ((osc_p > 0) && !(p > 0)) { // dispatch
      nextvoice = (nextvoice + 1) & (blepvoices - 1);
      int32_t x = osc_p / (freq >> 6);
      oscp[nextvoice] = &blept[x];
      vgain[nextvoice] = 1 << 13;
    }
    i0 = i1;
    int32_t sum = 0;
    for (i = 0; i < blepvoices; i++) { // sample
      int16_t *t = oscp[i];
      sum += (16384 - (*t)) * vgain[i];
      t += 64;
      if (t >= lastblep)
        t = lastblep;
      oscp[i] = t;
    }
    // sum = -sum;
    uint32_t g = osc_p;
    outlet_wave[j] = (g >> 5) + sum - (1 << 26);
  }
}
Audio Rate
if (inlet_active == 0) {
  outlet_wave = 0;
}

Privacy

© 2024 Zrna Research