Audacity Support Forum / Audacity and Nyquist / Nyquist Reference Manual / Nyquist Examples and Tutorials
(play (osc 60))
- Sound example: 1.3-01.ogg
; build-harmonic is already defined in nyquist.lsp: ;(defun build-harmonic (n) (snd-sine 0 n tablesize 1)) (defun mkwave () (setf *table* (sim (scale 0.5 (build-harmonic 1.0 2048)) (scale 0.25 (build-harmonic 2.0 2048)) (scale 0.125 (build-harmonic 3.0 2048)) (scale 0.062 (build-harmonic 4.0 2048)))) (setf *table* (list *table* (hz-to-step 1) T))) (cond ((not (boundp '*mkwave*)) (mkwave) (setf *mkwave* t))) (play (osc 60))
- Sound example: 1.3.1-01.ogg
(defun note (pitch dur) (osc pitch dur *table*)) (play (seq (note c4 i) (note d4 i) (note f4 i) (note g4 i) (note d4 q)))
- Sound example: 1.3.3-01.ogg
(defun env-note (p) (mult (note p 1.0) (env 0.05 0.1 0.5 1.0 0.5 0.4))) (play (env-note c4))
- Sound example: 1.3.4-01.ogg
(play (seq (stretch 0.25 (seq (env-note c4) (env-note d4))) (stretch 0.5 (seq (env-note f4) (env-note g4))) (env-note c4)))
- Sound example: 1.3.4-02.ogg
(play (seq (note c4 q) (note d4 i)))
- Sound example: 2.2-01.ogg
(play (scale 0.5 (sim (note c4 q) (note d4 i))))
- Sound example: 2.3-01.ogg
;; previous versions could not get current-path to locate demo-snd.aiff... ;(format t "~%examples.lsp tries to load demo-snd.aiff from the~%") ;(format t "default sound file directory, which is stored in~%") ;(format t "the variable *default-sf-dir*. The current value is:~%") ;(format t "\"~A\". If you get an error immediately, you should~%" ; *default-sf-dir*) ;(format t "either set *default-sf-dir* or copy demo-snd.aiff~%") ;(format t "where Nyquist will find it.~%") (setf a-snd (s-read (strcat (current-path) "demo-snd.aiff"))) (play a-snd)
- Sound example: 2.4-01.ogg
(play (seq (cue a-snd) (cue a-snd)))
- Sound example: 2.4-02.ogg
(play (sim (at 0.0 (cue a-snd)) (at 0.7 (cue a-snd)) (at 1.0 (cue a-snd)) (at 1.2 (cue a-snd))))
- Sound example: 2.4-03.ogg
(play (sim (cue a-snd) (loud 6.0 (at 3.0 (cue a-snd)))))
- Sound example: 2.6-01.ogg
(play (loud 6.0 (sim (at 0.0 (cue a-snd)) (at 0.7 (cue a-snd)))))
- Sound example: 2.6-02.ogg
(defun snds (dly) (sim (at 0.0 (cue a-snd)) (at 0.7 (cue a-snd)) (at 1.0 (cue a-snd)) (at (+ 1.2 dly) (cue a-snd)))) (play (snds 0.1))
- Sound example: 2.7-01.ogg
(play (loud 0.25 (stretch 0.9 (snds 0.3))))
- Sound example: 2.7-02.ogg
(play (sound-srate-abs 44100.0 (osc c4)))
- Sound example: 2.8-01.ogg
(defun tone-seq () (seqrep (i 16) (stretch 0.25 (osc-note c4)))) (defun pitch-rise () (stretch 4.0 (scale 16 (ramp)))) (defun chromatic-scale () (transpose (pitch-rise) (tone-seq))) (play (chromatic-scale))
- Sound example: 3.1-01.ogg
(play (sustain (stretch 4 (sum 0.2 (ramp))) (chromatic-scale)))
- Sound example: 3.1-02.ogg
(defun warper () (pwl .25 .4 .75 .6 1.0 1.0 2.0 2.0 2.0)) (defun warp4 () (stretch 4 (scale 4 (warper)))) (play (warp (warp4) (tone-seq)))
- Sound example: 3.2-01.ogg
; note: as explained in the manual, the following is NOT ; the solution to a fixed duration/variable tempo sequence: ; (defun tone-seq-2 () (seqrep (i 16) (stretch-abs 0.25 (osc-note c4)))) (play (warp (warp4) (tone-seq-2)))
- Sound example: 3.3-01.ogg
; here is the proper solution (vs. ex19): ; (defun tone-seq-3 () (seqrep (i 16) (set-logical-stop (stretch-abs 0.25 (osc-note c4)) 0.25))) (play (warp (warp4) (tone-seq-3)))
- Sound example: 3.3-02.ogg
(play (warp (warp4) (transpose (pitch-rise) (tone-seq))))
- Sound example: 3.4-01.ogg
(play (warp (warp4) (transpose (control-warp (get-warp) (warp-abs nil (pitch-rise))) (tone-seq))))
- Sound example: 3.4-02.ogg
(if (not (boundp 'a-snd)) (setf a-snd (s-read "demo-snd.aiff"))) (play (force-srate *default-sound-srate* (stretch 3.0 (sound a-snd))))
- Sound example: 4.1-01.ogg
(defun down () (force-srate *default-sound-srate* (seq (stretch 0.2 (sound a-snd)) (stretch 0.3 (sound a-snd)) (stretch 0.4 (sound a-snd)) (stretch 0.5 (sound a-snd)) (stretch 0.6 (sound a-snd))))) (play (down))
- Sound example: 4.1-02.ogg
(defun up () (force-srate *default-sound-srate* (seq (stretch 0.5 (sound a-snd)) (stretch 0.4 (sound a-snd)) (stretch 0.3 (sound a-snd)) (stretch 0.2 (sound a-snd))))) (play (seq (down) (up) (down)))
- Sound example: 4.1-03.ogg
Note: The "system" function seems only to work on unix-based systems. I couldn't bring it to work under Windows 2000 + XP.
(s-save a-snd 1000000000 "./a-snd-file.snd") (play-file "./a-snd-file.snd") (system "rm ./a-snd-file.snd")
- Sound example: 4.2-01.ogg
(setf my-sound-file "./a-snd-file.snd") (s-save a-snd 1000000000 my-sound-file) (play-file my-sound-file) (system (strcat "rm " my-sound-file))
- Sound example: 4.2-02.ogg
; normalize in memory. First, assign the sound to a variable so ; it will be retained: (setf mysound (sim (osc c4) (osc c5))) ; now compute the maximum value (ny:all is a 1 giga-samples, you may want a ; smaller constant if you have less than 4GB of memory :-): (setf mymax (snd-max mysound NY:ALL)) (display "Computed max" mymax) ; now write out and play the sound from memory with a scale factor: (play (scale (/ 1.0 mymax) mysound))
- Sound example: 4.3-01.ogg
; if you don't have space in memory, here's how to do it: (defun myscore () (sim (osc c4) (osc c5))) ; compute the maximum, don't forget the quote!: (setf mymax (snd-max '(myscore) NY:ALL)) (display "Computed max" mymax) ; now we know the max, but we don't have a the sound (it was garbage ; collected and never existed all at once in memory). Compute the sound ; again, this time with a scale factor:] (play (scale (/ 1.0 mymax) (myscore)))
- Sound example: 4.3-02.ogg
(play (fmosc c4 (pwl 0.1)))
- Sound example: 4.4-01.ogg
(play (fmosc c4 (pwl 0.5)))
- Sound example: 4.4-02.ogg
(play (fmosc c4 (pwl 0.5 (step-to-hz c4) 0.501)))
- Sound example: 4.4-03.ogg
(setf *fm-voice* (list (extract 0.110204 0.13932 (cue a-snd)) 24.848422 T)) (play (fmosc cs2 (pwl 0.5 (step-to-hz cs2) 0.501) *fm-voice* 0.0))
- Sound example: 4.4-04.ogg
(defun sweep (delay pitch-1 sweep-time pitch-2 hold-time) (let ((interval (- (step-to-hz pitch-2) (step-to-hz pitch-1)))) (pwl delay 0.0 ; sweep from pitch 1 to pitch 2 (+ delay sweep-time) interval ; hold until about 1 sample from the end (+ delay sweep-time hold-time -0.0005) interval ; quickly ramp to zero (pwl always does this, ; so make it short) (+ delay sweep-time hold-time)))) (play (fmosc cs2 (sweep 0.1 cs2 0.6 gs2 0.5) *fm-voice* 0.0))
- Sound example: 4.4-05.ogg
(play (fmosc cs2 (scale 10.0 (lfo 6.0)) *fm-voice* 0.0))
- Sound example: 4.4-06.ogg
(let (modulator) (setf modulator (mult (pwl 1.0 1000.0 1.0005) (osc c4))) (play (fmosc c4 modulator)))
- Sound example: 4.4-07.ogg
;;; FINDING ZERO CROSSINGS, SND-SAMPLES (setf max-samples-for-zeros 1000) (defun zeros (snd) ; start by getting the samples, only take 1000 samples max (prog ((s (snd-samples snd max-samples-for-zeros)) newsign sign n len result result2 starttime srate) ; go through the array looking for zero crossings (setf len (length s)) ; stop if there are no samples (if (= len 0) (return nil)) (setf sign (> 0.0 (aref s 0))) ; get the start time and sample rate of the sound for use below (setf starttime (car (snd-extent snd max-samples-for-zeros))) (setf srate (snd-srate snd)) (setf n 1) loop (if (>= n len) (go done)) (setf newsign (> 0.0 (aref s n))) (if (not (eq sign newsign)) (setf result (cons n result))) (setf sign newsign) (setf n (1+ n)) (go loop) done ; now we have the zero crossings, convert them to times (dolist (num result) ; return the time of the zero crossing, which is the start time ; of the snd plus the sample number / srate (setf result2 (cons (+ starttime (/ num srate)) result2))) (return result2))) ; extract a short piece of this sample (setf short (extract 0.1 0.14 (cue a-snd))) (setf z (zeros short)) (format t "Zero crossings from a-snd: ~A~%" z) ; find the differences between zero crossings reported by zeros ; print the result in terms of samples for readability ; (defun periods (lis short) (prog (result prev srate) (if (null lis) (return nil)) (setf srate (snd-srate short)) loop (setf prev (car lis)) (setf lis (cdr lis)) (if (null lis) (return (reverse result))) (setf result (cons (* srate (- (car lis) prev)) result)) (go loop))) (setf p (periods z short)) (format t "The intervals (in samples) between zero crossings are: ~%~A~%" p) ; build a wavetable using zero crossing information ; ; I interactively played with the data and decided to extract from the ; 5th period to the 21st period (these had 86 and 87 samples each and ; seem to indicate some kind of periodicity). The 1st period measures ; from the zeroth zero crossing to the first, so the 5th period measures ; from the 4th zero crossing to the 5th. I'll arbitrarily take ; the 4th and 20th zero crossing times (the 5th and 20th should work as ; well), and from the data, this looks like 2 waveform periods. ; This is very clear if you plot the data. ; ; arguments are: ; snd - the sound to extract from ; zeros - the result of (zeros snd) ; start - the number of the starting zero crossing ; stop - the number of the ending zero crossing ; n - number of periods contained in the extracted sound ; (defun extract-table (snd zeros start stop n) (let (starttime extent hz) ; Start by shifting snd to time zero: (setf starttime (car (snd-extent snd max-samples-for-zeros))) (setf snd (at (- starttime) (cue snd))) (format t "~A~%" snd) ; also get the start and stop times and shift them: (setf start (- (nth start zeros) starttime)) (setf stop (- (nth stop zeros) starttime)) (format t "table ~A start ~A stop ~A~%" snd start stop) ; now extract the samples of interest, note that we are ; overwriting our pointer to the snd argument (setf snd (extract start stop (cue snd))) ; now we need to figure out the pitch this sound would represent ; when played at its samplerate. The pitch in hz is 1 / duration, ; and duration is the extent of the sound / n. Therefore, take ; n/extent (setf extent (snd-extent snd max-samples-for-zeros)) (setf hz (/ n (- (cadr extent) (car extent)))) ; an osc table is a list of the sound, pitch number, and T (periodic) (list snd (hz-to-step hz) T))) ; try it out (setf *a-voice* (extract-table short z 4 20 2)) ; now use the table with an oscillator (play (osc c3 1.0 *a-voice* ))
- Sound example: 4.5-01.ogg
; play it at its normal pitch (play (osc (cadr *a-voice*) 1.0 *a-voice*))
- Sound example: 4.5-02.ogg
(play (noise))
- Sound example: 4.6-01.ogg
(play (lp (noise) 1000.0))
- Sound example: 4.6-02.ogg
(play (hp (noise) 1000.0))
- Sound example: 4.6-03.ogg
; low pass sweep from 100 hz to 2000 hz (play (lp (noise) (pwl 0.0 100.0 1.0 2000.0 1.0)))
- Sound example: 4.6-04.ogg
; high pass sweep from 50 hz to 4000 hz (play (hp (noise) (pwl 0.0 50.0 1.0 4000.0 1.0)))
- Sound example: 4.6-05.ogg
; band pass at 500 hz, 20 hz bandwidth (play (reson (scale 10.0 (noise)) 500.0 20.0 1))
- Sound example: 4.6-06.ogg
; band pass sweep from 100 to 1000 hz, 20 hz bandwidth (play (reson (scale 0.04 (noise)) (pwl 0.0 200.0 1.0 1000.0 1.0) 20.0))
- Sound example: 4.6-07.ogg
Audacity Support Forum / Audacity and Nyquist / Nyquist Reference Manual / Nyquist Examples and Tutorials