From f57e69cfca25a2f7995454484617897d4d6d67de Mon Sep 17 00:00:00 2001 From: SteveDaulton Date: Wed, 6 Jan 2021 16:50:53 +0000 Subject: [PATCH] Replace Sound Finder with Label Sounds also fixes bug 2352: Sound / Silence Finder fail silently on selection > 2^31 -1 --- nyq-po/POTFILES.in | 2 +- plug-ins/CMakeLists.txt | 2 +- plug-ins/SoundFinder.ny | 163 ---------------------------- src/commands/ScreenshotCommand.cpp | 2 +- src/effects/nyquist/LoadNyquist.cpp | 2 +- 5 files changed, 4 insertions(+), 167 deletions(-) delete mode 100644 plug-ins/SoundFinder.ny diff --git a/nyq-po/POTFILES.in b/nyq-po/POTFILES.in index 9943c2357..06acfbe2a 100644 --- a/nyq-po/POTFILES.in +++ b/nyq-po/POTFILES.in @@ -1,5 +1,4 @@ plug-ins/SilenceMarker.ny -plug-ins/SoundFinder.ny plug-ins/SpectralEditMulti.ny plug-ins/SpectralEditParametricEQ.ny plug-ins/SpectralEditShelves.ny @@ -13,6 +12,7 @@ plug-ins/delay.ny plug-ins/eq-xml-to-txt-converter.ny plug-ins/equalabel.ny plug-ins/highpass.ny +plug-ins/label-sounds.ny plug-ins/limiter.ny plug-ins/lowpass.ny plug-ins/notch.ny diff --git a/plug-ins/CMakeLists.txt b/plug-ins/CMakeLists.txt index 08924f1f8..c7cff739d 100755 --- a/plug-ins/CMakeLists.txt +++ b/plug-ins/CMakeLists.txt @@ -8,7 +8,6 @@ def_vars() list( APPEND SOURCES SilenceMarker.ny - SoundFinder.ny SpectralEditMulti.ny SpectralEditParametricEQ.ny SpectralEditShelves.ny @@ -22,6 +21,7 @@ list( APPEND SOURCES eq-xml-to-txt-converter.ny equalabel.ny highpass.ny + label-sounds.ny limiter.ny lowpass.ny noisegate.ny diff --git a/plug-ins/SoundFinder.ny b/plug-ins/SoundFinder.ny deleted file mode 100644 index 35973c835..000000000 --- a/plug-ins/SoundFinder.ny +++ /dev/null @@ -1,163 +0,0 @@ -$nyquist plug-in -$version 1 -$type analyze -$name (_ "Sound Finder") -$manpage "Sound_Finder" -$action (_ "Finding sound...") -$author (_ "Jeremy R. Brown") -$release 2.3.0 -$copyright (_ "Released under terms of the GNU General Public License version 2") - -;; by Jeremy R. Brown (http://www.jeremy-brown.com/) -;; based on the Silence Finder script by Alex S. Brown (http://www.alexsbrown.com) -;; -;; Adds region labels for areas of sound according to the specified level -;; and duration of surrounding silence. If too many labels are produced, -;; increase the silence level and duration$ if too few are produced, -;; reduce the level and duration. - -;; 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 - -$control sil-lev (_ "Treat audio below this level as silence [ -dB]") real "" 26 0 100 -$control sil-dur (_ "Minimum duration of silence between sounds [seconds]") real "" 1.0 0.1 5.0 -$control labelbeforedur (_ "Label starting point [seconds before sound starts]") real "" 0.1 0.0 1.0 -$control labelafterdur (_ "Label ending point [seconds after sound ends]") real "" 0.1 0.0 1.0 -$control finallabel (_ "Add a label at the end of the track? [No=0, Yes=1]") int "" 0 0 1 - -;30Dec09: couple of changes made to default control values by Gale Andrews - -;Create a function to make the sum the two channels if they are stereo -(defun mono-s (s-in) (if (arrayp s-in) (snd-add (aref s-in 0) (aref s-in 1)) -s-in)) - -;Create a function to reduce the sample rate and prepare the signal for -;analysis. RMS is good to monitor volume the way humans hear it, but is not -;available in Audacity. Used a peak-calculating function instead. -;NOTE: this is the place to add any processing to improve the quality of the -;signal. Noise filters could improve the quality of matches for noisy signals. -;PERFORMANCE vs. ACCURACY -;Reducing the samples per second should improve the performance and decrease -;the accuracy of the labels. Increasing the samples per second will do the -;opposite. The more samples checked, the longer it takes. The more samples -;checked, the more precisely the program can place the silence labels. -;my-srate-ratio determines the number of samples in my-s. Set the number after (snd-srate s) -;higher to increase the number of samples. - -(defun my-s (s-in) - (setq my-srate-ratio (truncate (/ (snd-srate (mono-s s-in)) 100))) - (snd-avg (mono-s s-in) my-srate-ratio my-srate-ratio OP-PEAK) -) - -;Set the silence threshold level (convert it to a linear form) -(setq thres (db-to-linear (* -1 sil-lev))) -;Store the sample rate of the sound -(setq s1-srate (snd-srate (my-s s))) -;Initialize the variable that will hold the length of the sound. -;Do not calculate it now with snd-length, because it would waste memory. -;We will calculate it later. -(setq s1-length 0) -;Initialize the silence counter -(setq sil-c 0) -;Initialize the labels variable -(setq l NIL) -;Convert the silence duration in seconds to a length in samples -(setq sil-length (* sil-dur s1-srate)) - -;Set the sound-start marker to -1, indicating no sound has been found yet -(setq sound-start -1) -(setq silence-start -1) -;Set the flag that says we are looking for the start of a sound (as opposed to the start of a silence) -(setq sound-search 1) -;Set the counter that counts sounds -(setq sound-count 0) - -(setq label-string "") - -;Define a function to add new items to the list of labels -(defun add-label (l-starttime l-endtime l-text) - (setq l (cons (list l-starttime l-endtime l-text) l)) -) - -;The main working part of the program, it counts -;the number of sequential samples with volume under -;the threshold. It adds to a list of markers every time -;there is a longer period of silence than the silence -;duration amount. - -;It runs through a loop, adding to the list of markers (l) -;each time it finds silence. -(let (s1) ;Define s1 as a local variable to allow efficient memory use - ; Get the sample into s1, then free s to save memory - (setq s1 (my-s s)) - (setq s nil) - ;Capture the result of this "do" loop, because we need the sound's length - ;in samples. - (setq s1-length - ;Keep repeating, incrementing the counter and getting another sample - ;each time through the loop. - (do ((n 1 (+ n 1)) (v (snd-fetch s1) (setq v (snd-fetch s1)))) - ;Exit when we run out of samples (v is nil) and return the number of - ;samples processed (n) - ((not v) n) - ;Start the execution part of the do loop - - ;if found silence, increment the silence counter; if silence-start is not already > -1, set the start of silence to the current sample number (n) - (if (< v thres) - (progn - (setq sil-c (+ sil-c 1)) - (if (= silence-start -1) (setq silence-start n)) - ) - ) - - ;if found sound, and sound-search is 1, mark the start of the sound and change sound-search to 0 (look for silence next) - (if (and (>= v thres) (= sound-search 1)) - (progn - (setq sound-search 0) - (setq sound-start n) - (setq sound-count (1+ sound-count)) - ) - ) - - ;if found silence, and silence-counter is long enough, and sound-search is 0, and sound-start is not -1, and silence-start is not -1, that indicates the end of a sound (for which we have already found the beginning), which we should now label - (if (and (< v thres) (= sound-search 0) (/= sound-start -1) (> sil-c sil-length) (/= silence-start -1)) - (progn - (setq sound-search 1) - (setq sil-c 0) - ;Create the label text - (setq label-string (strcat label-string (format nil "~A" sound-count))) - (add-label (- (/ sound-start s1-srate) labelbeforedur) (+ (/ silence-start s1-srate) labelafterdur) label-string) - (setq label-string "") - (setq silence-start -1) - ) - ) - - ;if found sound, reset the silence-counter and silence-start - (if (>= v thres) - (progn - (setq sil-c 0) - (setq silence-start -1) - ) - ) - ) - ) -) - -;if we're still looking for the end of a sound at the end of the file, end the sound at the end of the file -(if (= sound-search 0) - (progn - (setq label-string (strcat label-string (format nil "~A" sound-count))) - (add-label (- (/ sound-start s1-srate) labelbeforedur) (/ s1-length s1-srate) label-string) - ) -) - -;If no sound markers were found, return a message -;Otherwise, if some sounds were found, also optionally place a label at the end of the file. -(if (null l) - (setq l (format nil (_ "No sounds found. Try reducing the silence~%level and minimum silence duration."))) - (if (= finallabel 1) (add-label (/ s1-length s1-srate) (/ s1-length s1-srate) (_ "[End]"))) -) -l diff --git a/src/commands/ScreenshotCommand.cpp b/src/commands/ScreenshotCommand.cpp index ac8e98307..6db8f7807 100644 --- a/src/commands/ScreenshotCommand.cpp +++ b/src/commands/ScreenshotCommand.cpp @@ -528,10 +528,10 @@ void ScreenshotCommand::CaptureEffects( "Find Clipping...", #ifdef CAPTURE_NYQUIST_TOO "Beat Finder...", + "Label Sounds...", "Regular Interval Labels...", "Sample Data Export...", "Silence Finder...", - "Sound Finder...", #endif } ); } diff --git a/src/effects/nyquist/LoadNyquist.cpp b/src/effects/nyquist/LoadNyquist.cpp index a58cefd29..f092b771b 100644 --- a/src/effects/nyquist/LoadNyquist.cpp +++ b/src/effects/nyquist/LoadNyquist.cpp @@ -31,6 +31,7 @@ const static wxChar *kShippedEffects[] = wxT("delay.ny"), wxT("equalabel.ny"), wxT("highpass.ny"), + wxT("label-sounds.ny"), wxT("limiter.ny"), wxT("lowpass.ny"), wxT("noisegate.ny"), @@ -42,7 +43,6 @@ const static wxChar *kShippedEffects[] = wxT("sample-data-export.ny"), wxT("sample-data-import.ny"), wxT("SilenceMarker.ny"), - wxT("SoundFinder.ny"), wxT("spectral-delete.ny"), wxT("SpectralEditMulti.ny"), wxT("SpectralEditParametricEQ.ny"),