On Wed, 2006-11-22 at 18:56 +0100, Leonard "paniq" Ritter wrote:
paul,
we recently ported the buzzhost to linux ( = aldrin). a default
convention in this program is to mix into float buffers in the -32768 to
32767 range. only recently we changed all the code to keep to -1 .. 1.
it has been claimed numerous times that buzz' sound quality was worse
than what you are used to. i couldn't hear that and i blame it on lack
of talent and mastering skills on the artists side, but i'm still
curious whether an implementation such as above can significantly impact
on the dynamic quality of digital music.
what do you say?
the truly precise range is limited to the width of the mantissa: N bits,
where N is fixed depending on whether its a 32 bit float or an 80 bit
double. you can use those N bits anyway you want: you've got a signal
that varies between zero and the maximum voltage handled by a given D/A
converter, and you've got 2^N (plus or minus 1) values to represent them
with. you've got choices about how you use them:
a) just use 16 bits of the mantissa, and fix the exponent bits
(-32768...+32767)
b) use all 24 bits of the mantissa, and fix the exponent bits
(-2^24 ... + 2^24 - 1)
c) use all 24 bits of the mantissa, and vary the exponent bits
(-2^24 ... + 2^24 - 1) * 10^{0...7}
d) use a normal floating point representation
e) use all 24 bits of the mantissa but with normalized values,
which implies varying the exponent
there are more.
(a) is similar to the case you were describing, and it has only 16 bits
of resolution for the non-summing mixer situation. kind of a waste of 8
bits, no? its only benefit over 16 bit values is that if you sum them
and the answer > 2^16 - 1, you don't clip, you just get the potential
for a small amount of distortion.
the way to get this into your head, or at least the way i got it into
mine, was to forget the idea of associating specific numbers with bit
patterns in the floating point representation. just think of there being
a set of 2^24 - 1 ordered bit patterns, each one of them representing
some analog signal level. depending on what you do with the exponent
bits, these bit patterns could be thought of as representing integer
values between 0 and 2^24, or between -2^24..+2^24-1, or floating point
values between -1 and +1, or many other ranges, or nothing at all.
--p