shithub: aubio

ref: 67d0a8b307fe41cb426584a57a6bb0804dd1373c
dir: /plugins/audacity/audacity-nyquist.diff/

View raw version
--- audacity-1.2.1.orig/nyquist/misc.lsp
+++ audacity-1.2.1/nyquist/misc.lsp
@@ -74,19 +74,3 @@
                   (setf fullpath ":")))
            fullpath)
           (t nil))))
-          
-;; real-random -- pick a random real from a range
-;;
-(defun real-random (from to)
-  (cond ((= from to) from)
-          (t
-         (+ from
-           (* (random 10000)
-              0.0001
-              (- to from))))))
-
-;; power -- raise a number to some power x^y
-;;
-(defun power (x y)
-  (exp (* (log (float x)) y)))
-  
--- audacity-1.2.1.orig/nyquist/nyinit.lsp
+++ audacity-1.2.1/nyquist/nyinit.lsp
@@ -26,7 +26,7 @@
 (setf *WATCH* NIL)
 
 (format t "~%Nyquist -- A Language for Sound Synthesis and Composition~%")
-(format t "    Copyright (c) 1991-2003 by Roger B. Dannenberg~%")
+(format t "    Copyright (c) 1991,1992,1995 by Roger B. Dannenberg~%")
 (format t "    Version 2.29~%~%")
 
 (setf *gc-flag* t)
--- audacity-1.2.1.orig/nyquist/nyquist.lsp
+++ audacity-1.2.1/nyquist/nyquist.lsp
@@ -6,10 +6,7 @@
 ;;;   ###########################################################
 ;;;
 
-;;;   
-;;;   Modifications for using Nyquist within Audacity
-;;;   by Dominic Mazzoni
-;;;
+(load "fileio.lsp")
 
 (prog ()
    (setq lppp -12.0) (setq lpp -9.0)  (setq lp -6.0)    (setq lmp -3.0)
@@ -217,7 +214,7 @@
     (cond ((> hz (/ *SOUND-SRATE* 2))
            (format t "Warning: buzz nominal frequency (~A hz) will alias at current sample rate (~A hz).\n"
                    hz *SOUND-SRATE*)))
-    (setf n (min n 1)) ; avoid divide by zero problem
+    (setf n (max n 1)) ; avoid divide by zero problem
     (scale-db (get-loud)
               (snd-buzz n                   ; number of harmonics
                         *SOUND-SRATE*       ; output sample rate
@@ -344,6 +341,7 @@
     d			; duration
     phase)))		; phase
 
+
 ;; FMLFO -- like LFO but uses frequency modulation
 ;;
 (defun fmlfo (freq &optional (sound *SINE-TABLE*) (phase 0.0))
@@ -358,6 +356,7 @@
           (t
            (error "frequency must be a number or sound")))))
 
+
 ;; OSC - table lookup oscillator
 ;;
 (defun osc (pitch &optional (duration 1.0) 
@@ -761,6 +760,51 @@
       ,s))
 
 
+;; COMPUTE-DEFAULT-SOUND-FILE -- construct and set *default-sound-file*
+;;
+;; (this is harder than it might seem because the default place for
+;;  sound files is in /tmp, which is shared by users, so we'd like to
+;;  use a user-specific name to avoid collisions)
+;;
+(defun compute-default-sound-file () 
+  (let (inf user extension)
+      ; the reason for the user name is that if UserA creates a temp file,
+      ; then UserB will not be able to overwrite it. The user name is a
+      ; way to give each user a unique temp file name. Note that we don't
+      ; want each session to generate a unique name because Nyquist doesn't
+      ; delete the sound file at the end of the session.
+    (system "echo $USER > ny_username.tmp")
+    (setf inf (open "ny_username.tmp"))
+    (cond (inf
+           (setf user (read inf))
+       (close inf)
+       (system "rm ny_username.tmp"))
+      (t	; must not be unix, make up a generic name
+       (setf user 'nyquist)))
+    (cond ((null user)           
+       (format t 
+"Please type your user-id so that I can construct a default 
+sound-file name.  To avoid this message in the future, add
+this to your .login file:
+    setenv USER <your id here>
+or add this to your init.lsp file:
+    (setf *default-sound-file* \"<your filename here>\")
+    (setf *default-sf-dir* \"<full pathname of desired directory here>\")
+
+Your id please: ")
+       (setf user (read))))
+    ; now compute the extension based on *default-sf-format*
+    (cond ((= *default-sf-format* snd-head-AIFF)
+           (setf extension ".aif"))
+          ((= *default-sf-format* snd-head-Wave)
+           (setf extension ".wav"))
+          (t
+           (setf extension ".snd")))
+    (setf *default-sound-file* 
+      (strcat (string-downcase (symbol-name user)) "-temp" extension))
+    (format t "Default sound file is ~A.~%" *default-sound-file*)))
+
+
 ;; CONTROL-WARP -- apply a warp function to a control function
 ;; 
 (defun control-warp (warp-fn control &optional wrate)
@@ -792,6 +836,9 @@
          (snd-srate sound)
          (local-to-global 0) *START* *STOP* (db-to-linear (get-loud))))
 
+; (s-plot (progv '(*TIME* *START*)'(0.0 0.5)(cue (snd-sine 20 1 100 1)))1000)
+;(s-plot(progv'(*TIME* *START*)'(0.0 0.5)(cue(cue (snd-sine 20 1 100 1))))1000)
+
 ;; (sound sound)
 ;;    Same as (cue sound), except also warps the sound.
 ;; Note that the *WARP* can change the pitch of the
@@ -861,6 +908,13 @@
 (setfn control sound)
 
 
+;; (cue-file string)
+;;    Loads a sound file with the given name, returning a sound which is
+;; transformed to the current environment.
+;(defun cue-file (name)
+;   (cue (snd-load  name *SOUND-SRATE*)))
+
+
 ;; (env t1 t2 t4 l1 l2 l3 &optional duration)
 ;; Creates a 4-phase envelope.
 ;;	tN is the duration of phase N, and lN is the final level of
@@ -1327,6 +1381,54 @@
 ; 
 (load "seq" :verbose NIL)
 
+;(defmacro with%environment (env &rest expr)
+;  `(progv ',*environment-variables* ',env ,@expr))
+; 
+;(defmacro seq (&rest list)
+;  (display "seq" list)
+;  (cond ((null list)
+;         (snd-zero *time* *sound-srate*))
+;        ((null (cdr list))
+;         (car list))
+;	((null (cddr list))
+;	 `(let* ((first%sound ,(car list))
+;		 (s%rate (snd-srate first%sound)))
+;	    (snd-seq first%sound
+;	 	     #'(lambda (t0) 
+;	                 (with%environment
+;			   ,(the%environment) (setf *time* t0)     
+;			   (force-srate s%rate ,(cadr list)))))))
+;	(t
+;	 `(let* ((first%sound ,(car list))
+;		 (s%rate (snd-srate first%sound)))
+;	    (snd-seq first%sound
+;		     #'(lambda (t0)
+;			 (format t "snd-seq applying lambda")
+;			 (with%environment
+;			   ,(the%environment) (setf *time* t0)     
+;			   (seq (force-srate s%rate ,(cadr list))
+;				,@(cddr list))))) ))))
+; 
+; 
+;(defmacro seqrep (pair sound)
+;  `(let ((,(car pair) 0)
+;         ($loop-count (1- ,(cadr pair))))
+;     (cond ((< 0 $loop-count)
+;            (seqrep2 ,(car pair) ,sound))
+;           ((= 0 $loop-count)
+;            ,sound)
+;           (t
+;            (snd-zero *time* *sound-srate*)))))
+; 
+; 
+;(defmacro seqrep2 (var sound)
+;  `(cond ((< ,var $loop-count)
+;          (seq (prog1 ,sound (setf ,var (1+ ,var)))
+;               (seqrep2 ,var ,sound)))
+;         ((= ,var $loop-count)
+;          ,sound)))
+
+
 ; set-logical-stop - modify the sound and return it, time is shifted and
 ;			 stretched
 (defun set-logical-stop (snd tim)
@@ -1532,4 +1634,4 @@
 (defun osc-pulse (hz bias &optional (compare-shape *step-shape*))
   (compare bias (osc-tri hz) compare-shape))
 
-(setf NY:ALL 1000000000)
+
--- audacity-1.2.1.orig/nyquist/seq.lsp
+++ audacity-1.2.1/nyquist/seq.lsp
@@ -176,21 +176,18 @@
              (error (format nil "Negative stretch factor in TIMED-SEQ: ~A" event)))
             (t
              (setf start-time (car event)))))
-    (cond ((null score) (s-rest 0))
-          (t
-           (at (caar score)
-               (seqrep (i (length score))
-                 (cond ((cdr score)
-                        (let (event)
-                          (prog1
-                            (set-logical-stop
-                              (stretch (cadar score)
-                              (setf event (eval (caddar score))))
-                            (- (caadr score) (caar score)))
-;                           (display "timed-seq" (caddar score) (local-to-global 0))
-                            (setf score (cdr score)))))
-                         (t
-                          (stretch (cadar score) (eval (caddar score)))))))))))
+    (at (caar score)
+        (seqrep (i (length score))
+           (cond ((cdr score)
+                  (let (event)
+                   (prog1 
+                    (set-logical-stop (stretch (cadar score) 
+                                               (setf event (eval (caddar score))))
+                                      (- (caadr score) (caar score)))
+;                   (display "timed-seq" (caddar score) (local-to-global 0))
+                    (setf score (cdr score)))))
+                 (t
+                  (stretch (cadar score) (eval (caddar score)))))))))
 
 
 
--- audacity-1.2.1.orig/nyquist/system.lsp
+++ audacity-1.2.1/nyquist/system.lsp
@@ -1,23 +1,18 @@
-; system.lsp -- machine/system-dependent definitions
+;; system.lsp -- system-dependent lisp code
 
-;; default behavior is to call SETUP-CONSOLE to get large white typescript
-;;
-;; set *setup-console* to nil in your personal init.lsp to override this behavior 
-;; (this may be necessary to work with emacs)
-;;
-(if (not (boundp '*setup-console*)) (setf *setup-console* t))
-(if *setup-console* (setup-console))
+; local definition for play
+;  this one is for Linux:
 
 (setf ny:bigendianp nil)
 
 (if (not (boundp '*default-sf-format*))
-    (setf *default-sf-format* snd-head-Wave))
+    (setf *default-sf-format* snd-head-wave))
 
-;(if (not (boundp '*default-sound-file*))
-;    (setf *default-sound-file* "temp.wav"))
+(if (not (boundp '*default-sound-file*))
+    (compute-default-sound-file))
 
-;(if (not (boundp '*default-sf-dir*))
-;    (setf *default-sf-dir* ""))
+(if (not (boundp '*default-sf-dir*))
+    (setf *default-sf-dir* "./"))
 
 (if (not (boundp '*default-sf-mode*))
     (setf *default-sf-mode* snd-head-mode-pcm))
@@ -25,25 +20,8 @@
 (if (not (boundp '*default-sf-bits*))
     (setf *default-sf-bits* 16))
 
-;(if (not (boundp '*default-plot-file*))
-;    (setf *default-plot-file* "points.dat"))
-
-;(if (not (boundp '*plotscript-file*))
-;    (setf *plotscript-file* "sys/unix/rs6k/plotscript"))
-
-; local definition for play
-;(defmacro play (expr)
-;  `(s-save-autonorm ,expr NY:ALL *default-sound-file* :play *soundenable*))
-
-
-;(defun r ()
-;  (s-save (s-read *default-sound-file*) NY:ALL "" :play t)
-;)
-
-
-; PLAY-FILE -- play a file
-;(defun play-file (name)
-;  (s-save (s-read name) NY:ALL "" :play t))
+(if (not (boundp '*default-plot-file*))
+    (setf *default-plot-file* "points.dat"))
 
 
 ; FULL-NAME-P -- test if file name is a full path or relative path
@@ -51,67 +29,52 @@
 ; (otherwise the *default-sf-dir* will be prepended
 ;
 (defun full-name-p (filename)
-  (or (eq (char filename 0) #\\)
-      (eq (char filename 0) #\.)
-      (and (> (length filename) 2)
-         (both-case-p (char filename 0))
-       (equal (char filename 1) #\:))))
+  (or (eq (char filename 0) #\/)
+      (eq (char filename 0) #\.)))
 
-(setf *file-separator* #\\)
 
-;(defun ny:load-file () (load "*.*"))
-;(defun ny:reload-file () (load "*"))
+(setf *file-separator* #\/)
 
 
-; save the standard function to write points to a file
-;
-;(setfn s-plot-points s-plot)
+;; PLAY-FILE - play a sound file
+;;
+(defun play-file (name)
+;;  (system (strcat "sndplay " (soundfilename name))))
+  (system (strcat "play " (soundfilename name) )))
+
+;; R - replay last file written with PLAY
+(defun r () (play-file *default-sound-file*))
+
+;;;; use this old version if you want to use sndplay to play
+;;;; the result file rather than play the samples as they
+;;;; are computed. This version does not autonormalize.
+;; PLAY - write value of an expression to file and play it
+;;
+;(defmacro play (expr)
+;  `(prog (specs)
+;	 (setf specs (s-save (force-srate *sound-srate* ,expr) 
+;			   1000000000 *default-sound-file*))
+;	 (r)))
+;;;;
 
-;(defun array-max-abs (points)
-;  (let ((m 0.0))
-;        (dotimes (i (length points))
-;          (setf m (max m (abs (aref points i)))))
-;        m))
-
-;(setf graph-width 600)
-;(setf graph-height 220)
-
-;(defun s-plot (snd &optional (n 600))
-;  (show-graphics)
-;  (clear-graphics)
-;  (cond ((soundp snd)
-;               (s-plot-2 snd n (/ graph-height 2) graph-height))
-;              (t
-;               (let ((gh (/ graph-height (length snd)))
-;                     hs)
-;                 (dotimes (i (length snd))
-;                   (setf hs (s-plot-2 (aref snd i) n (+ (/ gh 2) (* i gh)) gh hs)))))))
-;
-;
-;(defun s-plot-2 (snd n y-offset graph-height horizontal-scale)
-;  (prog ((points (snd-samples snd n))
-;                   maxpoint horizontal-scale vertical-scale)
-;    (setf maxpoint (array-max-abs points))
-;    (moveto 0 y-offset)
-;    (lineto graph-width y-offset)
-;    (moveto 0 y-offset)
-;    (cond ((null horizontal-scale)
-;               (setf horizontal-scale (/ (float graph-width) (length points)))))
-;    (setf vertical-scale (- (/ (float graph-height) 2 maxpoint)))
-;    (dotimes (i (length points))
-;      (lineto (truncate (* horizontal-scale i))
-;              (+ y-offset (truncate (* vertical-scale (aref points i))))))
-;    (format t "X Axis: ~A to ~A (seconds)\n" (snd-t0 snd) (/ (length points) (snd-srate snd)))
-;    (format t "Y Axis: ~A to ~A\n" (- maxpoint) maxpoint)
-;    (format t "~A samples plotted.\n" (length points))
-;    (return horizontal-scale)
-;    ))
-;
-; S-EDIT - run the audio editor on a sound
-;
-;(defmacro s-edit (&optional expr)
-;  `(prog ()
-;         (if ,expr (s-save ,expr 1000000000 *default-sound-file*))
-;         (system (format nil "audio_editor ~A &" 
-;                         (soundfilename *default-sound-file*)))))
+; local definition for play
+(defmacro play (expr)
+  `(s-save-autonorm ,expr NY:ALL *default-sound-file* :play *soundenable*))
+
+;; for Linux, modify s-plot (defined in nyquist.lsp) by saving s-plot
+;; in standard-s-plot, then call gnuplot to display the points.
+;;
+;; we also need to save the location of this file so we can find
+;; nyquist-plot.txt, the command file for gnuplot
+;;
+(setf *runtime-path* (current-path))
+(display "system.lsp" *runtime-path*)
+
+(setfn standard-s-plot s-plot)
+
+(defun s-plot (s)
+  (let (plot-file)
+    (standard-s-plot s) ;; this calculates the data points
+    (setf plot-file (strcat *runtime-path* "nyquist-plot.txt"))
+    (system (strcat "gnuplot -persist " plot-file))))
 
--- audacity-1.2.1.orig/nyquist/fileio.lsp
+++ audacity-1.2.1/nyquist/fileio.lsp
@@ -0,0 +1,204 @@
+;; s-save -- saves a file
+(setf NY:ALL 1000000000)	; 1GIG constant for maxlen
+(defmacro s-save (expression &optional (maxlen NY:ALL) filename 
+                  &key (format '*default-sf-format*)
+                  (mode '*default-sf-mode*) (bits '*default-sf-bits*)
+                  (endian NIL) ; nil, :big, or :little -- specifies file format
+                  (play nil))
+  `(let ((ny:fname ,filename)
+         (ny:maxlen ,maxlen)
+         (ny:endian ,endian)
+         (ny:swap 0))
+     ; allow caller to omit maxlen, in which case the filename will
+     ; be a string in the maxlen parameter position and filename will be null
+     (cond ((null ny:fname)
+                 (cond ((stringp ny:maxlen)
+                            (setf ny:fname ny:maxlen)
+                            (setf ny:maxlen NY:ALL))
+                           (t
+                            (setf ny:fname *default-sound-file*)))))
+     
+     (cond ((equal ny:fname "")
+                 (cond ((not ,play)
+                       (format t "s-save: no file to write! play option is off!\n"))))
+           (t
+            (setf ny:fname (soundfilename ny:fname))
+            (format t "Saving sound file to ~A~%" ny:fname)))
+     (cond ((eq ny:endian :big)
+            (setf ny:swap (if ny:bigendianp 0 1)))
+           ((eq ny:endian :little)
+            (setf ny:swap (if ny:bigendianp 1 0))))
+     (snd-save ',expression ny:maxlen ny:fname ,format ,mode ,bits ny:swap ,play)))
+
+(defmacro s-save-autonorm (expression &rest arglist)
+  `(let ((peak (s-save (scale *autonorm* ,expression) ,@arglist)))
+     (autonorm-update peak)))
+
+;; The "AutoNorm" facility: when you play something, the Nyquist play
+;; command will automatically compute what normalization factor you
+;; should have used. If you play the same thing again, the normalization
+;; factor is automatically applied.
+;;
+;; Call AUTONORM-OFF to turn off this feature, and AUTONORM-ON to turn
+;; it back on.
+;;
+;; *autonorm-target* is the peak value we're aiming for (it's set below 1
+;; so allow the next signal to get slightly louder without clipping)
+;;
+(setf *autonorm-target* 0.9)
+
+(defun autonorm-on ()
+  (setf *autonorm* 1.0)
+  (setf *autonorm-previous-peak* 1.0)
+  (setf *autonormflag* t)
+  (format t "AutoNorm feature is on.~%"))
+
+(if (not (boundp '*autonormflag*)) (autonorm-on))
+
+(defun autonorm-off ()
+  (setf *autonormflag* nil)
+  (setf *autonorm* 1.0)
+  (format t "AutoNorm feature is off.~%"))
+
+(defun autonorm-update (peak)
+  (cond ((and *autonormflag* (> peak 0.0))
+           (setf *autonorm-previous-peak* (/ peak *autonorm*))
+         (setf *autonorm* (/ *autonorm-target* *autonorm-previous-peak*))
+         (format t "AutoNorm: peak was ~A,~%" *autonorm-previous-peak*)
+         (format t "     peak after normalization was ~A,~%" peak)
+         (format t "     new normalization factor is ~A~%" *autonorm*)
+         *autonorm-previous-peak*
+        )
+        (t peak)
+  ))
+
+;; s-read -- reads a file
+(defun s-read (filename &key (time-offset 0) (srate *sound-srate*)
+        (dur 10000.0) (nchans 1) (format *default-sf-format*)
+        (mode *default-sf-mode*) (bits *default-sf-bits*) (endian NIL))
+  (let ((swap 0))
+    (cond ((eq endian :big)
+           (setf swap (if ny:bigendianp 0 1)))
+          ((eq endian :little)
+           (setf swap (if ny:bigendianp 1 0))))
+    (snd-read (soundfilename filename) time-offset
+            (local-to-global 0) format nchans mode bits swap srate
+            dur)))
+
+;; SF-INFO -- print sound file info
+;;
+(defun sf-info (filename)
+  (let (s format channels mode bits srate dur flags)
+    (format t "~A:~%" (soundfilename filename))
+    (setf s (s-read filename))
+    (setf format (car *rslt*))
+    (setf channels (cadr *rslt*))
+    (setf mode (caddr *rslt*))
+    (setf bits (cadddr *rslt*))
+    (setf *rslt* (cddddr *rslt*))
+    (setf srate (car *rslt*))
+    (setf dur (cadr *rslt*))
+    (setf flags (caddr *rslt*))
+    (format t "Format: ~A~%" 
+            (nth format '("none" "AIFF" "IRCAM" "NeXT" "Wave")))
+    (cond ((setp (logand flags snd-head-channels))
+           (format t "Channels: ~A~%" channels)))
+    (cond ((setp (logand flags snd-head-mode))
+           (format t "Mode: ~A~%"
+                   (nth mode '("ADPCM" "PCM" "uLaw" "aLaw" "Float" "UPCM")))))
+    (cond ((setp (logand flags snd-head-bits))
+           (format t "Bits/Sample: ~A~%" bits)))
+    (cond ((setp (logand flags snd-head-srate))
+           (format t "SampleRate: ~A~%" srate)))
+    (cond ((setp (logand flags snd-head-dur))
+           (format t "Duration: ~A~%" dur)))
+    ))
+
+;; SETP -- tests whether a bit is set (non-zero)
+;
+(defun setp (bits) (not (zerop bits)))
+
+;; SOUNDFILENAME -- add default directory to name to get filename
+;;
+(defun soundfilename (filename)
+  (cond ((= 0 (length filename))
+         (break "filename must be at least one character long" filename))
+        ((full-name-p filename))
+        (t
+         ; if sf-dir nonempty and does not end with filename separator,
+         ; append one
+         (cond ((and (< 0 (length *default-sf-dir*))
+                     (not (eq (char *default-sf-dir* 
+                                    (1- (length *default-sf-dir*)))
+                              *file-separator*)))
+                (setf *default-sf-dir* (strcat *default-sf-dir* (string *file-separator*)))
+                (format t "Warning: appending \"~A\" to *default-sf-dir*~%"
+                        *file-separator*)))
+         (setf filename (strcat *default-sf-dir* (string filename)))))
+  filename)
+
+
+(setfn s-read-format car)
+(setfn s-read-channels cadr)
+(setfn s-read-mode caddr)
+(setfn s-read-bits cadddr)
+(defun s-read-swap (rslt) (car (cddddr rslt)))
+(defun s-read-srate (rslt) (cadr (cddddr rslt)))
+(defun s-read-dur (rslt) (caddr (cddddr rslt)))
+(defun s-read-byte-offset (rslt) (car (cddddr (cddddr rslt))))
+(defun round (x) (truncate (+ 0.5 x)))
+
+;; change defaults for PLAY macro:
+(setf *soundenable* t)
+(defun sound-on () (setf *soundenable* t))
+(defun sound-off () (setf *soundenable* nil))
+
+(defmacro s-add-to (expr maxlen filename &optional time-offset)
+  `(let ((ny:fname (soundfilename ,filename))
+         ny:input ny:rslt ny:offset
+         )
+     (cond ((setf ny:input (s-read ny:fname :time-offset ,time-offset))
+            (setf ny:rslt *rslt*)
+            (format t "Adding sound to ~A at offset ~A~%" 
+                    ny:fname ,time-offset)
+            (setf ny:offset (s-read-byte-offset ny:rslt))
+
+            (snd-overwrite '(let ((ny:addend ,expr))
+                              (sum (snd-coterm
+                                    (s-read ny:fname :time-offset ,time-offset)
+                                    ny:addend)
+                                 ny:addend))
+                           ,maxlen ny:fname ny:offset 
+                           (s-read-mode ny:rslt) (s-read-bits ny:rslt)
+                           (s-read-srate ny:rslt) (s-read-channels ny:rslt))
+            (format t "Duration written: ~A~%" (car *rslt*)))
+           ((setf ny:input (s-read ny:fname :time-offset 0))
+            (format t "Could not open ~A at time offset ~A~%" 
+                    ny:fname ,time-offset))
+           (t
+            (format t "Could not open ~A~%" ny:fname)))))
+
+
+(defmacro s-overwrite (expr maxlen filename &optional time-offset)
+  `(let ((ny:fname (soundfilename ,filename))
+         ny:input ny:rslt ny:offset)
+         (setf ny:offset ,time-offset)
+         (cond ((null ny:offset) (setf ny:offset 0)))
+     (cond ((setf ny:input (s-read ny:fname :time-offset ny:offset))
+            (setf ny:rslt *rslt*)
+            (format t "Overwriting ~A at offset ~A~%" ny:fname ny:offset)
+            (setf ny:offset (s-read-byte-offset ny:rslt))
+                (display "s-overwrite" ny:offset)
+            (snd-overwrite `,expr ,maxlen ny:fname ny:offset
+                           (s-read-format ny:rslt)
+                           (s-read-mode ny:rslt) (s-read-bits ny:rslt)
+                           (s-read-swap ny:rslt)
+                           (s-read-srate ny:rslt) (s-read-channels ny:rslt))
+            (format t "Duration written: ~A~%" (car *rslt*)))
+           ((s-read ny:fname :time-offset 0)
+            (format t "Could not open ~A at time offset ~A~%" 
+                    ny:fname ,time-offset))
+           (t
+            (format t "Could not open ~A~%" ny:fname)))))
+
+
--- audacity-1.2.1.orig/nyquist/nyquist-plot.txt
+++ audacity-1.2.1/nyquist/nyquist-plot.txt
@@ -0,0 +1,3 @@
+set nokey
+plot "points.dat" with lines
+