Discussion:
[SoX-devel] Sox generates WAV files which the Tascam DP32SD multitrack recorder can not understand
Sam Trenholme
2015-09-21 00:11:22 UTC
Permalink
Without modifying the header, the Tascam DP-32SD (a stand-alone
digital multitrack recorder) is unable to “grok” (acknowledge as a
valid .WAV file) a 24-bit 44.1khz monophonic .WAV file generated by
sox.

Because of this, the Tascam DP-32SD is unable to import 24-bit/44.1
SoX-generated files via the “Audio Depot” unless the .WAV header is
altered.

==Steps to reproduce==

Use the SoX program to generate a 24-bit wav file. For example:

sox foo.wav -b24 bar.wav gain -9

Put the resulting bar.wav file in the “Audio Depot” folder, and
attempt to import the file in to the DP32SD.

==Expected results==

The file is visible and can be imported in to the DP-32SD.

==Actual results==

WAV files generated by Sox are not visible in the DP-32SD until they
are altered.

Technical details

A Tascam DP-32SD has, for an “audio depot” 24/44.1 file header, the
following bytes (this is “hexdump” format; the numbers on the left are
hexadecimal numbers; the ASCII that follows is a representation of the
data):

00000000 52 49 46 46 XX XX XX XX 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
00000010 10 00 00 00 01 00 01 00 44 ac 00 00 cc 04 02 00 |........D.......|
00000020 03 00 18 00 64 61 74 61 WW WW WW WW WW WW WW WW |....data........|

The “XX” bytes above are a 32-bit little-endian representation of the
length of the file, and vary depending on the file length. “WW” is
audio data.

SoX, on the other hand, generates a 24/44.1 wav file with the following header:

00000000 52 49 46 46 XX XX XX XX 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
00000010 28 00 00 00 fe ff 01 00 44 ac 00 00 cc 04 02 00 |(.......D.......|
00000020 03 00 18 00 16 00 18 00 04 00 00 00 01 00 00 00 |................|
00000030 00 00 10 00 80 00 00 aa 00 38 9b 71 66 61 63 74 |.........8.qfact|
00000040 04 00 00 00 14 f5 5f 00 64 61 74 61 WW WW WW WW |......_.data....|

Again “XX” is length, and “WW” is audio data.

The following C program takes a Sox-generated 24/44.1 Wav file on the
standard input, and outputs a DP-32SD compatible file:

// Public Domain 2015 Sam Trenholme

// The DP32SD can not grok 24-bit/44.1 WAV files generated by SOX. This
// fixes the headers so that Tascam's DP32SD can understand them.

// Standard input: SOX-generated WAV file
// Standard output: DP32SD-comparible WAV file

#include <stdio.h>

main() {
int b;
int a;
for(a=0;a<16;a++) {
b = getc(stdin);
printf("%c",b);
}
int c;
printf("%c%c%c%c%c%c%c%c",0x10,0,0,0,1,0,1,0);
printf("%c%c%c%c%c%c%c%c",0x44,0xac,0,0,0xcc,4,2,0);
printf("%c%c%c%cdata",3,0,0x18,0);
for(a=0;a<60;a++) { getc(stdin); }
while(!feof(stdin)) {
b=getc(stdin);
if(!feof(stdin)) {printf("%c",b);}
}
}

- Sam

------------------------------------------------------------------------------
Måns Rullgård
2015-09-21 02:17:20 UTC
Permalink
Post by Sam Trenholme
Without modifying the header, the Tascam DP-32SD (a stand-alone
digital multitrack recorder) is unable to “grok” (acknowledge as a
valid .WAV file) a 24-bit 44.1khz monophonic .WAV file generated by
sox.
Because of this, the Tascam DP-32SD is unable to import 24-bit/44.1
SoX-generated files via the “Audio Depot” unless the .WAV header is
altered.
==Steps to reproduce==
sox foo.wav -b24 bar.wav gain -9
Try adding "-t wavpcm" before the output filename.
Post by Sam Trenholme
Technical details
A Tascam DP-32SD has, for an “audio depot” 24/44.1 file header, the
following bytes (this is “hexdump” format; the numbers on the left are
hexadecimal numbers; the ASCII that follows is a representation of the
00000000 52 49 46 46 XX XX XX XX 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
00000010 10 00 00 00 01 00 01 00 44 ac 00 00 cc 04 02 00 |........D.......|
00000020 03 00 18 00 64 61 74 61 WW WW WW WW WW WW WW WW |....data........|
This is a standard, original Microsoft WAVEFORMAT header. The value
0x0001 at offset 0x14 indicates PCM data. Although the header structure
can encode arbitrary values, only 8-bit and 16-bit PCM should use this
format.
Post by Sam Trenholme
SoX, on the other hand, generates a 24/44.1 wav file with the
00000000 52 49 46 46 XX XX XX XX 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
00000010 28 00 00 00 fe ff 01 00 44 ac 00 00 cc 04 02 00 |(.......D.......|
00000020 03 00 18 00 16 00 18 00 04 00 00 00 01 00 00 00 |................|
00000030 00 00 10 00 80 00 00 aa 00 38 9b 71 66 61 63 74 |.........8.qfact|
00000040 04 00 00 00 14 f5 5f 00 64 61 74 61 WW WW WW WW |......_.data....|
This is a WAVEFORMATEXTENSIBLE header, indicated by the format tag
0xfffe at file offset 0x14. This header adds additional fields at the
end allowing arbitrary bit depths as well as various other information.
It should be used whenever the bit depth is not 8 or 16.

Sox is doing the right thing in creating a WAVEFORMATEXTENSIBLE header
for 24-bit data, but apparently the Tascam software can't understand
this format (it's not alone in this, unfortunately), instead applying
less strict rules for the basic WAVEFORMAT header (everybody does this,
and rightly so).

The "-t wavpcm" option forces sox to use the short WAVEFORMAT header
even when this goes against the spec.

For more details, see https://msdn.microsoft.com/en-us/library/dd390971.aspx
--
Måns Rullgård
***@mansr.com

------------------------------------------------------------------------------
Sam Trenholme
2015-09-21 04:23:59 UTC
Permalink
I have verified that using the "-t wavpcm" option results in 24-bit
wav files which the Tascam DP-32SD can understand. I have summarized
the technical details and have filed a bug report on the Tascam forum
that discuses this unit.

- Sam
Post by Måns Rullgård
Post by Sam Trenholme
Without modifying the header, the Tascam DP-32SD (a stand-alone
digital multitrack recorder) is unable to “grok” (acknowledge as a
valid .WAV file) a 24-bit 44.1khz monophonic .WAV file generated by
sox.
Because of this, the Tascam DP-32SD is unable to import 24-bit/44.1
SoX-generated files via the “Audio Depot” unless the .WAV header is
altered.
==Steps to reproduce==
sox foo.wav -b24 bar.wav gain -9
Try adding "-t wavpcm" before the output filename.
Post by Sam Trenholme
Technical details
A Tascam DP-32SD has, for an “audio depot” 24/44.1 file header, the
following bytes (this is “hexdump” format; the numbers on the left are
hexadecimal numbers; the ASCII that follows is a representation of the
00000000 52 49 46 46 XX XX XX XX 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
00000010 10 00 00 00 01 00 01 00 44 ac 00 00 cc 04 02 00 |........D.......|
00000020 03 00 18 00 64 61 74 61 WW WW WW WW WW WW WW WW |....data........|
This is a standard, original Microsoft WAVEFORMAT header. The value
0x0001 at offset 0x14 indicates PCM data. Although the header structure
can encode arbitrary values, only 8-bit and 16-bit PCM should use this
format.
Post by Sam Trenholme
SoX, on the other hand, generates a 24/44.1 wav file with the
00000000 52 49 46 46 XX XX XX XX 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
00000010 28 00 00 00 fe ff 01 00 44 ac 00 00 cc 04 02 00 |(.......D.......|
00000020 03 00 18 00 16 00 18 00 04 00 00 00 01 00 00 00 |................|
00000030 00 00 10 00 80 00 00 aa 00 38 9b 71 66 61 63 74 |.........8.qfact|
00000040 04 00 00 00 14 f5 5f 00 64 61 74 61 WW WW WW WW |......_.data....|
This is a WAVEFORMATEXTENSIBLE header, indicated by the format tag
0xfffe at file offset 0x14. This header adds additional fields at the
end allowing arbitrary bit depths as well as various other information.
It should be used whenever the bit depth is not 8 or 16.
Sox is doing the right thing in creating a WAVEFORMATEXTENSIBLE header
for 24-bit data, but apparently the Tascam software can't understand
this format (it's not alone in this, unfortunately), instead applying
less strict rules for the basic WAVEFORMAT header (everybody does this,
and rightly so).
The "-t wavpcm" option forces sox to use the short WAVEFORMAT header
even when this goes against the spec.
For more details, see https://msdn.microsoft.com/en-us/library/dd390971.aspx
--
Måns Rullgård
------------------------------------------------------------------------------
Loading...