Anthony Walter via lazarus wrote:
Marc,

That is interesting and you've given me something to consider and perhaps adjust. Thank you.

Also with regards to attack and release, I've opted to call it just attack. That is when the note is starting to play, or ending playing, I perform a short fade of the wave form on both ends using the same value. I also mix in a sustain which I am using to fade the note out over time after the initial attack.

So the formula I am using is assuming a note is playing (StartTime >= CurrentTime):

if StartTime - CurrentTime < Attack then
   Mix := StartTime - CurrentTime / Attack
else
   Mix := 1;

Then I used the Mix blend variable to adjust the wave amplitude (Volume) by multiplying it against the left and right channels.

// Sample Left and Right are a 16 bit signed integers
Sample.Left := Trunc(AudioWave(F) * Volume * Mix);
Sample.Right := -Sample.Left;

Where:

F is the a value between 0.0..1.0 representing the current wave cycle
AudioWave is the user defined function to convert F into a wave shape returning a value between -1.0..1.0 Volume is the peak we allow for the Left or Right on Sample (in my case the constant value 2048) Mix is between 0.0..1.0 and is used to fade in for attack, fade out for release, and fade out using sustain

So I should fix this by adding a tiny bit of phase change to F based on which keyboard key is being processed.

As long as you don't reset F to 0 when playing a new note this should work.

To verify, you can use Audacity to record the generated audio (or write it to file as raw pcm). If you switch to spectogram view, you see those phase errors as a spike in the diagram


Marc
--
_______________________________________________
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus

Reply via email to