::  Posts  ::  RSS  ::  ◂◂RSS  ::  Contact

Wrapping Bass: Implementation

February 3rd, 2012
music, octaveless  [html]
After thinking yesterday about octaveless notes I decided to write something to generate the tones I had in mind. Here they are as two-second mp3s:
Bb B C Db
A D
Ab Eb
G Gb F E
The code is on github. It uses portaudio so it should work cross platform if you want to compile it. The important parts of the code are:
#define sine(i,F) ((float) sin( (((double)(i)*(double)(F))/SAMPLE_RATE) * M_PI * 2. ))

float freq(float note)
{
  return 440*(pow(2, (note-69.0)/12));
}

float intensity(float note, int octave)
{
  float bass_n = fmod(note, 12);

  switch(octave) {
  case 0:
    return 0.00 + 0.01*bass_n;
  case 1:
    return 0.12 + 0.01*bass_n;
  case 2:
    return 0.24 + 0.01*bass_n;
  case 3:
    return 0.32 - 0.01*bass_n;
  case 4:
    return 0.22 - 0.01*bass_n;
  case 5:
    return 0.10 - 0.01*bass_n;
  }
  return 0; // never reached
}

float synth(float phase, float note) {
  return pow(2,(sine(phase, note)));
}

# A440 = 69, as in midi
# phase is constantly increasing, once per sample
#
float sample_val(float note, unsigned int phase)
{
  note = fmod(note, 12);

  return log2(synth(phase, freq(note + 12*0)) * intensity(note, 0) +
              synth(phase, freq(note + 12*1)) * intensity(note, 1) +
              synth(phase, freq(note + 12*2)) * intensity(note, 2) +
              synth(phase, freq(note + 12*3)) * intensity(note, 3) +
              synth(phase, freq(note + 12*4)) * intensity(note, 4) +
              synth(phase, freq(note + 12*5)) * intensity(note, 5));
}

# call sample_val as:
# for (int i = 0 ; i < 1000000 ; i++)
#   send_to_speaker(sample_val(69, i));

Comment via: google plus, facebook, r/WeAreTheMusicMakers

Recent posts on blogs I like:

Circumferential Lines and Express Service

In a number of large cities with both radial and circumferential urban rail service, there is a curious observation: there is express service on the radial lines, but not the circumferential ones. These cities include New York, Paris, and Berlin, and to s…

via Pedestrian Observations September 15, 2019

Reframing the evolutionary benefit of sex

From the perspective of an organism trying to propagate its genes, sex is like a trade: I’ll put half of your DNA in my offspring if you put half of my DNA in yours. I still pass one copy of my genes onto the next generation per unit of investment in chil…

via The sideways view September 14, 2019

Bear store

A preschool game that’s been particularly popular and versatile with my kids. Materials: Pennies Collection of counting bears or any other small objects One person is the storekeeper and sets out the bears in any way they want. The other people are custom…

via The whole sky September 9, 2019

more     (via openring)

More Posts:


  ::  Posts  ::  RSS  ::  ◂◂RSS  ::  Contact