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