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

    Not Everything is Like Rail Transport

    Sometimes, when I write about cost comparisons or public-sector incompetence, I see people make analogies to other fields. and sometimes these analogies are really strained. So I want to make this clear that I am talking about things that are specific to …

    via Pedestrian Observations April 30, 2021

    Collections: Teaching Paradox, Europa Universalis IV, Part I: State of Play

    This is the first post in a series that will be examining the historical assumptions of Paradox Interactive’s grand strategy computer game set in the early modern period, Europa Universalis IV. And this series will in turn be part of a larger series looki…

    via A Collection of Unmitigated Pedantry April 30, 2021

    Books and websites on babies

    Several people I know are expecting a first baby soon, and I wrote up notes for one of them. Might as well share here too: Medical:Scott Alexander’s Biodeterminist’s Guide to Parenting is an interesting read, and some parts are actionable.  If you live in…

    via The whole sky April 14, 2021

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact