wav is a widely used audio file format created by Microsoft. It can contain audio data in a wide variety of formats but typically contains linear pulse code modulation data.

AF - here is a small package I started for reading some basic info from wav files.

 package provide wav 0.1

 namespace eval ::wav {}

 proc ::wav::info {file} {
    set fh [open $file r]
    binary scan [read $fh 12] A4iA4 sig1 len sig2
    if {$sig1 != "RIFF" || $sig2 != "WAVE"} { close $fh; return -code error "Not a WAV file" }
    binary scan [read $fh 24] A4issiiss id size format channels samplerate byterate align bitrate
    set len [expr {[file size $file] - [tell $fh] - 8 - ($size - 16)}] 
    close $fh
    return [list format $format channels $channels samplerate $samplerate byterate $byterate bitrate $bitrate size $len]

 array set data [::wav::info $argv]

 if {$data(channels) == 1} {
    set chans mono
 } elseif {$data(channels) == 2} {
    set chans stereo
 } else {
    set chans "$data(channels) channels"

 puts "$argv: [expr {$data(size) / double($data(byterate))}] seconds, [expr {int($data(samplerate) / 1000.00)}]KHz, $data(bitrate)bit, $chans"

RS: This code snippet works for playing WAV files on Win95,... :

  exec sndrec32 /play /close [file nativename $f]

See also: WAV Dump

SeS : 3rd August 2014

If you happen to have included ffidl package to your GUI distribution, you might also want to consider the following as an alternative:

ffidl::callout dll_sndPlaySound \
   {pointer-utf8 int} int \
   [ffidl::symbol winmm.dll sndPlaySoundA]

set mode(sync)  0   ;# play synchronously (default)
set mode(async) 1   ;# play asynchronously
set mode(loop)  8   ;# loop

dll_sndPlaySound [file nativename $filename] [expr $mode(async) + $mode(loop)]

This (and more) DLL call(s) will also be added to the ffidl-wrapper library of following releases of tG².