MIDI-SoundFont
view release on metacpan or search on metacpan
doc/headers.c view on Meta::CPAN
*
* 0: header size in shorts (8 = 16 bytes) (OGI says this is in bytes)
* 2: version (1)
* 4: chans
* 6: rate (srate = 4000000/rate)
* 8: samples (int) -- seems to be off by 2 -- are they counting ints here?
* 12: data format (0 = big-endian)
* 16: data start
*/
static int read_adc_header(const char *filename, int fd)
{
bool little;
little = (mus_char_to_uninterpreted_int((unsigned char *)(hdrbuf + 12)) != 0); /* 0 = big endian */
data_location = 16;
if (little) data_format = MUS_LSHORT; else data_format = MUS_BSHORT;
chans = big_or_little_endian_short((unsigned char *)(hdrbuf + 4), little);
srate = 4000000 / big_or_little_endian_short((unsigned char *)(hdrbuf + 6), little);
data_size = 2 * big_or_little_endian_int((unsigned char *)(hdrbuf + 8), little);
comment_start = 0;
comment_end = 0;
true_file_length = SEEK_FILE_LENGTH(fd);
if (data_size > true_file_length)
{
data_size = true_file_length - data_location;
if (data_size < 0) return(mus_error(MUS_HEADER_READ_FAILED, "%s: data_size = " OFF_TD "?", filename, data_size));
}
data_size = mus_bytes_to_samples(data_format, data_size);
return(MUS_NO_ERROR);
}
/* ------------------------------------ AVR --------------------------------------
*
* 0: "2BIT"
* 4: sample name (null padded ASCII)
* 12: chans (short) (0 = mono, -1 = stereo)
* 14: sample size (8 or 16 bit) (short) (value is 8, 12, or 16)
* 16: sample format (signed or unsigned) (short) (0 = unsigned, -1 = signed)
* 18: loop (on/off), 20: midi (-1 = no MIDI)
* 22: srate
* avr.txt has:
* 22: Replay speed 0 = 5.485 Khz, 1 = 8.084 Khz, 2 = 10.971 Khz, 3 = 16.168 Khz, 4 = 21.942 Khz, 5 = 32.336 Khz, 6 = 43.885 Khz, 7 = 47.261 Khz
* 23: sample rate in Hertz (as a 3 byte quantity??)
* 26: length in samples
* 30: loop beg, 34: loop end, 38: midi (keyboard split), 40: compression, 42: nada ("reserved"), 44: name
* 64: comment (limited to 64 bytes)
* 128: data start
*
* the Atari .avr files appear to be 8000 Hz, mono, 8-bit linear unsigned data with an unknown header of 128 words
* apparently there was a change in format sometime in the 90's.
*
* The actual avr files I've found on the net are either garbled, or
* something is wrong with this definition (taken from CMJ and www.wotsit.org's avr.txt).
* SGI dmconvert assumes big-endian here -- this is an Atari format, so it's probably safe to assume big-endian.
*/
static int read_avr_header(const char *filename, int fd)
{
int dsize, dsigned, i;
chans = mus_char_to_bshort((unsigned char *)(hdrbuf + 12));
if (chans == 0) chans = 1; else if (chans == -1) chans = 2; else return(mus_error(MUS_HEADER_READ_FAILED, "%s chans: %d", filename, chans));
data_location = 128;
data_size = mus_char_to_bint((unsigned char *)(hdrbuf + 26));
srate = mus_char_to_ubshort((unsigned char *)(hdrbuf + 24));
dsize = mus_char_to_bshort((unsigned char *)(hdrbuf + 14));
dsigned = mus_char_to_bshort((unsigned char *)(hdrbuf + 16));
if (dsize == 16)
{
if (dsigned == 0)
data_format = MUS_UBSHORT;
else data_format = MUS_BSHORT;
}
else
{
if (dsize == 8)
{
if (dsigned == 0)
data_format = MUS_UBYTE;
else data_format = MUS_BYTE;
}
else return(mus_error(MUS_HEADER_READ_FAILED, "%s: unknown data format", filename));
}
if (seek_and_read(fd, (unsigned char *)hdrbuf, 64, 64) <= 0)
return(mus_error(MUS_HEADER_READ_FAILED, "%s avr header: ran off end of file", filename));
comment_start = 64;
i = 0;
while ((i < 64) && (hdrbuf[i] != 0)) i++;
comment_end = 64 + (i - 1);
true_file_length = SEEK_FILE_LENGTH(fd);
if (data_size > true_file_length)
{
data_size = true_file_length - data_location;
if (data_size < 0) return(mus_error(MUS_HEADER_READ_FAILED, "%s: data_size = " OFF_TD "?", filename, data_size));
}
data_size = mus_bytes_to_samples(data_format, data_size);
return(MUS_NO_ERROR);
}
/* ------------------------------------ SNDT -------------------------------------
*
* this taken from sndrtool.c (sox-10): (modified 6-Feb-98)
* 0: "SOUND" (or off by two throughout if not "0x1a"?)
* 5: 0x1a
* 6-7: 0
* 8-11: nsamps (at 12)
* 12-15: 0
* 16-19: nsamps
* 20-21: srate (little endian short) (at 22)
* 22-23: 0
* 24-25: 10
* 26-27: 4
* 28-> : <filename> "- File created by Sound Exchange"
* .->95: 0 ?
*/
/* similar is Sounder format:
* 0: 0
* 2: short srate (little endian)
* 4: 10
* 6: 4
* then data
* but this format can't be distinguished from a raw sound file
*/
static int read_sndt_header(const char *filename, int fd)
{
if (hdrbuf[4] != 'D') return(mus_error(MUS_HEADER_READ_FAILED, "%s: SNDT[4] != 'D'", filename));
data_format = MUS_UBYTE;
chans = 1;
srate = mus_char_to_ulshort((unsigned char *)(hdrbuf + 20));
data_location = 126;
data_size = mus_char_to_lint((unsigned char *)(hdrbuf + 8));
if (data_size < 0) data_size = mus_char_to_lint((unsigned char *)(hdrbuf + 10));
if (srate <= 1) srate = mus_char_to_ulshort((unsigned char *)(hdrbuf + 22));
( run in 0.855 second using v1.01-cache-2.11-cpan-71847e10f99 )