• 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:

    The Gift of It's Your Problem Now

    Recently a security hole in a certain open source Java library resulted in a worldwide emergency kerfuffle as, say, 40% of the possibly hundreds of millions of worldwide deployments of this library needed to be updated in a hurry. (The other 60% also …

    via apenwarr January 1, 2022

    The container throttling problem

    This is an excerpt from an internal document David Mackey and I co-authored in April 2019. The document is excerpted since much of the original doc was about comparing possible approaches to increasing efficency at Twitter, which is mostly information tha…

    via Posts on December 18, 2021

    Experiences in raising children in shared housing

    Sometimes I see posts about people’s hope to raise children in a group housing situation, and it often seems overly optimistic to me. In particular they seem to expect that there will be more shared childcare than I think should be expected. Today I talke…

    via The whole sky October 18, 2021

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact