1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-04 09:39:42 +02:00
audacity/plug-ins/crossfadetracks.ny
Paul Licameli ac9148e48f Don't use \n sequence inside Lisp strings needing translation...
... Because xgettext will just remove the \, not replace \n with newline.

That's consistent with Lisp reader behavior in this documentation:
http://www.lispworks.com/documentation/lw70/CLHS/Body/02_de.htm

The XLisp reader, which replaces \n with newline, is nonstandard.

So, to accommodate xgettext, use (format nil "...~%...") instead, or where
you can't do that in a $ header line, just make a line break inside the ""

There are a few "\n" left alone in sample-data-export.ny which are neither
in $ lines nor inside (_ "...")
2018-03-02 20:11:55 -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)
(format nil (_"Error.~%Select 2 (or more) tracks to crossfade."))
(crossfade type direction curve))