Subversion Repositories DIN Is Noise

Rev

Rev 1403 | Rev 1417 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "noiser.h"
#include "keyboard_keyboard.h"
#include "audio.h"

noiser::noiser () {
  set_value (0);
  warp (&interp);
  set_spread (1.0f);
  last_vol = 0.0f;
}

void noiser::set_value (float v) {
  value.cur = v;
  value.next = random_value ();
  value.delta = value.next - value.cur;
  alpha.val = 0.0f;
}

void noiser::calc_delta_alpha () {
  if (samples.due < 3) alpha.delta = 1; else alpha.delta = 1.0f / (samples.due - 1);
}
void noiser::set_samples (float sn) {
  samples.next = sn;
  samples.duei = samples.due = int (sn);
  samples.derr = samples.next - samples.duei;
  calc_delta_alpha ();
}

void noiser::set_spread (float s) {
  spread = s;
  random_value.set (-spread, spread);
}

void noiser::operator() (float* L, float* R, int n, float vol) {

  float v = last_vol;
  float dv = (vol - last_vol) * (1.0f / (n - 1));

  for (int i = 0; i < n; ++i) {
    alpha.val += alpha.delta;
    alpha.warp = warp (alpha.val);
    float no = value.cur + alpha.warp * value.delta;
    float vno = v * no;
    L[i] += vno;
    R[i] += vno;
    v += dv;
    if (++samples.cur < samples.due); else {
      set_value (no);
      samples.cur = 0;
      samples.err += samples.derr;
      if (samples.err < 1.0f) {
        samples.due = samples.duei;
      } else {
        samples.due = samples.duei + 1;
        calc_delta_alpha ();
        samples.err = 1.0f - samples.err;
      }
    }
  }
  last_vol = vol;
}

ofstream& operator<< (ofstream& o, noiser& n) {
  extern const char SPC;
  o << n.spread << SPC << n.samples.next;
  return o;
}