Trippr audio programming: Interpolated noise (part 4)

As a little addendum I’ll talk a bit about the secret noise I’ve added to the Trippr tone. It’s silently there in the background. It’s a version of Brownian noise by interpolating between random points in the signal.

We’ll divide our buffer in evenly spaced blocks. We’ll use a power of two so it’ll fit nicely. In this case 64 (2^6), which will fit sixteen times in our buffer of 1024 (2^10) samples. These blocks will smoothly step between random points. We’ll save all our samples in an array called Noise.

uint32_t Smooth = 64;
float Random[SamplesToWrite / Smooth];
int16_t Noise[SamplesToWrite];

Now we’ll get random values between -1 and 1 to interpolate between. We will have to set the first and last one to 0 so the ends will always meet nicely.

Random[0] = 0.0f;
Random[SamplesToWrite/Smooth] = 0.0f;
for (uint32_t i = 1; i < SamplesToWrite/Smooth; i++)
{
  Random[i] = (float)rand()/(float)RAND_MAX * 2.0f - 1.0f;
}

Now we’ll use the Smoothstep() function to interpolate between these points. Then multiply these by the 16-bit min/max 32,767.

for (uint32_t i = 0; i < SamplesToWrite/Smooth; i++)
{
  for (uint32_t j = 0; j < Smooth; j++)
  {
    Noise[i*Smooth + j] = (32767 * Smoothstep(Random[i], Random[i+1], Smooth, j);
  }
}

The Smoothstep() function I got from this great site. This is it:

float Smoothstep(float A, float B, uint32_t N, uint32_t i)
{
  float t = i/(float)N;
  t = t * t * (3 - 2*t);
  return (1.0f -t)*A + t*B;
}