mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-01 08:09:41 +02:00
152 lines
6.0 KiB
Common Lisp
152 lines
6.0 KiB
Common Lisp
;nyquist plug-in
|
|
;version 3
|
|
;type analyze
|
|
;name "Regular Interval Labels..."
|
|
;action "Adding equally-spaced labels to the label track..."
|
|
|
|
;; by David R. Sky (http://www.garyallendj.com/davidsky/), June-October 2007.
|
|
;; Code for label placement based on silencemarker.ny by Alex S.Brown.
|
|
;; Updated by Steve Daulton (http://easyspacepro.com)
|
|
|
|
;; Released under terms of the GNU General Public License version 2
|
|
;; http://www.gnu.org/licenses/old-licenses/gpl-2.0.html .
|
|
;; Thanks Sami Jumppanen for plug-in suggestion.
|
|
;; Thanks Dominic Mazzoni, Pierre M.I., Gale Andrews
|
|
;; for improvement suggestions.
|
|
;; Disallow labels before zero by Steve Daulton, September 2010.
|
|
;; Enhanced label numbering by Steve Daulton, April 17th 2011.
|
|
;; Error checking by Steve Daulton, April 18th 2011.
|
|
;; Final Label bug fixed and minor GUI modifications. SD Apr 2011
|
|
;; Requires Audacity 1.3.4 or later.
|
|
|
|
;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 labelnum "Minimum number of digits in label" choice "None - text only,1 (before label),2 (before label),3 (before label),1 (after label),2 (after label),3 (after label)" 2
|
|
;control countfrom "Begin numbering from" int "" 1 0 100
|
|
;control include "Add final label" choice "No,Yes" 0
|
|
;control t-choice "Adjust label interval to fit length" choice "No,Yes" 1
|
|
|
|
; function to convert string to list
|
|
(defun string-to-list (str)
|
|
(read (make-string-input-stream (format nil "(~a)" str))))
|
|
|
|
|
|
; 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)))
|
|
|
|
|
|
; function to add labels to the label track
|
|
; from silencemarker.ny by Alex S. Brown
|
|
(defun add-label (l-time l-text)
|
|
(setq label-list (cons (list l-time l-text) label-list)))
|
|
|
|
|
|
; function to add label number
|
|
(defun add-number (i text)
|
|
(let* ((num (+ countfrom i))
|
|
(appendt (if (> labelnum 3) t nil))
|
|
(labelnum (if (> labelnum 3)(- labelnum 3) labelnum))
|
|
(sign (if (< num 0) "-" ""))
|
|
(num (abs num))
|
|
(zeros (case (- labelnum (length (format nil "~a" num)))
|
|
(1 "0")
|
|
(2 "00")
|
|
(t ""))))
|
|
(if appendt
|
|
(format nil "~a~a~a~a" text sign zeros num) ;append number to text
|
|
(format nil "~a~a~a~a" sign zeros num text)))) ;prepend number
|
|
|
|
|
|
; function to calculate 'time' based on number of labels
|
|
(defun num-of-label-time ()
|
|
(setf time (/ dur label-number)); set label interval
|
|
(if (= include 0)
|
|
(setf labels label-number)
|
|
(setf labels (1+ label-number))))
|
|
|
|
|
|
; function to calculate 'time' based on 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
|
|
(defun user-selected-time ()
|
|
(setf labels (if (= include 0)
|
|
(truncate (/ dur time))
|
|
(+ 1 (truncate (/ dur time)))))
|
|
; setf check-labels: number of labels if user includes last label
|
|
(setf check-labels (+ 1 (truncate (/ dur 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
|
|
(setf time
|
|
(if (= t-choice 0) ; final segment need not be equal
|
|
time ; use user time value...
|
|
; ...otherwise calculate time for equal duration audio chunks
|
|
; if user time value creates equal final audio segment duration anyway
|
|
; then use user interval
|
|
(if (= dur (* time (- check-labels 1)))
|
|
time
|
|
; user time value does not create equal duration audio chunks
|
|
(new-time time dur check-labels)))))
|
|
|
|
|
|
;; ERROR CHECKING AND INITIALISE VARIABLES
|
|
|
|
(setq err ""); initialise error message
|
|
(setq label-list nil); initialize blank label track
|
|
(setq time (first (string-to-list time))); get Interval Label time from string
|
|
(setq start (first (string-to-list start))); get 'start' from string
|
|
|
|
; check 'start' is a valid number, then calculate and check 'dur(ation)'
|
|
(if (not(numberp start)) ; check that it is a number
|
|
(setq err (strcat err (format nil "'Time to place first label [seconds]' must be a number.~%~%")))
|
|
(progn
|
|
(setq start (max 0 start)) ;disallow negative label time
|
|
(setf dur (- (get-duration 1) start)) ;calculate duration
|
|
(if (<= dur 0)
|
|
(setq err (strcat err (format nil
|
|
"'Time to place first label' (~a seconds) is greater than selection length (~a seconds).~%~%"
|
|
start (get-duration 1)))))))
|
|
|
|
; If using 'Label Interval'
|
|
(if (= placement 0)
|
|
(if (not(numberp time)); check time is a number
|
|
(setq err (strcat err (format nil "'Label interval [seconds]' must be a number.~%~%")))
|
|
(if (<= time 0); Label interval must be positive
|
|
(setq err (strcat err (format nil "'Label Interval [seconds]' must be a positive number.~%~%")))
|
|
(if (and (> dur 0)(> time dur))
|
|
(setq err (strcat err (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). ~%~%"
|
|
start time dur))))))
|
|
;else using 'Number of labels'
|
|
(if (<= label-number 0)
|
|
(setq err (strcat err (format nil
|
|
"Based on 'Number of labels' you have selected ~a labels.~%~%" label-number)))))
|
|
|
|
;; MAIN PROGRAM
|
|
|
|
(if (> (length err) 0) ; if errors
|
|
(format nil "ERROR.~%~%~a" err) ; print error message(s)
|
|
(progn ; otherwise run program
|
|
(if (= placement 1) ; number of labels
|
|
(num-of-label-time)
|
|
(user-selected-time))
|
|
; add the labels
|
|
(dotimes (i labels)
|
|
(if (> labelnum 0)
|
|
(add-label (+ start (* i time)) (add-number i text))
|
|
(add-label (+ start (* i time)) text)))
|
|
; return label track
|
|
label-list))
|