diff scripts/audio/wavwrite.m @ 5567:80e629357483

[project @ 2005-12-07 06:31:28 by jwe]
author jwe
date Wed, 07 Dec 2005 06:31:28 +0000
parents 2eeed655e801
children c45cf76df06f
line wrap: on
line diff
--- a/scripts/audio/wavwrite.m	Tue Dec 06 20:42:57 2005 +0000
+++ b/scripts/audio/wavwrite.m	Wed Dec 07 06:31:28 2005 +0000
@@ -36,21 +36,27 @@
 ## Author: Michael Zeising <michael.zeising@stud.uni-erlangen.de>
 ## Created: 06 December 2005
 
-function wavwrite (filename, y, samplesPerSec, bitsPerSample)
+function wavwrite (filename, y, samples_per_sec, bits_per_sample)
+
   BYTEORDER = "ieee-le";
   
-  # parse arguments
-  if (exist ("samplesPerSec","var") < 1)
-    warning ("wavwrite: sample rate set to 8000 Hz")
-    samplesPerSec = 8000;
+  if (nargin < 2 || nargin > 4)
+    usage ("wavwrite (filename, y, samples_per_sec, bits_per_sample)");
   endif
-  if (exist ("bitsPerSample","var") < 1)
-    warning ("wavwrite: sample resolution set to 16-bit")
-    bitsPerSample = 16;
+
+  ## parse arguments
+  if (nargin < 3)
+    warning ("wavwrite: sample rate set to 8000 Hz");
+    samples_per_sec = 8000;
+  endif
+
+  if (nargin < 4)
+    warning ("wavwrite: sample resolution set to 16-bit");
+    bits_per_sample = 16;
   endif
   
-  # determine sample format
-  switch bitsPerSample
+  ## determine sample format
+  switch (bits_per_sample)
     case 8  
       format = "int8";
     case 16 
@@ -58,57 +64,80 @@
     case 32 
       format = "int32";
     otherwise
-      fclose (fid);
       error ("wavread: sample resolution not supported");
   endswitch
   
-  # calculate filesize
+  ## calculate filesize
   channels = size(y)(2);
   n = size(y)(1);
+
+  ## size of data chunk
+  ck_size = n*channels*(bits_per_sample/8);
   
-  ckSize = n*channels*(bitsPerSample/8);       # size of data chunk
-  
-  # open file for writing binary
+  ## open file for writing binary
+
+  if (! ischar (filename))
+    error ("wavwrite: expecting filename to be a character string");
+  endif
+    
   [fid, msg] = fopen (filename, "wb");
   if (fid < 0)
     error ("wavwrite: %s", msg)
   endif
   
-  # write RIFF/WAVE header
+  ## write RIFF/WAVE header
   c = 0;
-  c += fwrite (fid, "RIFF",        "uchar");
-  c += fwrite (fid, ckSize + 36,   "ulong", 0, BYTEORDER);   # file size - 8
-  c += fwrite (fid, "WAVEfmt ",    "uchar");
-  c += fwrite (fid, 16,            "ulong", 0, BYTEORDER);   # size of fmt chunk
-  c += fwrite (fid, 0x0001,        "short", 0, BYTEORDER);   # sample format code (PCM)
-  c += fwrite (fid, channels,      "short", 0, BYTEORDER);   # channels
-  c += fwrite (fid, samplesPerSec, "ulong", 0, BYTEORDER);   # sample rate
-  c += fwrite (fid, samplesPerSec*channels*bitsPerSample/8, "ulong", 0, BYTEORDER);   # bytes per second
-  c += fwrite (fid, channels*bitsPerSample/8,               "short", 0, BYTEORDER);   # block align
-  c += fwrite (fid, bitsPerSample, "short", 0, BYTEORDER);   # bits/sample
-  c += fwrite (fid, "data",        "uchar");
-  c += fwrite (fid, ckSize,        "ulong", 0, BYTEORDER);   # size of data chunk
+  c += fwrite (fid, "RIFF", "uchar");
+
+  ## file size - 8
+  c += fwrite (fid, ck_size + 36, "ulong", 0, BYTEORDER);
+  c += fwrite (fid, "WAVEfmt ", "uchar");
+
+  ## size of fmt chunk
+  c += fwrite (fid, 16, "ulong", 0, BYTEORDER);
+
+  ## sample format code (PCM)
+  c += fwrite (fid, 0x0001, "short", 0, BYTEORDER);
+
+  ## channels
+  c += fwrite (fid, channels, "short", 0, BYTEORDER);
+
+  ## sample rate
+  c += fwrite (fid, samples_per_sec, "ulong", 0, BYTEORDER);
+
+  ## bytes per second
+  bps = samples_per_sec*channels*bits_per_sample/8;
+  c += fwrite (fid, bps, "ulong", 0, BYTEORDER);
+
+  ## block align
+  c += fwrite (fid, channels*bits_per_sample/8, "short", 0, BYTEORDER);
+
+  c += fwrite (fid, bits_per_sample, "short", 0, BYTEORDER);   
+  c += fwrite (fid, "data", "uchar");
+  c += fwrite (fid, ck_size, "ulong", 0, BYTEORDER);
   
   if (c < 25)
     fclose (fid);
-    error ("wavread: writing to file failed")
+    error ("wavread: writing to file failed");
   endif
   
-  # scale samples
-  switch bitsPerSample
+  ## scale samples
+  switch (bits_per_sample)
     case 8
       y = floor (y*127 + 127);
-    case {16,32}
-      y = floor (y*((2 ** bitsPerSample) / 2 - 1));
+    case {16, 32}
+      y = floor (y*((2 ** bits_per_sample) / 2 - 1));
   endswitch
   
-  # interleave samples
-  l = n*channels;
-  for (i = 1:channels)
-    yi(i:channels:l) = y(:,i);
-  endfor
+  ## interleave samples
+  ## l = n*channels;
+  ## for i = 1:channels
+  ##  yi(i:channels:l) = y(:,i);
+  ## endfor
+
+  yi = reshape (y', n*channels, 1);
   
-  # write to file
+  ## write to file
   c = fwrite (fid, yi, format, 0, BYTEORDER);
   
   fclose (fid);