Generating Musical Notes
Daniel McKinnon

Hi,

I am trying to make a very simple synthesizer program.

what I have done so far is created a 8-byte saw-wave sample

char saw[8]= { 0, 64, 128, 64, 0, -64, -128, -64 };

Set up the musical scale

       double scale[13] = { 440.00, 466.16, 493.88, 523.25, 554.37, 587.33, 622.25, 659.26, 698.46, 739.99, 783.99, 830.61, 880.00 };
       char note = 0;

initialized the sound

       reserve_voices( 1 );
       install_sound( DIGI_AUTODETECT, MIDI_NONE, 0 );

Create the sample

  s = create_sample( 8, 0, 1, 8 );
  memcpy( s->data, saw, sizeof(char)*8 );

Setup the voice to play the note on a scale

  v = allocate_voice( s );
  voice_set_volume( v, 255 );
  voice_set_frequency( v, scale[note] );
  voice_set_playmode( v, PLAYMODE_LOOP );
  voice_set_pan( v, 128 );

And then start up the voice

       voice_start( v );

This definitely doesn't provide the results I expected, and I am now at a loss as to how this is actually done.

I don't understand fine control of frequencies either. I have to change the frequency ( voice_set_frequency( int voice, int frequency ) ) by somewhere around 150 to change the sound, and that change is very course.

So I was hoping someone would enlighten me about music generation.

miran

1. Use AUDIOSTREAMs, not voices.

2. When you generate samples for the audiostream, the value of each sample is a function of the sample offset in the audiostream and frequency. For example when playing the middle A (440 Hz), every 440th sample will have a value of 0 and the samples will increase linearly from 0 to maximum amplitude for 440 samples. This way you make a simple saw signal.

3. You can mix several saw signals at slightly different frequencies to get a better sound.

4. Modulate frequency and amplitude for more variety...

Johan Halmén

In your sample, one wave length is only 8 bytes. Wave lengths are generally hundreds of bytes. Try using longer samples and adjust everything to that.

If your sound generator works with 44 kHz and you want to play a sound of 440 Hz, one wave length would be exactly 100 bytes.

miran

Oops yeah, that's what I meant in my first post under item #2. The wave length depends on the sampling frequency and the note frequency, so at 44 kHz a 440 Hz note is 100 samples...

Thread #586679. Printed from Allegro.cc