traverse -package:base-compat -package:case-insensitive package:reactive-midyim
Before every note switch to another instrument according to a list of
programs given as state of the State monad. I do not know how to
handle multiple channels in a reasonable way. Currently I just switch
the instrument independent from the channel, and send the program
switch to the same channel as the beginning note.
This function extends
traverse. It reacts on external program
changes by seeking an according program in the list. This way we can
reset the pointer into the instrument list. However the search must be
limited in order to prevent an infinite loop if we receive a program
that is not contained in the list.