mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-03 17:19:43 +02:00
145 lines
4.8 KiB
Common Lisp
145 lines
4.8 KiB
Common Lisp
;nyquist plug-in
|
|
;version 3
|
|
;type analyze
|
|
;categories "http://audacityteam.org/namespace#TimeAnalyser"
|
|
;name "Regular Interval Labels..."
|
|
;action "Adding equally-spaced labels to the label track..."
|
|
;info "By David R. Sky, http://www.garyallendj.com/davidsky/index.html, after Alex S.Brown.\nReleased under GPL v2."
|
|
|
|
;control start "Time to place first label [seconds]" string " " "0.0"
|
|
;control placement "Label placement method" choice "Label interval,Number of labels" 0
|
|
;control time "Set either: Label interval [seconds]" string " " "60.0"
|
|
;control label-number "Or: Number of labels" int "" 10 2 100
|
|
;control text "Label text" string "" "Label"
|
|
;control prepend "Prepend numbers to label text?" choice "No - just use text,Yes" 1
|
|
;control include "Include final label?" choice "No,Yes" 0
|
|
;control t-choice "Final audio segment equal with others?" choice "No,Yes" 1
|
|
|
|
; Regular interval labels by David R. Sky, June-October 2007.
|
|
; Code for label placement based on silencemarker.ny by Alex S.Brown.
|
|
; Modified by Steve Daulton, September 2010 to disallow labels before zero.
|
|
; Released under terms of the GNU General Public License version 2
|
|
; http://www.gnu.org/copyleft/gpl.html .
|
|
; Thanks Sami Jumppanen for plug-in suggestion.
|
|
; Thanks Dominic Mazzoni, Pierre M.I., Gale Andrews
|
|
; for improvement suggestions.
|
|
|
|
|
|
; function to convert string to list
|
|
(defun string-to-list (str)
|
|
(read (make-string-input-stream (format nil "(~a)" str))))
|
|
|
|
|
|
; convert start string to a number
|
|
(setf start (first (string-to-list start)))
|
|
(setq start (max 0 start)) ; disallow negative label time
|
|
|
|
; convert time string to a number
|
|
(setf time (first (string-to-list time)))
|
|
|
|
; get selection duration in seconds,
|
|
; then subtract start offset
|
|
(setf dur (- (/ len *sound-srate*) start))
|
|
|
|
; give an error message
|
|
; if user-set label interval is greater than selection duration,
|
|
; taking into accound start time offset
|
|
(cond ; outermost cond
|
|
((and (> time dur) (= placement 0))
|
|
(format nil
|
|
"Including your time offset of ~a seconds, your requested~%label interval of ~a seconds is greater than the duration~%of your selected audio (~a seconds). ~%
|
|
Please run this plug-in again using a smaller label interval. ~%"
|
|
start time dur))
|
|
|
|
(t ; label interval time is equal to or less than selection duration
|
|
|
|
; choose between user-selected label interval or number of labels
|
|
(cond
|
|
((= placement 1) ; number of labels
|
|
(setf time (if (= include 0)
|
|
(float (/ dur label-number)) (1+ (float (/ dur label-number)))))
|
|
(setf labels (if (= include 0) label-number (1+ label-number)))
|
|
) ; end placement 1
|
|
|
|
(t ; user-selected time interval
|
|
; calculate number of labels in selection
|
|
; this includes label at start of selection
|
|
; which is label number 0 if numbers are prepended to label text
|
|
; if final label is unwanted, decrement number of labels by 1
|
|
(setf labels (if (= include 0)
|
|
(truncate (/ dur time))
|
|
(+ 1 (truncate (/ dur time)))
|
|
) ; end if
|
|
) ; end setf labels
|
|
|
|
; setf check-labels: number of labels if user includes last label
|
|
; this is for checking purposes in the [setf time ...] section of code
|
|
(setf check-labels (+ 1 (truncate (/ dur time))))
|
|
|
|
|
|
; function to calculate new time value
|
|
; if user value does not create equal duration final audio chunk
|
|
; returns new time value
|
|
(defun new-time (time dur check-labels)
|
|
; calculate duration of last audio chunk
|
|
(setf last-label (- dur (* time check-labels)))
|
|
(if (< last-label (* time 0.5)) ; last chunk is less than 1/2 time
|
|
(/ dur (- check-labels 1))
|
|
(/ dur check-labels)
|
|
) ; end if
|
|
) ; end defun new-time
|
|
|
|
|
|
(setf time ; depending whether user wants specified time used
|
|
; or wants equal duration audio chunks including last chunk
|
|
; user time may create equal audio chunks even for last chunk
|
|
(cond ; 1
|
|
((= t-choice 0) time) ; use user time value...
|
|
|
|
(t ; ...otherwise calculate time for equal duration audio chunks
|
|
(cond ; 2
|
|
; if user time value creates equal final audio segment duration anyway
|
|
; then use user interval
|
|
((= dur (* time (- check-labels 1))) time)
|
|
|
|
; user time value does not create equal duration audio chunks
|
|
(t
|
|
(new-time time dur check-labels)
|
|
) ; end t
|
|
) ; end cond 2
|
|
) ; end of calculation for equal duration audio chunks
|
|
) ; end cond1
|
|
) ; end setf time
|
|
|
|
) ; end t
|
|
) ; end cond choosing between user-set label interval or number of labels
|
|
|
|
|
|
; function to add labels to the label track
|
|
; from silencemarker.ny by Alex S. Brown
|
|
(defun add-label (l-time l-text)
|
|
(setq l (cons (list l-time l-text) l)))
|
|
|
|
|
|
; function to prepend label number before label text
|
|
(defun prepend-number (i text)
|
|
(format nil "~a~a" i text))
|
|
|
|
|
|
; initialize blank label track
|
|
(setq l nil)
|
|
|
|
; add the labels
|
|
(dotimes (i labels)
|
|
(if (= prepend 1) ; prepend numbers to label text?
|
|
(add-label (+ start (* i time)) (prepend-number i text)) ; yes
|
|
(add-label (+ start (* i time)) text) ; no
|
|
) ; end if
|
|
) ; end dotimes i
|
|
|
|
; return label track
|
|
l
|
|
|
|
) ; close t of outermost cond
|
|
) ; end outermost cond
|