_splat.c: add 24-bit integer import/export

* add splat_{import,export}_int24 functions (little endian)
* add entry to splat.audio_formats
* tidy-up code formatting and constants
doc/audio_formats.rst: improve and add 24-bit integer
splat.data: use audiotools to support more formats

If the audiotools Python package is installed, add support to
open and save fragments into files in more standard formats like
Flac, Ogg and MP3.

+ update documentation about audio file formats

audiotools homepage: http://audiotools.sourceforge.net/
splat.data.save_saf: fix md5 with truncated fragments

When saving in saf format, compute the MD5 sum only over the
part of the fragment being saved to the file (start and end
arguments).  Also set the correct data length.
_splat.c: Fragment_mix: rename length to duration

The convention is to use length for a number of samples,
and duration in seconds.  The ratio between the two is
the sample rate of a given fragment.
_splat.c: add signals to Fragment_amp

The gains for each channel can now be signals instead of only
floats, for example to apply an envelope over a fragment.  There
is an optimised implementation when all gains are float to keep
it as fast as before.

+ tidy-up code in Fragment_mix
splat.plot.spline: add circles for each point

Draw a circle around each point that defines the spline
to help identify the different sections (polynomials).
splat.interpol: add splat.interpol.PolyList + deriv/integral

* add splat.interpol.PolyList to manage all the spline
  polynomials with .points, .value, .derivative and .integral
  to directly get all the data points, spline value as well as
  derivative and integral as PolyList objects

* make Spline derive from PolyList; it now only calculates the
  polynomials using a PolyMatrix to build the PolyList object
splat.interpol: add freqmod function

Add splat.interpol.freqmod function to return a Spline object
which can then be used to perform a frequency (phase) modulation
based on a set of (time, frequency) points.  This is because the
phase modulation needs to be the integral of the instantaneous
frequency.  It's also normalised with the initial frequency.
splat.interpol.Spline: convert to function

Convert splat.interpol.Spline to splat.interpol.spline function
which returns a PolyList object.  This simplifies the
implementation and does not change the interface which is now
all contained in PolyList.

+ update and improve docstrings
splat.gen: use splat.interpol.spline + update docstrings
test.py: use splat.interpol.spline
doc/splat.rst: update splat.interpol + add example
build-0012