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:
Referenced in: Footboard Bass
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:
Bb B C Db A D Ab Eb G Gb F E
#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