mirror of
				https://github.com/cookiengineer/audacity
				synced 2025-11-04 08:04:06 +01: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
 |