_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
gitignore: add *.mp3 *.flac *.ogg
generally review and improve documentation

* move several sections one level up from inside Splat
* fix whitespace and formatting for consistency
* add and improve examples
* add list of external links
* adjust titles and reorder parts
* fix typos and reword a few things
remove extra blank lines before docstrings

To be consistent, remove any blank line between the
class declaration and the associatd docstring.
splat.scales: tidy-up and add docstrings

* rename Scale.base to pitch
* remove degrees, there are only steps
* add Scale.key property
* add Scale.f0 property
* give more flexibility in initialising the scale by not
  inforcing fixed steps
* LogScale: calculate each frequency directly in get_freq
* HarmonicScale: fix rounding errors by not using the math.pow
  function, and create more even steps by centering them around
  the fundamental frequency
* add docstrings everywhere
test.py: add ScaleTest

Add basic tests cases for LogScale and HarmonicScale.
doc: add section about scales

* add general section about scales
* add sub-section to define scale concepts + small example
* add sub-section about scale objects

+ add Beep in introduction