[Lazarus] Update sound shop my next tutoring project

Marc Weustink marc at dommelstein.nl
Thu May 16 13:22:39 CEST 2019


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


More information about the lazarus mailing list