mirror of
				https://github.com/cookiengineer/audacity
				synced 2025-11-04 16:14:00 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Common Lisp
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Common Lisp
		
	
	
	
	
	
;nyquist plug-in
 | 
						|
;version 3
 | 
						|
;type process
 | 
						|
;categories "http://lv2plug.in/ns/lv2core#DelayPlugin"
 | 
						|
;name "Delay..."
 | 
						|
;action "Performing Delay Effect..."
 | 
						|
;info "by Roger Dannenberg, modified by David R. Sky\nReleased under terms of the GNU General Public License Version 2 \nDelay type: 'bouncing ball' makes the echoes occur increasingly close\ntogether (faster); 'reverse bouncing ball' makes them occur increasingly far\napart (slower). In either bouncing ball effect, delay time is not time between\nechoes but the * maximum * delay time in bounces.\nApplying delay can cause clipping (distortion), especially when reducing the\ndecay value and using more echoes. It's normally best to use Effect > Amplify\nto set the peak amplitude to -6 dB before using delay.     
 | 
						|
 | 
						|
;control delay-type "Delay type" choice "regular,bouncing ball,reverse bouncing ball" 0
 | 
						|
;control decay "Decay amount [dB; negative value increases volume]" real "" 6 -1 24
 | 
						|
;control delay "Delay time [seconds]" real "" 0.5 0 5
 | 
						|
;control shift "Pitch change per echo [semitones; negative value = lower, 0 is off]" real "" 0 -2 2
 | 
						|
;control count "Number of echoes" int "" 5 1 30
 | 
						|
 | 
						|
; Delay by Roger B. Dannenberg
 | 
						|
; modified by David R. Sky October 2007, 
 | 
						|
; adding negative decay values, which gives delay effect
 | 
						|
; increasing volume with each delay; and adding
 | 
						|
; bouncing ball and reverse bouncing ball delay effects
 | 
						|
; and pitch [semitone] change with each echo.
 | 
						|
; modified by Richard Ash January 2008, removing all 
 | 
						|
; normalization functions. 
 | 
						|
 | 
						|
; Note by Roger Dannenberg: this effect will use up memory proportional to
 | 
						|
; delay * count, since that many samples must be buffered
 | 
						|
; before the first block is freed.
 | 
						|
 | 
						|
; initialize empty error message
 | 
						|
(setf error-msg "")
 | 
						|
 | 
						|
 | 
						|
; check function: returns 1 on error
 | 
						|
(defun check (arg min max)
 | 
						|
(if (and (>= arg min) (<= arg max))
 | 
						|
0 1))
 | 
						|
 | 
						|
 | 
						|
; checking for erroneous user-input values:
 | 
						|
(setf error-msg (if (= (check decay -1 24) 0)
 | 
						|
error-msg 
 | 
						|
(strcat error-msg 
 | 
						|
(format nil "Decay value '~a' outside valid range -1.0 to 24.0 dB. 
 | 
						|
" decay))))
 | 
						|
 | 
						|
(setf error-msg (if (= (check delay 0 5) 0)
 | 
						|
error-msg 
 | 
						|
(strcat error-msg 
 | 
						|
(format nil "Delay value '~a' outside valid range 0.0 to 5.0 seconds. 
 | 
						|
" delay))))
 | 
						|
 | 
						|
(setf error-msg (if (= (check shift -2 2) 0)
 | 
						|
error-msg 
 | 
						|
(strcat error-msg 
 | 
						|
(format nil "Pitch change value '~a' outside valid range -2.0 to 2.0 semitones. 
 | 
						|
" shift))))
 | 
						|
 | 
						|
(setf error-msg (if (= (check count 1 30) 0)
 | 
						|
error-msg 
 | 
						|
(strcat error-msg 
 | 
						|
(format nil "Number of echoes '~a' outside valid range 1 to 30 echoes. 
 | 
						|
" count))))
 | 
						|
; finished error-checking
 | 
						|
 | 
						|
; if error-msg is longer than 0 characters,
 | 
						|
; prepend opening message
 | 
						|
(setf error-msg (if (> (length error-msg) 0)
 | 
						|
(strcat "Error -\n\nYou have input at least one invalid value:
 | 
						|
" error-msg)
 | 
						|
error-msg))
 | 
						|
 | 
						|
(cond ; 1
 | 
						|
((> (length error-msg) 0)
 | 
						|
(format nil "~a" error-msg))
 | 
						|
 | 
						|
(t ; no input errors, perform delay
 | 
						|
 | 
						|
; convert shift value to a value the Nyquist code understands
 | 
						|
(setf shift (expt 0.5 (/ shift 12.0)))
 | 
						|
 | 
						|
; for bouncing ball effects, set delay time to delay time/count
 | 
						|
(setf delay (if (> delay-type 0)
 | 
						|
(/ delay count) delay))
 | 
						|
 | 
						|
 | 
						|
 | 
						|
; function to stretch audio 
 | 
						|
(defun change (sound shift)
 | 
						|
(if (arrayp sound)
 | 
						|
(vector
 | 
						|
(force-srate 44100 (stretch-abs shift (sound (aref sound 0))))
 | 
						|
(force-srate 44100 (stretch-abs shift (sound (aref sound 1)))))
 | 
						|
(force-srate 44100 (stretch-abs shift (sound sound)))))
 | 
						|
 | 
						|
 | 
						|
(cond ; 2
 | 
						|
((= delay-type 0) ; regular delay
 | 
						|
; delay function
 | 
						|
(defun delays (s decay delay count shift)
 | 
						|
  (if (= count 0) (cue s)
 | 
						|
	 (sim (cue s)
 | 
						|
			(loud decay (at delay (delays (change s shift) 
 | 
						|
decay delay (- count 1) shift))))))
 | 
						|
 | 
						|
(stretch-abs 1 (delays s (- 0 decay) delay count shift)))
 | 
						|
 | 
						|
 | 
						|
((= delay-type 1) ; bouncing ball delay
 | 
						|
; bouncing ball delay function
 | 
						|
(defun bounces (s decay delay count shift)
 | 
						|
  (if (= count 0) (cue s)
 | 
						|
      (sim (cue s)
 | 
						|
               (loud decay (at (mult delay count) 
 | 
						|
(bounces (change s shift) decay delay 
 | 
						|
(- count 1) shift)))))) 
 | 
						|
 | 
						|
(stretch-abs 1 (bounces s (- 0 decay) delay count shift)))
 | 
						|
 | 
						|
 | 
						|
((= delay-type 2) ; reverse bouncing ball delay
 | 
						|
; reverse bouncing ball delay function
 | 
						|
(defun revbounces (s decay delay count revcount shift)
 | 
						|
  (if (= count 0) (cue s)
 | 
						|
      (sim (cue s)
 | 
						|
               (loud decay (at (mult delay (- revcount count))
 | 
						|
(revbounces (change s shift) decay delay 
 | 
						|
(- count 1 ) revcount shift)))))) 
 | 
						|
 | 
						|
(setf revcount (1+ count))
 | 
						|
(stretch-abs 1 (revbounces s (- 0 decay) delay count revcount shift)))
 | 
						|
) ; end cond2, different delay effect choices
 | 
						|
) ; end cond1 t
 | 
						|
) ; end cond 1
 |