AVR
From Just Solve the File Format Problem
AVR;;; Audio Visual Research sample file format. Public domain.
The .AVR sample file format sees use on the Atari ST(e) and older Apple Macintosh computers. Commonly used for 8 bit audio, sometimes 16.
Some Atari music software supporting AVR: Quartet, Zero-X, Breakthru, EPSS, Sound Lab.
/* All fields are big endian. */
struct AVR_HEADER {
char magic_number[4]; /* "2BIT" */
char title[8]; /* Title, padded with 0s. No 0 terminator is
needed at the end, all 8 characters can
be used for text. */
signed short int stereo; /* -1 = stereo, 0 = mono. Stereo data is
interleaved like a .wav file, LRLRLR.. */
signed short int bits; /* Bits per sample. Usually 8 or 16. 16 bit
sample data is big endian. */
signed short int signed; /* -1 = signed, 0 = unsigned. The convention
is to use unsigned for 8 bit recordings.
Some programs may rely on this. */
signed short int loop; /* -1 = loop enabled, 0 = loop disabled. */
signed short int midi_note; /* Can be one of these three:
-1: No MIDI note assigned (most common).
0xffnn: MIDI note number nn assigned.
0xllhh: MIDI note ll for the low key,
and MIDI note hh for the high
key. This mode isn't well-
documented, presumably it
specifies a range of keys to map
the sample across. In this case
it is unclear how the root note
is determined. */
unsigned long int samp_rate; /* Sample rate in Hz. IMPORTANT: the upper
byte of this must be masked off.
The upper byte contains undocumented data
unrelated to sample rate, very frequently
non-zero.
samp_rate = samp_rate & 0x00ffffff;
Some programs will only look at the low
two bytes of this field, limiting the
maximum sample rate to 65535 Hz. */
unsigned long int length; /* Recording length in sample periods. */
unsigned long int loop_start; /* Loop start point in sample periods.
If the loop is switched off, this can be
set to 0 (but doesn't have to be).
This should be <= loop_end, but don't
rely on this when reading a file. */
unsigned long int loop_end; /* Loop end point in sample periods. This
points to the first sample which is never
played (the previous sample is the last
one played before looping back to
loop_start). If there is no data to the
right of the loop_end point, this will
have the same value as length.
If the loop is switched off, this can be
set to 0 (but doesn't have to be).
This should be <= length, but don't rely
on this when reading a file. */
signed short int key_split; /* Undocumented, usually 0. */
signed short int compression; /* Undocumented, usually 0. */
signed short int reserved; /* Undocumented, usually 0. */
char title_extra[20] /* Usually 0. Some programs use this space
as additional characters for title[],
only when title[7] is non-zero.
When writing a file, it is best to set
these to zero.
Some programs may use this for other
purposes. */
char comment[64]; /* Text comment. Padded with 0s.
It is unclear whether this needs to be
terminated with a 0. Assume un-terminated
when reading, and write terminated. */
}; /* Total length of header: 128 bytes fixed-size. Sample data begins
immediately after header. */
Definitions:
signed short int: 16 bits big-endian two's complement, -32768 to +32767.
unsigned long int: 32 bits big-endian, 0 to +4294967296.
char: A single byte.
0: A zero value or byte (not an ASCII '0').
0xnn A hexadecimal value nn.
Sample: One or two bytes making up a single numerical value for
one data point on one channel.
Sample period: A group of samples, one sample for each channel.
Recording: The whole sample data. The entire file, sans header.
Signed: Sample data represented by signed two's complement
integers.
Unsigned: Sample data represented by unsigned integers, no-signal
idle level (0 volts) stored as 128 (8 bit) or
32768 (16 bit). Values above this represent positive
voltages. To convert from signed to unsigned or vice-
versa, invert the most significant bit.