• Posts
  • RSS
  • ◂◂RSS
  • Contact

  • Wrapping Bass: Implementation

    February 3rd, 2012
    music, octaveless
    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:

    Interview with Kat Woods: decision-making about having kids

    Realizing what you don't want The post Interview with Kat Woods: decision-making about having kids appeared first on Otherwise.

    via Otherwise July 5, 2022

    Decision theory and dynamic inconsistency

    Here is my current take on decision theory: When making a decision after observing X, we should condition (or causally intervene) on statements like “My decision algorithm outputs Y after observing X.” Updating seems like a description of something you do…

    via The sideways view July 3, 2022

    10x (engineer, context) pairs

    Your actual output depends on a lot more than just how quickly you finish a given programming task. Everything besides the literal coding depends deeply on the way you interact with the organization around you.

    via benkuhn.net June 9, 2022

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact