Here's a rough sketch for some thinking about envelopes; this would happen in the loop if I get a TRUE return on a given tone isPlaying()
delta = (255/ attackLength[currentADSRfunction]);
end_time1 = Lasttime[CurrentVoice] + attackLength[currentADSRfunction];
while (millis() < end_time1)
{
end_time2 = millis() + 1;
while (millis() < end_time2)
ENVlevel[currentADSRfunction]; = ENVlevel[currentADSRfunction] + delta;
}
delta = (255 - sustainLevel[CurrentADSRfunction]/decayLength[currentADSRfunction]);
end_time1 = millisec() + decayLength[currentADSRfunction];
while (millis() < end_time1)
{
end_time2 = millis() + 1;
while (millis() < end_time2)
ENVlevel[currentADSRfunction]; = ENVlevel[currentADSRfunction] - delta;
}
end_time1 = millisec() + sustainLength[currentADSRfunction];
while (millis() < end_time1)
{
end_time2 = millis() + 1;
while (millis() < end_time2)
ENVlevel[currentADSRfunction]; = sustainLevel[CurrentADSRfunction];
}
delta = (sustainLevel[CurrentADSRfunction]/releaseLength[currentADSRfunction]);
end_time1 = millisec() + releaseLength[currentADSRfunction];
while (millis() < end_time1)
{
end_time2 = millis() + 1;
while (millis() < end_time2)
ENVlevel[currentADSRfunction]; = ENVlevel[currentADSRfunction] - delta;
}