Add new class WrappingArray which wraps calls to [] over its size:

* Make chord inherit from WrappingArray
* Make scale inherit from WrappingArray

Chord and Scale are now therefore Arrays rather than things which sort
of acted a bit like arrays.
Breaking change - make *_i fns return integers rather than floats:

* Affects both rrand_i and rand_i
Don’t call .to_a on Scale, just return the scale object as is
Teach synth arg munger to pass the full args map to lambdas with arity 1

* Means you can now use the value of other args when computing the 
  current value.
* Warning: other args may not yet have been calculated and may also be 
  lambdas which means it may be possible to enter an infinite mutual 
  recursion hole if you try to call them and they try to call you…
Teach synth args to catch recursive loops:

* synth arg vals may be procs which may accept an arg which will be the
  current synth args.
* synth args hash is now monkey patched (on a per object basis) to call
  any procs vals when accessed via the [] method.
* hash also stores a trace of access so that cycles can be detected

THIS IS NOT THREADSAFE! *Only use in a single thread.*
Improve TB303 synth:

* Now supports separate cutoff ADSR envelope
* New args: cutoff_attack, cutoff_sustain, cutoff_decay, cutoff_release
  cutoff_min_slide, cutoff_attack_level, cutoff_sustain_level, 
  cutoff_env_curve
* cutoff ADSR values default to the equivalent values in the amp ADSR
  envelope
specify which markdown style we’re using in these docs
fix up docstrings
Add BPM scaling info to docs
add extra utility validation fns
Allow synth opts hash/array to be nil - resolving to an empty map
Allow note to play to be a proc - in which case simply call it
Teach play to just accept a single map argument:

* in which case it will extract :note key out (if it exists)
* If :note key points to nil then play breaks out early before triggering
  anything.
Add initial implementations of fns to change BPM based on sample duration

* Needs docs
Teach after to accept an optional params array:

* params array is treated as a ring buffer and cycled through repeatedly 
  if necessary
* block is now called with specific param map if arty is 1
add new incubation example