Struggling with LibSndFile.jl, WAV.jl outputs slightly non-standard 24bit PCM files

I’m struggling with loading a wav file using LibSndFile.jl

julia> using FileIO: load, save, loadstreaming, savestreaming

julia> import LibSndFile

julia> x = load("JolieHollandSacha.wav")
([0.0 0.0; 0.0 0.0; … ; 0.0 0.0; 0.0 0.0], 44100.0f0, 0x0010, WAV.WAVChunk[WAV.WAVChunk(Symbol("fmt "), UInt8[0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00])])

julia> x[1:10]
ERROR: BoundsError: attempt to access Tuple{Matrix{Float64}, Float32, UInt16, Vector{WAV.WAVChunk}} at index [5]
Stacktrace:
 [1] getindex
   @ ./tuple.jl:31 [inlined]
 [2] #87
   @ ./range.jl:434 [inlined]
 [3] ntuple
   @ ./ntuple.jl:19 [inlined]
 [4] getindex(t::Tuple, r::UnitRange{Int64})
   @ Base ./range.jl:434
 [5] top-level scope
   @ REPL[4]:1

julia> 

according to the LibSndFile main Git page, this should be the result:

Julia> using FileIO: load, save, loadstreaming, savestreaming
julia> import LibSndFile
julia> load("audiofile.wav")
2938384-frame, 1-channel SampleBuf{FixedPointNumbers.Fixed{Int16,15}, 2}
66.63002267573697s sampled at 44100.0Hz`

x = load("myfile.wav")
plot(x[:, 1]) # plots with samples on the x axis

according to sox, the wav file I’m trying to load is fine, and I can load it into Matlab

perrin@perrinamdlaptop:~/perrin2013/SCaRF_Julia/LibSndFile$ soxi JolieHollandSacha.wav 

Input File     : 'JolieHollandSacha.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:03:08.89 = 8330196 samples = 14167 CDDA sectors
File Size      : 33.3M
Bit Rate       : 1.41M
Sample Encoding: 16-bit Signed Integer PCM

Any help would be greatly appreciated.

ok, it appears

x = load("JolieHollandSacha.wav")
```julia> x[1]
8330196×2 Matrix{Float64}:
 0.0  0.0
 [...]

now returns a Tubple and it appears to have re scaled the 16btit Int wav data into Float64 normalized to -1 … +1 (that’s standard).

julia> maximum(x[1][:,1])
0.988494521927549

so now I need the magic incantation to re-save a wav file in 16 bit int (or 24 bit int…) and also how to specify the sample rate…

thanks…

If typeof(x) tells you that what you got returned is a value of type SampledSignals.SampleBuf{FixedPointNumbers.Q0f15, 1}, that would be simply a struct of the form

mutable struct SampleBuf{T, N} <: AbstractSampleBuf{T, N}
    data::Array{T, N}
    samplerate::Float64
end

and hence reading the SampledSignals.jl and FixedPointNumbers.jl README may help, and x.data[1:10] may be closer to what you wanted.

However, I suspect in addition to LibSndFile.jl you also previously had loaded the WAV.jl package, which also overloads load, and that your load call was therefore actually dispatched to WAV.wavread instead and returned the same tuple that calling wavread directly would have (type ?WAV and ?wavread for the manual).

[I generally would advise against using FileIO and its overloaded load function, as that just hinders users finding the documentation for the actual file-loading function being called. FileIO is one of those things that may have seemed like a good idea at the time, but actually causes more confusion than being user friendly.]

thanks, but I was literally cutting and pasting from the very top README of the LibSndFile.jl git site… and No, I started a fresh session, so I did not load WAV.jl )

I’ve used Matlab for 20+ years but I’m not a julia power user so I really just need examples to start with… the “advanced” type stuff of Julia is a little beyond my Matlab/Fortran roots.. thanks…

https://github.com/JuliaAudio/LibSndFile.jl

(I opened an “issue” on the github page for LibSndFile.jl, but the project appears unmaintained. sigh. I guess I will try WAV.jl, but I was unsure as to how to get that to save a file in 24bit too).

For the record, I have confirmed that WAV.jl correctly writes out 24bit Signed Integer PCM WAV files.

First, I ripped a track off of CD, so its 16Bit Signed PCM at 44_100Hz sampling, as confirmed by the (excellent) soxi utility.:

psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ soxi JolieHollandSacha.wav 
Input File     : 'JolieHollandSacha.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:03:08.89 = 8330196 samples = 14167 CDDA sectors
File Size      : 33.3M
Bit Rate       : 1.41M
Sample Encoding: 16-bit Signed Integer PCM

then I used WAV.jl to read in the WAV file, and then re-save as 24 bit PCM and 32bit PCM WAV files:

using WAV
y,Fs,nbits,stuff = wavread("JolieHollandSacha.wav") #16bit 44_100Hz sampling (ripped from CD) 
y_int_24 = floor.(Int32,y * 2^23)
wavwrite(y_int_24,"test_WAV_dot_jl__24bit.wav",Fs=44_100,nbits=24,compression=WAVE_FORMAT_PCM)
y_int_32 = floor.(Int32,y * 2^31)
wavwrite(y_int_32,"test_WAV_dot_jl__32bit.wav",Fs=44_100,nbits=32,compression=WAVE_FORMAT_PCM)

Note that as is the custom (Matlab, Audacity), even though the original WAV file is 16bit Signed Integer PCM, wavread converts to a Float64 array scaled between -1.0 and +1.0. So when writing out I re-converted to Int32. For 24bit the scaling is 2^23, and for 32bit its 2^31.

I then read all the files into Audacity (another excellent open source audio application), and confirmed the wavforms were the same and they sound identical. I also used Audacity to save versions of original file in 24bit PCM and 32bit PCM, and I compared the file sizes, which match as expected:

psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ ls -larth *.wav
-rw-r--r--  1 perrin  staff    32M May 15 17:05 JolieHollandSacha.wav
-rw-r--r--  1 perrin  staff    48M May 15 20:53 test_WAV_dot_jl__24bit.wav
-rw-r--r--  1 perrin  staff    64M May 15 20:53 test_WAV_dot_jl__32bit.wav
-rw-r--r--@ 1 perrin  staff    48M May 15 20:58 test_audacity_24bit_PCM.wav
-rw-r--r--@ 1 perrin  staff    64M May 15 20:58 test_audacity_32bit_PCM.wav

and as expected sox is happy too:

psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ soxi *.wav

Input File     : 'JolieHollandSacha.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:03:08.89 = 8330196 samples = 14167 CDDA sectors
File Size      : 33.3M
Bit Rate       : 1.41M
Sample Encoding: 16-bit Signed Integer PCM

Input File     : 'test_audacity_24bit_PCM.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 24-bit
Duration       : 00:03:08.89 = 8330196 samples = 14167 CDDA sectors
File Size      : 50.0M
Bit Rate       : 2.12M
Sample Encoding: 24-bit Signed Integer PCM

Input File     : 'test_audacity_32bit_PCM.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 32-bit
Duration       : 00:03:08.89 = 8330196 samples = 14167 CDDA sectors
File Size      : 66.6M
Bit Rate       : 2.82M
Sample Encoding: 32-bit Signed Integer PCM

Input File     : 'test_WAV_dot_jl__24bit.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 24-bit
Duration       : 00:03:08.89 = 8330196 samples = 14167 CDDA sectors
File Size      : 50.0M
Bit Rate       : 2.12M
Sample Encoding: 24-bit Signed Integer PCM

Input File     : 'test_WAV_dot_jl__32bit.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 32-bit
Duration       : 00:03:08.89 = 8330196 samples = 14167 CDDA sectors
File Size      : 66.6M
Bit Rate       : 2.82M
Sample Encoding: 32-bit Signed Integer PCM

(ok, digging deeper with the excellent LibSndFile command line tools, it appears that WAV.jl outputs slightly non-standard PCM WAV files, but the sndfile-convert command line tool seems to clean it up nicely. sndfile-info thinks that the Channel Mask should not be zero in the WAV.jl output, and for some reason WAV.jl sets the format to WAVE_FORMAT_EXTENSIBLE instead of WAVE_FORMAT_PCM). Im sure both are “compliant” but the WAV format is not really a real standard so I think the LibSndFile output is probably safer. Both loaded in Audacity (probably since audacity is based on LibSndFile)… , but other appliations (ProTools?) might get confused.)

If anyone can help me figure out how to use LibSndFile.jl that would be greatly appreciated, since in theory it would probably write out the same format as sndfile-conver(WAV.jl output))

psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ sndfile-info test_WAV_dot_jl__24bit.wav 
========================================
File : test_WAV_dot_jl__24bit.wav
Length : 49981244
RIFF : 49981236
WAVE
fmt  : 40
  Format        : 0xFFFE => WAVE_FORMAT_EXTENSIBLE
  Channels      : 2
  Sample Rate   : 44100
  Block Align   : 6
  Bit Width     : 24
  Bytes/sec     : 264600
  Valid Bits    : 24
  Channel Mask  : 0x0 (should not be zero)
  Subformat
    esf_field1 : 0x1
    esf_field2 : 0x0
    esf_field3 : 0x10
    esf_field4 : 0x80 0x0 0x0 0xAA 0x0 0x38 0x9B 0x71 
    format : pcm
data : 49981176
End
**** All non-PCM format files should have a 'fact' chunk.

----------------------------------------
Sample Rate : 44100
Frames      : 8330196
Channels    : 2
Format      : 0x00130003
Sections    : 1
Seekable    : TRUE
Duration    : 00:03:08.893
Signal Max  : 8.29363e+06 (-0.10 dB)

========================================================================================
========================================================================================
========================================================================================
oops

psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ sndfile-convert test_WAV_dot_jl__24bit.wav test_sndfile_convert_24bit.wav

and now:

psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ sndfile-info test_sndfile_convert_24bit.wav 
========================================
File : test_sndfile_convert_24bit.wav
Length : 49981220
RIFF : 49981212
WAVE
fmt  : 16
  Format        : 0x1 => WAVE_FORMAT_PCM
  Channels      : 2
  Sample Rate   : 44100
  Block Align   : 6
  Bit Width     : 24
  Bytes/sec     : 264600
data : 49981176
End

----------------------------------------
Sample Rate : 44100
Frames      : 8330196
Channels    : 2
Format      : 0x00010003
Sections    : 1
Seekable    : TRUE
Duration    : 00:03:08.893
Signal Max  : 8.29363e+06 (-0.10 dB)

The occurrence of the type WAV.WAVChunk in the tuple x in your very first example strongly suggests that you somehow did load and (indirectly) use wavread from WAV.jl.

If you file an issue with a fully reproducible MWE (i.e., short Julia script that demonstrates the problem), I might have a look at this.

I was very careful to start a fresh session yesterday (I was on my laptop)

Now I’m on my M4 Mac Mini, You can see I’m starting a fresh session.

psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ julia 
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.11.5 (2025-04-14)
 _/ |\__'_|_|_|\__'_|  |  
|__/                   |

julia> using FileIO: load, save, loadstreaming, savestreaming

julia> import LibSndFile

julia> x = load("JolieHollandSacha.wav")
([0.0 0.0; 0.0 0.0; … ; 0.0 0.0; 0.0 0.0], 44100.0f0, 0x0010, WAV.WAVChunk[WAV.WAVChunk(Symbol("fmt "), UInt8[0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00])])

julia> 




OK, something wacky is going on. I deleted my .julia cache, and ONLY reinstalled FileIO and LibSndFile. Now when I run the same lines, I get the output the LibSndFile.jl predicts from the README.md.

So it would appear that if WAV.jl is installed, it corrupts LibSndFile.jl?

So yes, I would greatly appreciate it if you could have a look.

A “simple” LibSndFile interface would be awesome tooo… thanks

psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ cd
psm_m4:~/$ cd .julia/
psm_m4:~/.julia/$ du -sh
147M	.
psm_m4:~/.julia/$ rm -rf * .*
rm: "." and ".." may not be removed
psm_m4:~/.julia/$ cd ..
psm_m4:~/$ rmdir .julia/
psm_m4:~/$ cd perrin2013/SCaRF_Julia/LibSndFile/
psm_m4:~/perrin2013/SCaRF_Julia/LibSndFile/$ julia 
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.11.5 (2025-04-14)
 _/ |\__'_|_|_|\__'_|  |  
|__/                   |

(@v1.11) pkg> update
  Installing known registries into `~/.julia`
       Added `General` registry to ~/.julia/registries
    Updating registry at `~/.julia/registries/General.toml`
  No Changes to `~/.julia/environments/v1.11/Project.toml`
  No Changes to `~/.julia/environments/v1.11/Manifest.toml`
        Info We haven't cleaned this depot up for a bit, running Pkg.gc()...
      Active manifest files: 1 found
      Active artifact files: 0 found
      Active scratchspaces: 0 found
     Deleted no artifacts, repos, packages or scratchspaces

(@v1.11) pkg> list
ERROR: `list` is not a recognized command. Type ? for help with available commands

(@v1.11) pkg> status
Status `~/.julia/environments/v1.11/Project.toml` (empty project)

(@v1.11) pkg> add Fil

FileCmp                   FileExplorer              FileIO
FileJockey                FilePaths                 FilePathsBase
FileTrees                 FileTypes                 FilesystemDatastructures
Filetimes                 FillArrays                FillOutliers
FilterHelpers             FilteredGroupbyMacro      FileWatching
(@v1.11) pkg> add FileIO,LibSndFile;
   Resolving package versions...
   Installed alsa_jll ──────────── v1.2.13+0
   Installed TreeViews ─────────── v0.3.0
   Installed oneTBB_jll ────────── v2022.0.0+0
   Installed IrrationalConstants ─ v0.2.4
   Installed FFTW ──────────────── v1.8.1
   Installed IntervalSets ──────── v0.7.11
   Installed Preferences ───────── v1.4.3
   Installed DSP ───────────────── v0.7.10
   Installed Opus_jll ──────────── v1.3.3+0
   Installed FixedPointNumbers ─── v0.8.5
   Installed libsndfile_jll ────── v1.1.0+0
   Installed MKL_jll ───────────── v2025.0.1+1
   Installed IterTools ─────────── v1.10.0
   Installed SpecialFunctions ──── v2.5.1
   Installed Unitful ───────────── v1.22.1
   Installed Setfield ──────────── v1.1.2
   Installed RecipesBase ───────── v1.3.4
   Installed AbstractFFTs ──────── v1.5.0
   Installed FLAC_jll ──────────── v1.3.4+2
   Installed JLLWrappers ───────── v1.7.0
   Installed OrderedCollections ── v1.8.0
   Installed ConstructionBase ──── v1.5.8
   Installed PrecompileTools ───── v1.2.1
   Installed StaticArraysCore ──── v1.4.3
   Installed SampledSignals ────── v2.1.4
   Installed libvorbis_jll ─────── v1.3.7+2
   Installed Ogg_jll ───────────── v1.3.5+1
   Installed Reexport ──────────── v1.2.2
   Installed LogExpFunctions ───── v0.3.29
   Installed Statistics ────────── v1.11.1
   Installed FileIO ────────────── v1.17.0
   Installed Polynomials ───────── v4.0.19
   Installed Requires ──────────── v1.3.1
   Installed IntelOpenMP_jll ───── v2025.0.4+0
   Installed FFTW_jll ──────────── v3.3.11+0
   Installed MacroTools ────────── v0.5.16
   Installed LibSndFile ────────── v2.4.0
   Installed OpenSpecFun_jll ───── v0.5.6+0
   Installed Compat ────────────── v4.16.0
   Installed DocStringExtensions ─ v0.9.4
  Downloaded artifact: oneTBB
  Downloaded artifact: Opus
  Downloaded artifact: libsndfile
  Downloaded artifact: FLAC
  Downloaded artifact: libvorbis
  Downloaded artifact: Ogg
  Downloaded artifact: FFTW
  Downloaded artifact: OpenSpecFun
    Updating `~/.julia/environments/v1.11/Project.toml`
  [5789e2e9] + FileIO v1.17.0
  [b13ce0c6] + LibSndFile v2.4.0
    Updating `~/.julia/environments/v1.11/Manifest.toml`
  [621f4979] + AbstractFFTs v1.5.0
  [34da2185] + Compat v4.16.0
  [187b0558] + ConstructionBase v1.5.8
⌅ [717857b8] + DSP v0.7.10
  [ffbed154] + DocStringExtensions v0.9.4
  [7a1cc6ca] + FFTW v1.8.1
  [5789e2e9] + FileIO v1.17.0
  [53c48c17] + FixedPointNumbers v0.8.5
  [8197267c] + IntervalSets v0.7.11
  [92d709cd] + IrrationalConstants v0.2.4
  [c8e1da08] + IterTools v1.10.0
  [692b3bcd] + JLLWrappers v1.7.0
  [b13ce0c6] + LibSndFile v2.4.0
  [2ab3a3ac] + LogExpFunctions v0.3.29
  [1914dd2f] + MacroTools v0.5.16
  [bac558e1] + OrderedCollections v1.8.0
  [f27b6e38] + Polynomials v4.0.19
⌅ [aea7be01] + PrecompileTools v1.2.1
  [21216c6a] + Preferences v1.4.3
  [3cdcf5f2] + RecipesBase v1.3.4
  [189a3867] + Reexport v1.2.2
  [ae029012] + Requires v1.3.1
  [bd7594eb] + SampledSignals v2.1.4
  [efcf1570] + Setfield v1.1.2
  [276daf66] + SpecialFunctions v2.5.1
  [1e83bf80] + StaticArraysCore v1.4.3
  [10745b16] + Statistics v1.11.1
  [a2a6695c] + TreeViews v0.3.0
  [1986cc42] + Unitful v1.22.1
  [f5851436] + FFTW_jll v3.3.11+0
⌅ [1d38b3a6] + FLAC_jll v1.3.4+2
  [1d5cc7b8] + IntelOpenMP_jll v2025.0.4+0
  [856f044c] + MKL_jll v2025.0.1+1
  [e7412a2a] + Ogg_jll v1.3.5+1
  [efe28fd5] + OpenSpecFun_jll v0.5.6+0
  [91d4177d] + Opus_jll v1.3.3+0
  [45378030] + alsa_jll v1.2.13+0
  [5bf562c0] + libsndfile_jll v1.1.0+0
  [f27f6e37] + libvorbis_jll v1.3.7+2
  [1317d2d5] + oneTBB_jll v2022.0.0+0
  [0dad84c5] + ArgTools v1.1.2
  [56f22d72] + Artifacts v1.11.0
  [2a0f44e3] + Base64 v1.11.0
  [ade2ca70] + Dates v1.11.0
  [f43a241f] + Downloads v1.6.0
  [7b1f6079] + FileWatching v1.11.0
  [9fa8497b] + Future v1.11.0
  [b77e0a4c] + InteractiveUtils v1.11.0
  [4af54fe1] + LazyArtifacts v1.11.0
  [b27032c2] + LibCURL v0.6.4
  [76f85450] + LibGit2 v1.11.0
  [8f399da3] + Libdl v1.11.0
  [37e2e46d] + LinearAlgebra v1.11.0
  [56ddb016] + Logging v1.11.0
  [d6f4376e] + Markdown v1.11.0
  [ca575930] + NetworkOptions v1.2.0
  [44cfe95a] + Pkg v1.11.0
  [de0858da] + Printf v1.11.0
  [9a3f8284] + Random v1.11.0
  [ea8e919c] + SHA v0.7.0
  [9e88b42a] + Serialization v1.11.0
  [2f01184e] + SparseArrays v1.11.0
  [fa267f1f] + TOML v1.0.3
  [a4e569a6] + Tar v1.10.0
  [8dfed614] + Test v1.11.0
  [cf7118a7] + UUIDs v1.11.0
  [4ec0a83e] + Unicode v1.11.0
  [e66e0078] + CompilerSupportLibraries_jll v1.1.1+0
  [deac9b47] + LibCURL_jll v8.6.0+0
  [e37daf67] + LibGit2_jll v1.7.2+0
  [29816b5a] + LibSSH2_jll v1.11.0+1
  [c8ffd9c3] + MbedTLS_jll v2.28.6+0
  [14a3606d] + MozillaCACerts_jll v2023.12.12
  [4536629a] + OpenBLAS_jll v0.3.27+1
  [05823500] + OpenLibm_jll v0.8.5+0
  [bea87d4a] + SuiteSparse_jll v7.7.0+0
  [83775a58] + Zlib_jll v1.2.13+1
  [8e850b90] + libblastrampoline_jll v5.11.0+0
  [8e850ede] + nghttp2_jll v1.59.0+0
  [3f19e933] + p7zip_jll v17.4.0+2
        Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`
Precompiling project...
  50 dependencies successfully precompiled in 18 seconds. 32 already precompiled.

(@v1.11) pkg> status
Status `~/.julia/environments/v1.11/Project.toml`
  [5789e2e9] FileIO v1.17.0
  [b13ce0c6] LibSndFile v2.4.0

julia> using FileIO: load, save, loadstreaming, savestreaming

julia> import LibSndFile

julia> x = load("JolieHollandSacha.wav")
8330196-frame, 2-channel SampleBuf{FixedPointNumbers.Q0f15, 2}
188.89333333333335s sampled at 44100.0Hz
▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▆▄▂
▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▆▄▂

julia> ^C

julia> 










yup. now when I install WAV.jl, it “corrupts” the load(“”) from LibSndFile. I agree it sounds like LibSndFile.jl using FileIO is a mess.

[ continuing on from last session, no Julia restart]

julia> x.samplerate
44100.0

(@v1.11) pkg> add WAV
   Resolving package versions...
   Installed WAV ─ v1.2.0
    Updating `~/.julia/environments/v1.11/Project.toml`
  [8149f6b0] + WAV v1.2.0
    Updating `~/.julia/environments/v1.11/Manifest.toml`
  [8149f6b0] + WAV v1.2.0
Precompiling project...
  1 dependency successfully precompiled in 1 seconds. 82 already precompiled.

julia> x = load("JolieHollandSacha.wav")
([0.0 0.0; 0.0 0.0; … ; 0.0 0.0; 0.0 0.0], 44100.0f0, 0x0010, WAV.WAVChunk[WAV.WAVChunk(Symbol("fmt "), UInt8[0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00])])

julia>