mirror of
https://github.com/cookiengineer/audacity
synced 2025-04-29 23:29:41 +02:00
Fixes bug 2014 - Regular Interval Labels fails. Fixes bug 770 - Enh: Create region labels with "Regular Interval Labels" Fixes bug 1298 - Windows: Regular Interval Labels on mutiple tracks produces multiple labels.
149 lines
5.9 KiB
Common Lisp
149 lines
5.9 KiB
Common Lisp
$nyquist plug-in
|
|
$version 4
|
|
$type tool analyze
|
|
$debugbutton false
|
|
$debugflags trace
|
|
$name (_ "Regular Interval Labels")
|
|
$manpage "Regular_Interval_Labels"
|
|
$action (_ "Adding equally-spaced labels to the label track...")
|
|
$author (_ "Steve Daulton")
|
|
$release 2.3.1
|
|
$copyright (_ "Released under terms of the GNU General Public License version 2")
|
|
|
|
;; TODO: Rewrite as an AUD-DO script so as to remove the requirement for an audio selection.
|
|
|
|
;; Original version by David R. Sky (http://www.garyallendj.com/davidsky/) 2007.
|
|
;; Based on an idea by Sami Jumppanen, with contributions from
|
|
;; Alex S.Brown, Dominic Mazzoni, Pierre M.I., Gale Andrews.
|
|
|
|
;; Released under terms of the GNU General Public License version 2:
|
|
;; http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
;;
|
|
;; For information about writing and modifying Nyquist plug-ins:
|
|
;; https://wiki.audacityteam.org/wiki/Nyquist_Plug-ins_Reference
|
|
|
|
|
|
;i18n-hint: Refers to the controls 'Number of labels' and 'Label interval'.
|
|
$control mode (_ "Create labels based on") choice (("Both" (_ "Number & Interval"))
|
|
("Number" (_ "Number of Labels"))
|
|
("Interval" (_ "Label Interval"))) 0
|
|
$control totalnum (_ "Number of labels") int-text "" 10 1 1000
|
|
$control interval (_ "Label interval (seconds)") float-text "" 10 0.001 3600
|
|
$control region (_ "Length of label region (seconds)") float-text "" 0 0 3600
|
|
$control adjust (_ "Adjust label interval to fit length") choice ((_ "No")
|
|
(_ "Yes")) 0
|
|
$control labeltext (_ "Label text") string "" (_ "Label")
|
|
$control zeros (_ "Minimum number of digits in label") choice (("TextOnly" (_ "None - Text Only"))
|
|
("OneBefore" (_ "1 (Before Label)"))
|
|
("TwoBefore" (_ "2 (Before Label)"))
|
|
("ThreeBefore" (_ "3 (Before Label)"))
|
|
("OneAfter" (_ "1 (After Label)"))
|
|
("TwoAfter" (_ "2 (After Label)"))
|
|
("ThreeAfter" (_ "3 (After Label)"))) 2
|
|
$control firstnum (_ "Begin numbering from") int-text "" 1 0 nil
|
|
$control verbose (_ "Message on completion") choice ((_ "Details")
|
|
("Warnings" (_ "Warnings only"))
|
|
(_ "None")) 0
|
|
|
|
(defun make-labels (&aux labels)
|
|
"Generate labels at regular intervals"
|
|
;; Get parameters
|
|
(case mode
|
|
(1 ;Number
|
|
(setf interval
|
|
(if (= region 0)
|
|
(/ (- (get-duration 1) region) totalnum)
|
|
(/ (- (get-duration 1) region) (1- totalnum)))))
|
|
(2 ;Interval
|
|
(setf totalnum (get-interval-count))
|
|
(when (= adjust 1)
|
|
(setf interval (/ (- (get-duration 1) region) totalnum))))
|
|
(t ;Number and Interval
|
|
))
|
|
;; Loop for required number of labels
|
|
(do* ((count 0 (1+ count))
|
|
(time 0 (* count interval)))
|
|
((= count totalnum))
|
|
(push (make-one-label time (+ firstnum count)) labels))
|
|
(when (and (> region 0)(= mode 2)(= adjust 1))
|
|
(push (make-one-label (- (get-duration 1) region)
|
|
(+ firstnum totalnum))
|
|
labels))
|
|
;; Create confirmation message
|
|
(when (< verbose 2)
|
|
(message totalnum interval))
|
|
labels)
|
|
|
|
|
|
(defun message (number interval)
|
|
"Generate output message in debug window."
|
|
(if (> region interval)
|
|
(setf msg (format nil (_ "Warning: Overlapping region labels.~%")))
|
|
(setf msg ""))
|
|
(cond
|
|
((= verbose 1) ;Warnings only
|
|
(format t msg))
|
|
(t (if (> region 0)
|
|
;i18n-hint: Type of label
|
|
(setf labeltype (_ "region labels"))
|
|
(setf labeltype (_ "point labels")))
|
|
(when (and (> region 0)(= mode 2)(= adjust 1))
|
|
(setf number (1+ number)))
|
|
(setf msg
|
|
;i18n-hint: Number of labels produced at specified intervals.
|
|
(format nil (_ "~a~a ~a at intervals of ~a seconds.~%")
|
|
msg number labeltype interval))
|
|
(if (> region 0)
|
|
(format t (_ "~aRegion length = ~a seconds.")
|
|
msg region)
|
|
(format t msg)))))
|
|
|
|
|
|
(defun get-interval-count (&aux dur)
|
|
"Number of labels when interval is specified"
|
|
(setf dur (- (get-duration 1) region))
|
|
(case adjust
|
|
;; Interval is user input value
|
|
(0 (let ((n (truncate (/ dur interval))))
|
|
(if (< (* n interval) dur)
|
|
(1+ n)
|
|
n)))
|
|
;; Adjust interval to fit length
|
|
(1 (let* ((min-num (truncate (/ dur interval)))
|
|
(max-num (1+ min-num)))
|
|
(if (and (> min-num 0)
|
|
(< (abs (- interval (/ dur min-num)))
|
|
(abs (- interval (/ dur max-num)))))
|
|
min-num
|
|
max-num)))))
|
|
|
|
|
|
(defun make-one-label (time num)
|
|
"Make a single label"
|
|
(let* ((num-text (format nil "~a" num))
|
|
(non-zero-digits (length num-text)))
|
|
(if (= zeros 0)
|
|
(setf num-text "")
|
|
(dotimes (i (max 0 (- zeros non-zero-digits)))
|
|
(setf num-text (format nil "~a~a" "0" num-text))))
|
|
(if num-before-text
|
|
(setf text (format nil "~a~a" num-text labeltext))
|
|
(setf text (format nil "~a~a" labeltext num-text)))
|
|
(list time (+ time region) text)))
|
|
|
|
(defun lasttrackp ()
|
|
"True when processing the final selected track"
|
|
(let ((index (get '*track* 'index))
|
|
(num (length (get '*selection* 'tracks))))
|
|
(= index num)))
|
|
|
|
|
|
(setf num-before-text (<= zeros 3))
|
|
(setf zeros (1+ (rem (1- zeros) 3)))
|
|
|
|
;; Analyze plug-ins may return text message per track but
|
|
;; we only want error messages once, and only one set of labels.
|
|
(if (lasttrackp)
|
|
(make-labels)
|
|
"") ;No-op
|