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

    Some reasons to work on productivity and velocity

    A common topic of discussion among my close friends is where the bottlenecks are in our productivity and how we can execute more quickly. This is very different from what I see in my extended social circles, where people commonly say that velocity doesn…

    via Posts on Dan Luu October 15, 2021

    EDT with updating double counts

    I recently got confused thinking about the following case: Calculator bet: I am offered the opportunity to bet on a mathematical statement X to which I initially assign 50% probability (perhaps X = 139926 is a quadratic residue modulo 314159). I have acce…

    via The sideways view October 12, 2021

    Meditations on newborns

    [Content: death.]I wrote most of this a couple of months ago when Nora was a newborn, but the first few months are not that conducive to finishing blog posts. New babies put you into a liminal period, both in your own experience and in how others treat yo…

    via The whole sky October 3, 2021

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact