Subversion Repositories DIN Is Noise

Rev

Rev 2097 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
* noiser.cc
* DIN Is Noise is copyright (c) 2006-2025 Jagannathan Sampath
* DIN Is Noise is released under GNU Public License 2.0
* For more information, please visit https://dinisnoise.org/
*/


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

noiser::noiser () {
  warp (&interp);
  last_vol = 0.0f;
  set_spread (0.0f);
  set_value (0);
  //setcur = setnext = 1;
}

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* vola) {
  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 = vola[i] * no;
    L[i] += vno;
    R[i] += vno;
    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;
        samples.err = 1.0f - samples.err;
      }
      calc_delta_alpha ();
    }
  }
}

void noiser::operator() (float* L, float* R, int n, float vol) {
  /*if (setcur) {
    value.cur = aout.fdr2[0];
    value.next = aout.fdr2[samples.due-1];
    value.delta = value.next - value.cur;
    alpha.val = 0.0f;
    calc_delta_alpha ();
    setcur = 0;
  }
  if (setnext) {
    value.cur = value.next;
    value.next = L[nextoff];
    value.delta = value.next - value.cur;
    alpha.val = 0.0f;
    setnext = 0;
    nextoff = 0;
  }*/

  float v = last_vol;
  float dv = (vol - last_vol) * 1.0f / n;
  for (int i = 0; i < n; ++i) {
    alpha.val += alpha.delta;
    alpha.warp = warp (alpha.val);
    float no = value.cur + alpha.warp * value.delta;
    v += dv;
    float vno = v * no;
    /*L[i] *= alpha.warp; //no; //alpha.warp;
    R[i] = L[i];*/


    L[i] += vno;
    R[i] = L[i];

    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;
        samples.err = 1.0f - samples.err;
        calc_delta_alpha ();
      }
      /*int nex = i + samples.due;
      if (nex >= n) {
        nextoff = nex - n;
        value.cur = value.next;
        value.next = aout.fdr1 [nextoff];
      } else {
        value.cur = value.next;
        value.next = aout.fdr2[nex];
      }
      value.delta = value.next - value.cur;*/

      alpha.val = 0.0f;
    }
  }
  last_vol = vol;
}

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