1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-04-30 15:49:41 +02:00
audacity/plug-ins/crossfadetracks.ny
Paul Licameli da39cc451f Remove redundant ellipses from names in .ny files...
... The code that parses the header was always just throwing them out.

The code that populates menus deduces whether to add ellipses, as there are
controls or not, regardless what the $name line said.
2018-03-02 20:11:54 -05:00

77 lines
2.8 KiB
Common Lisp

;nyquist plug-in
;version 4
;type process
$name (_"Crossfade Tracks")
;manpage "Crossfade_Tracks"
;debugbutton disabled
$action (_"Crossfading...")
;preview selection
$author (_"Steve Daulton")
$copyright (_"Released under terms of the GNU General Public License version 2")
;; crossfadetracks.ny by Steve Daulton Nov 2014 / Sep 2015
;; Released under terms of the GNU General Public License version 2:
;; http://www.gnu.org/licenses/old-licenses/gpl-2.0.html .
$control type (_"Fade type") choice ((_"Constant Gain") (_"Constant Power 1") (_"Constant Power 2") (_"Custom Curve")) 0
$control curve (_"Custom curve") real "" 0 0 1
$control direction (_"Fade direction") choice ((_"Automatic") (_"Alternating Out / In") (_"Alternating In / Out")) 0
(defun crossfade (type dir curve)
(setf fade-out
(case dir
(0 (equal (guessdirection) 'OUT)) ; auto
(1 (oddp (get '*track* 'index))) ; fade out odd
(T (evenp (get '*track* 'index))))) ; fade out even
(mult *track*
(cond
(fade-out
(case type
(0 (pwlv 1 1 0))
(1 (osc (hz-to-step (/ (get-duration 4))) 1 *sine-table* 90))
(2 (s-sqrt (pwlv 1 1 0)))
(T (custom curve 0))))
(T ; else fade in.
; Control envelope sample rate must match sound so that lengths
; match exactly, otherwise we get a click at the end of the fade.
(setf *control-srate* *sound-srate*)
(case type
(0 (pwlv 0 1 1))
(1 (osc (hz-to-step (/ (get-duration 4))) 1))
(2 (s-sqrt (pwlv 0 1 1)))
(T (custom curve 1)))))))
(defun custom (curve inout)
;; 'epsilon' defines the curvature of a logarithmc curve.
;; To avoid log 0 or /0 it must be > 0 and < 1.
(let* ((curve (+ 0.99 (* -0.98 (min 1 (max 0 curve)))))
; magic number 2.7 gives approx 'constant power' curve at 50% setting.
(epsilon (power curve 2.7)))
(if (= inout 0)
(setf logcurve (pwev epsilon 1 1))
(setf logcurve (pwev 1 1 epsilon)))
; Scale and invert curve for 0 to unity gain.
(sum 1
(mult (/ -1 (- 1 epsilon))
(diff logcurve epsilon)))))
(defun guessdirection ()
"If the selection is closer to the start of the
audio clip, fade in, otherwise fade out."
(let* ((start (get '*selection* 'start))
(end (get '*selection* 'end))
(clips (get '*track* 'clips))
(in-dist end)
(out-dist end))
(if (arrayp clips)
(setf clips (append (aref clips 0)(aref clips 1))))
(dotimes (i (length clips))
(setf in-dist (min in-dist (abs (- start (first (nth i clips))))))
(setf out-dist (min out-dist (abs (- end (second (nth i clips)))))))
(if (< in-dist out-dist) 'in 'out)))
(if (< (length (get '*selection* 'tracks)) 2)
(_"Error.\nSelect 2 (or more) tracks to crossfade.")
(crossfade type direction curve))