We built a basic utility function to help simplify it visually when creating a new synth:
function _newSynth(a, d, s, r, volume, sound)
local synth = playdate.sound.synth.new(sound)
synth:setADSR(a, d, s, r)
synth:setVolume(volume)
return synth
end
and a few random very basic placeholder/in-progress UI sounds I've been using:
boop = _newSynth(0.2, 0.02, 0, 0, 0.6, snd.kWavePOVosim)
beep = _newSynth(0, 0.04, 0, 0, 0.25, snd.kWaveSawtooth)
blop = _newSynth(0, 0.1, 0, 0.2, 0.4, snd.kWavePOVosim)
...
boop:playNote(220)
boop:playNote(440)
beep:playNote(200)
blop:playNote(620)
It's probably going to depend how deep you want to get into sound design. Do you know how envelopes work in general? Or if you're interested in learning, that would be a good place to start. If you don't, you may find that twiddling with ADSR can sometimes feel a little frustrating or unintuitive.
One tip to keep in mind is that the audio functions all use seconds as values, but that envelopes (for short UI sounds) can often have very small values, so you may want to think about it in ms, as many DAWs do.
Attack, Delay, and Release might land between 0.00s and 1.00s generally, but not limited to it. It's important to note that Sustain works differently, it's a volume value between 0 and 1 that the note sustains when it's being held, which is only particularly relevant if you're also using the [length] property of :playNote() to play your note.
There's tons of great info online about envelopes and sound design, so it really depends how crazy you want to go. The infograph on this page is a pretty good explanation of ADSR.
Good luck!