Try to avoid them. Sometimes they are the answer but most of the time you want to make the relationship of arguments to behavior of the instrument very explicit. Global variables hide behavior and make bugs difficult to find. This is where the actual executable code resides. Our simp instrument has just one form in its body.
All lisp functions return a value.
The returned value can be anything, a number, a list, a string, you name it. It then proceeds to evaluate all the forms in its body with those bindings active. In our simp instrument beg and end get bound to the beginning and ending samples of the note. A let evaluates each lisp form and binds it to the name it is paired with. It then proceeds to evaluate all the forms in its body with those bindings active.