diff options
-rw-r--r-- | peakit~/README.txt | 8 | ||||
-rw-r--r-- | peakit~/license.txt | 31 | ||||
-rw-r--r-- | peakit~/makefile | 105 | ||||
-rw-r--r-- | peakit~/peakit-listmoses.pd | 362 | ||||
-rw-r--r-- | peakit~/peakit~.c | 138 |
5 files changed, 644 insertions, 0 deletions
diff --git a/peakit~/README.txt b/peakit~/README.txt new file mode 100644 index 0000000..427e349 --- /dev/null +++ b/peakit~/README.txt @@ -0,0 +1,8 @@ +peakit~ - find frequency peaks of an FFT and output lists of frequencies and magnitudes. + +(c) Edward Kelly 2005. This software is subject to the GNU General Public License, and may be freely copied, distributed and modified. + +You will need the listmoses external to make the best use of this software, and to run the peakit-listmoses demonstration patches in the help file. + +Have fun! +Ed Kelly <morph_2016@yahoo.co.uk> diff --git a/peakit~/license.txt b/peakit~/license.txt new file mode 100644 index 0000000..353aef4 --- /dev/null +++ b/peakit~/license.txt @@ -0,0 +1,31 @@ +This software is copyrighted by Edward Kelly. The following
+terms apply to all files associated with the software unless explicitly
+disclaimed in individual files.
+
+The authors hereby grant permission to use, copy, modify, distribute,
+and license this software and its documentation for any purpose, provided
+that existing copyright notices are retained in all copies and that this
+notice is included verbatim in any distributions. No written agreement,
+license, or royalty fee is required for any of the authorized uses.
+Modifications to this software may be copyrighted by their authors
+and need not follow the licensing terms described here, provided that
+the new terms are clearly indicated on the first page of each file where
+they apply.
+
+IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+MODIFICATIONS.
+
+RESTRICTED RIGHTS: Use, duplication or disclosure by the government
+is subject to the restrictions as set forth in subparagraph (c) (1) (ii)
+of the Rights in Technical Data and Computer Software Clause as DFARS
+252.227-7013 and FAR 52.227-19.
diff --git a/peakit~/makefile b/peakit~/makefile new file mode 100644 index 0000000..e6588a6 --- /dev/null +++ b/peakit~/makefile @@ -0,0 +1,105 @@ +current: + echo make pd_linux, pd_nt, pd_irix5, pd_irix6 or pd_darwin, then make install + +clean: ; rm -f *.pd_* *.o + +# ----------------------- NT ----------------------- + +pd_nt: peakit~.dll + +INSTALL_PREFIX="C:\pd\extra" +EXT=dll +.SUFFIXES: .obj .dll + +PDNTCFLAGS = /W3 /WX /DNT /DPD /nologo +VC="D:\Program Files\Microsoft Visual Studio\Vc98" + +PDNTINCLUDE = /I. /I\tcl\include /I..\..\src /I$(VC)\include + +PDNTLDIR = $(VC)\lib +PDNTLIB = $(PDNTLDIR)\libc.lib \ + $(PDNTLDIR)\oldnames.lib \ + $(PDNTLDIR)\kernel32.lib \ + ..\..\bin\pd.lib + +.c.dll: + cl $(PDNTCFLAGS) $(PDNTINCLUDE) /c $*.c + link /dll /export:$*_setup $*.obj $(PDNTLIB) + +# ----------------------- IRIX 5.x ----------------------- + +pd_irix5: peakit~.pd_irix5 + +INSTALL_PREFIX=/usr/local +EXT=pd_irix5 +.SUFFIXES: .pd_irix5 + +SGICFLAGS5 = -o32 -DPD -DUNIX -DIRIX -O2 + +SGIINCLUDE = -I/usr/local/include + +.c.pd_irix5: + cc $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c + ld -elf -shared -rdata_shared -o $*.pd_irix5 $*.o + rm $*.o + +# ----------------------- IRIX 5.x ----------------------- + +pd_irix6: peakit~.pd_irix6 + +INSTALL_PREFIX=/usr/local +EXT=pd_irix6 +.SUFFIXES: .pd_irix6 + +SGICFLAGS5 = -o32 -DPD -DUNIX -DIRIX -O2 + +SGIINCLUDE = -I/usr/local/include + +.c.pd_irix6: + cc $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c + ld -elf -shared -rdata_shared -o $*.pd_irix6 $*.o + rm $*.o + +# ----------------------- LINUX i386 ----------------------- + +pd_linux: peakit~.pd_linux + +INSTALL_PREFIX=/usr/local +EXT=pd_linux +.SUFFIXES: .pd_linux + +LINUXCFLAGS = -DPD -O2 -funroll-loops -fomit-frame-pointer \ + -Wall -W -Wshadow -Wstrict-prototypes -Werror \ + -Wno-unused -Wno-parentheses -Wno-switch + +LINUXINCLUDE = -I/usr/local/include + +.c.pd_linux: + cc $(LINUXCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c + ld -export_dynamic -shared -o $*.pd_linux $*.o -lc -lm + strip --strip-unneeded $*.pd_linux + rm $*.o + +# ----------------------- Mac OSX ----------------------- + +pd_darwin: peakit~.pd_darwin + +INSTALL_PREFIX=/usr/local +EXT=pd_darwin +.SUFFIXES: .pd_darwin + +DARWINCFLAGS = -DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ + -Wno-unused -Wno-parentheses -Wno-switch + +.c.pd_darwin: + cc $(DARWINCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c + cc -bundle -undefined suppress -flat_namespace -o $*.pd_darwin $*.o + rm -f $*.o + +# ---------------------------------------------- + +install:: + install -d $(INSTALL_PREFIX)/lib/pd/extra +# install -m 644 *.$(EXT) $(INSTALL_PREFIX)/lib/pd/externs + -install -m 644 peakit~.$(EXT) $(INSTALL_PREFIX)/lib/pd/extra + install -m 644 *.pd $(INSTALL_PREFIX)/lib/pd/doc/5.reference diff --git a/peakit~/peakit-listmoses.pd b/peakit~/peakit-listmoses.pd new file mode 100644 index 0000000..0075dc6 --- /dev/null +++ b/peakit~/peakit-listmoses.pd @@ -0,0 +1,362 @@ +#N canvas 0 0 769 391 10; +#N canvas 0 0 450 300 peakit 0; +#X obj 183 102 rfft~; +#X obj 184 57 inlet~; +#X obj 183 157 outlet; +#X obj 227 157 outlet; +#X obj 242 90 inlet; +#X obj 183 140 peakit~ 0; +#X text 89 185 argument sets minimum magnitude to report; +#X obj 315 76 switch~ 1024 1 1; +#X obj 315 51 inlet; +#X connect 0 0 5 0; +#X connect 0 1 5 1; +#X connect 1 0 0 0; +#X connect 4 0 5 2; +#X connect 5 0 2 0; +#X connect 5 1 3 0; +#X connect 8 0 7 0; +#X restore 447 134 pd peakit; +#X floatatom 447 69 5 0 0 0 - - -; +#X floatatom 237 168 0 0 0 0 - - -; +#X floatatom 288 168 0 0 0 0 - - -; +#X floatatom 339 168 0 0 0 0 - - -; +#X floatatom 390 168 0 0 0 0 - - -; +#X floatatom 441 168 0 0 0 0 - - -; +#X floatatom 492 168 0 0 0 0 - - -; +#X floatatom 529 168 0 0 0 0 - - -; +#X floatatom 580 168 0 0 0 0 - - -; +#X obj 367 256 listmoses; +#X floatatom 458 242 5 0 0 0 - - -; +#X floatatom 523 242 5 0 0 0 - - -; +#X obj 458 225 unpack f f; +#X floatatom 476 120 3 0 500 2 magnitude-threshold - -; +#X obj 458 191 loadbang; +#X msg 447 52 440; +#X obj 447 35 loadbang; +#X text 13 58 peakit~ finds the frequencies of each peak in an FFT +vector \, which it outputs as a list from the left outlet. It separates +out the magnitudes of those peaks also \, which it outputs from it's +right output. Right-to-left order is preserved so that the object may +be used with the listmoses external.; +#X msg 458 208 300 800; +#N canvas 0 0 615 349 sources 0; +#X obj 37 99 osc~ 440; +#X obj 135 82 sig~; +#X obj 135 99 phasor~ 440; +#X obj 134 121 -~ 0.5; +#X obj 244 100 tabplay~ testinput; +#X obj 65 35 inlet; +#X obj 302 22 inlet; +#X obj 372 100 spigot; +#X obj 302 39 route bang float; +#X obj 31 210 *~ 1; +#X obj 75 210 *~ 0; +#X msg 209 174 1; +#X msg 209 193 0; +#X obj 209 155 sel 0 1 2; +#X msg 232 174 1; +#X msg 232 193 0; +#X msg 255 174 1; +#X msg 255 193 0; +#X obj 119 210 *~ 0; +#X obj 75 251 outlet~; +#X obj 209 138 r \$0-select-input; +#X msg 160 245 set sine; +#X msg 218 245 set sawtooth; +#X msg 304 245 set sample; +#X obj 197 290 s \$0-label; +#X msg 413 67 bang; +#X obj 436 102 openpanel; +#X msg 436 119 read -resize \$1 testinput; +#X obj 436 136 soundfiler; +#X obj 452 203 loadbang; +#X obj 452 248 s \$0-main-on; +#X msg 452 225 1; +#X connect 0 0 9 0; +#X connect 1 0 2 0; +#X connect 2 0 3 0; +#X connect 3 0 10 0; +#X connect 4 0 18 0; +#X connect 4 1 7 0; +#X connect 5 0 0 0; +#X connect 5 0 1 0; +#X connect 6 0 8 0; +#X connect 7 0 4 0; +#X connect 8 0 4 0; +#X connect 8 1 7 1; +#X connect 8 2 25 0; +#X connect 9 0 19 0; +#X connect 10 0 19 0; +#X connect 11 0 9 1; +#X connect 12 0 9 1; +#X connect 13 0 11 0; +#X connect 13 0 15 0; +#X connect 13 0 17 0; +#X connect 13 0 21 0; +#X connect 13 1 12 0; +#X connect 13 1 14 0; +#X connect 13 1 17 0; +#X connect 13 1 22 0; +#X connect 13 2 12 0; +#X connect 13 2 15 0; +#X connect 13 2 16 0; +#X connect 13 2 23 0; +#X connect 14 0 10 1; +#X connect 15 0 10 1; +#X connect 16 0 18 1; +#X connect 17 0 18 1; +#X connect 18 0 19 0; +#X connect 20 0 13 0; +#X connect 21 0 24 0; +#X connect 22 0 24 0; +#X connect 23 0 24 0; +#X connect 25 0 26 0; +#X connect 26 0 27 0; +#X connect 27 0 28 0; +#X connect 29 0 31 0; +#X connect 31 0 30 0; +#X restore 447 86 pd sources; +#X obj 546 69 tgl 17 0 empty empty loop-sample 0 -6 0 8 -262144 -1 +-1 0 1; +#N canvas 0 0 450 300 graph1 0; +#X array testinput 100 float 3; +#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0; +#X coords 0 1 99 -1 100 70 1; +#X restore 642 130 graph; +#X obj 513 27 hradio 15 1 0 3 \$0-select-input empty source 0 -6 0 +8 -262144 -1 -1 0; +#X obj 521 69 bng 17 250 50 0 empty empty play 0 -6 0 8 -262144 -1 +-1; +#X symbolatom 513 42 8 0 0 0 - #0-label -; +#X msg 570 69 load; +#N canvas 0 0 763 487 amp-segregation 0; +#X obj 36 148 listswap; +#X obj 37 49 tabplay~ testinput; +#N canvas 0 0 450 300 peakit 0; +#X obj 70 58 inlet~; +#X obj 67 95 rfft~; +#X obj 67 122 peakit~; +#X obj 67 152 outlet; +#X obj 116 152 outlet; +#X obj 200 125 switch~ 1024 1 1; +#X obj 201 95 inlet; +#X connect 0 0 1 0; +#X connect 1 0 2 0; +#X connect 1 1 2 1; +#X connect 2 0 3 0; +#X connect 2 1 4 0; +#X connect 6 0 5 0; +#X restore 36 118 pd peakit; +#X obj 118 92 tgl 15 0 empty empty on 0 -6 0 12 -262144 -1 -1 0 1; +#X obj 171 49 spigot; +#X obj 222 49 tgl 15 0 empty empty loop 0 -6 0 8 -262144 -1 -1 0 1 +; +#X obj 37 34 bng 15 250 50 0 empty empty play 0 -6 0 8 -262144 -1 -1 +; +#X obj 36 207 listmoses; +#X msg 113 138 10 100; +#X obj 113 155 unpack f f; +#X floatatom 113 172 5 0 0 0 - - -; +#X floatatom 178 172 5 0 0 0 - - -; +#X obj 113 121 loadbang; +#X floatatom 393 319 0 0 0 0 - - -; +#X floatatom 424 302 0 0 0 0 - - -; +#X floatatom 455 285 0 0 0 0 - - -; +#X floatatom 486 268 0 0 0 0 - - -; +#X floatatom 541 319 0 0 0 0 - - -; +#X floatatom 572 302 0 0 0 0 - - -; +#X floatatom 603 285 0 0 0 0 - - -; +#X floatatom 634 268 0 0 0 0 - - -; +#X floatatom 245 320 0 0 0 0 - - -; +#X floatatom 276 302 0 0 0 0 - - -; +#X floatatom 307 285 0 0 0 0 - - -; +#X floatatom 338 268 0 0 0 0 - - -; +#X text 413 235 freqs-MID; +#X obj 245 251 unpack f f f f; +#X obj 393 251 unpack f f f f; +#X obj 541 251 unpack f f f f; +#X text 560 234 freqs-LOUD; +#X text 260 235 freqs-QUIET; +#X floatatom 184 423 0 0 0 0 - - -; +#X floatatom 215 406 0 0 0 0 - - -; +#X floatatom 246 389 0 0 0 0 - - -; +#X floatatom 277 372 0 0 0 0 - - -; +#X floatatom 332 423 0 0 0 0 - - -; +#X floatatom 363 406 0 0 0 0 - - -; +#X floatatom 394 389 0 0 0 0 - - -; +#X floatatom 425 372 0 0 0 0 - - -; +#X floatatom 36 424 0 0 0 0 - - -; +#X floatatom 67 406 0 0 0 0 - - -; +#X floatatom 98 389 0 0 0 0 - - -; +#X floatatom 129 372 0 0 0 0 - - -; +#X obj 36 355 unpack f f f f; +#X obj 184 355 unpack f f f f; +#X obj 332 355 unpack f f f f; +#X text 51 339 mags-QUIET; +#X text 204 339 mags-MID; +#X text 351 338 mags-LOUD; +#X text 336 251 f...; +#X text 484 251 f...; +#X text 632 251 f...; +#X text 127 355 f...; +#X text 275 355 f...; +#X text 423 355 f...; +#X text 243 85 peakit~ / listmoses can also be used to segregate frequencies +according to their power. You nee the listswap abstraction for this. +1st 4 elements of each list shown...; +#X connect 0 0 7 0; +#X connect 0 1 7 1; +#X connect 1 0 2 0; +#X connect 1 1 4 0; +#X connect 2 0 0 0; +#X connect 2 1 0 1; +#X connect 3 0 2 1; +#X connect 4 0 1 0; +#X connect 5 0 4 1; +#X connect 6 0 1 0; +#X connect 7 0 43 0; +#X connect 7 1 44 0; +#X connect 7 2 45 0; +#X connect 7 3 26 0; +#X connect 7 4 27 0; +#X connect 7 5 28 0; +#X connect 8 0 9 0; +#X connect 9 0 10 0; +#X connect 9 1 11 0; +#X connect 10 0 7 2; +#X connect 11 0 7 3; +#X connect 12 0 8 0; +#X connect 26 0 21 0; +#X connect 26 1 22 0; +#X connect 26 2 23 0; +#X connect 26 3 24 0; +#X connect 27 0 13 0; +#X connect 27 1 14 0; +#X connect 27 2 15 0; +#X connect 27 3 16 0; +#X connect 28 0 17 0; +#X connect 28 1 18 0; +#X connect 28 2 19 0; +#X connect 28 3 20 0; +#X connect 43 0 39 0; +#X connect 43 1 40 0; +#X connect 43 2 41 0; +#X connect 43 3 42 0; +#X connect 44 0 31 0; +#X connect 44 1 32 0; +#X connect 44 2 33 0; +#X connect 44 3 34 0; +#X connect 45 0 35 0; +#X connect 45 1 36 0; +#X connect 45 2 37 0; +#X connect 45 3 38 0; +#X restore 69 235 pd amp-segregation; +#X obj 613 119 tgl 15 0 empty \$0-main-on on 0 -6 0 8 -262144 -1 -1 +0 1; +#X floatatom 146 389 0 0 0 0 - - -; +#X floatatom 177 372 0 0 0 0 - - -; +#X floatatom 208 355 0 0 0 0 - - -; +#X floatatom 239 338 0 0 0 0 - - -; +#X floatatom 269 389 0 0 0 0 - - -; +#X floatatom 300 372 0 0 0 0 - - -; +#X floatatom 331 355 0 0 0 0 - - -; +#X floatatom 362 338 0 0 0 0 - - -; +#X floatatom 23 390 0 0 0 0 - - -; +#X floatatom 54 372 0 0 0 0 - - -; +#X floatatom 85 355 0 0 0 0 - - -; +#X floatatom 116 338 0 0 0 0 - - -; +#X text 166 305 freqs-MID; +#X obj 23 321 unpack f f f f; +#X obj 146 321 unpack f f f f; +#X obj 269 321 unpack f f f f; +#X floatatom 516 389 0 0 0 0 - - -; +#X floatatom 547 372 0 0 0 0 - - -; +#X floatatom 578 355 0 0 0 0 - - -; +#X floatatom 609 338 0 0 0 0 - - -; +#X floatatom 640 389 0 0 0 0 - - -; +#X floatatom 671 372 0 0 0 0 - - -; +#X floatatom 702 355 0 0 0 0 - - -; +#X floatatom 733 338 0 0 0 0 - - -; +#X floatatom 392 390 0 0 0 0 - - -; +#X floatatom 423 372 0 0 0 0 - - -; +#X floatatom 454 355 0 0 0 0 - - -; +#X floatatom 485 338 0 0 0 0 - - -; +#X obj 392 321 unpack f f f f; +#X obj 516 321 unpack f f f f; +#X obj 640 321 unpack f f f f; +#X text 536 305 mags-MID; +#X text 114 321 f...; +#X text 237 321 f...; +#X text 360 321 f...; +#X text 483 321 f...; +#X text 607 321 f...; +#X text 731 321 f...; +#X text 407 305 mags-LOW; +#X text 659 305 mags-HIGH; +#X text 38 305 freqs-LOW; +#X text 288 304 freqs-HIGH; +#X obj 313 151 unpack f f f f f f f f; +#X text 329 133 it's in here--->; +#X obj 17 21 peakit~; +#X text 17 21 peakit~ - FFT peak frequencies and magnitudes; +#X text 85 37 (c) Edward Kelly 2005 - GNU GPL; +#X connect 0 0 10 0; +#X connect 0 0 71 0; +#X connect 0 1 10 1; +#X connect 1 0 20 0; +#X connect 10 0 42 0; +#X connect 10 1 43 0; +#X connect 10 2 44 0; +#X connect 10 3 57 0; +#X connect 10 4 58 0; +#X connect 10 5 59 0; +#X connect 11 0 10 2; +#X connect 12 0 10 3; +#X connect 13 0 11 0; +#X connect 13 1 12 0; +#X connect 14 0 0 1; +#X connect 15 0 19 0; +#X connect 16 0 1 0; +#X connect 17 0 16 0; +#X connect 19 0 13 0; +#X connect 20 0 0 0; +#X connect 21 0 20 1; +#X connect 24 0 20 1; +#X connect 26 0 20 1; +#X connect 28 0 0 2; +#X connect 42 0 37 0; +#X connect 42 1 38 0; +#X connect 42 2 39 0; +#X connect 42 3 40 0; +#X connect 43 0 29 0; +#X connect 43 1 30 0; +#X connect 43 2 31 0; +#X connect 43 3 32 0; +#X connect 44 0 33 0; +#X connect 44 1 34 0; +#X connect 44 2 35 0; +#X connect 44 3 36 0; +#X connect 57 0 53 0; +#X connect 57 1 54 0; +#X connect 57 2 55 0; +#X connect 57 3 56 0; +#X connect 58 0 45 0; +#X connect 58 1 46 0; +#X connect 58 2 47 0; +#X connect 58 3 48 0; +#X connect 59 0 49 0; +#X connect 59 1 50 0; +#X connect 59 2 51 0; +#X connect 59 3 52 0; +#X connect 71 0 2 0; +#X connect 71 1 3 0; +#X connect 71 2 4 0; +#X connect 71 3 5 0; +#X connect 71 4 6 0; +#X connect 71 5 7 0; +#X connect 71 6 8 0; +#X connect 71 7 9 0; diff --git a/peakit~/peakit~.c b/peakit~/peakit~.c new file mode 100644 index 0000000..09cf787 --- /dev/null +++ b/peakit~/peakit~.c @@ -0,0 +1,138 @@ +/* peakit~ - find frequencies and magnitudes of FFT peaks + * Copyright (C) 2005 Edward Kelly <morph_2016@yahoo.co.uk> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "m_pd.h" +#include <math.h> +#include <string.h> + +static t_class *peakit_tilde_class; + +typedef struct _bin_store +{ + t_atom peaks[2048]; + t_atom indices[2048]; + t_atom theta[4096]; + t_atom t_prev[4096]; + t_atom t_delta[4096]; + t_atom peakfreqs[2048]; + t_float *f_real, *f_imag; +} t_bin_store; + +typedef struct _peakit_tilde +{ + t_object x_obj; + t_bin_store x_ctl; + t_outlet *peaks_list, *mags_list; + t_float f_npeaks, f_minmag, f_dummy; +} t_peakit_tilde; + +t_int *peakit_tilde_perform(t_int *w) +{ + t_peakit_tilde *x = (t_peakit_tilde *)(w[1]); + t_bin_store *store = (t_bin_store *)(w[2]); + t_sample *profile = (t_sample *)(w[3]); + int n = (int)(w[4]); + t_float *real = store->f_real; + t_float *imag = store->f_imag; + int vector = n; + float s_rate = sys_getsr(); + float bin = s_rate/n; + float boff = bin/2; + float interp; + float minus_two = 0; + float minus_one = 0; + float alpha = 0; + float peakfreq; + float theta = 0; + float t_prev = 0; + float t_delta; + float pi=M_PI; + float twopi=2*pi; + t_int npeaks = 0; + int i, ndx; + + /* find peaks in fourier series */ + for (i = 0; i < n; i++) + { + alpha = sqrt(real[i] * real[i] + imag[i] * imag[i]); + theta = atan2(real[i], imag[i]); + t_prev = atom_getfloatarg(i, 16384, store->theta); + SETFLOAT (&store->t_prev[i], t_prev); + SETFLOAT (&store->theta[i], theta); + t_delta = (atom_getfloatarg(i, 16384, store->theta))-(atom_getfloatarg(i, 16384, store->t_prev)); + SETFLOAT (&store->t_delta[i], t_delta); + if (minus_two<minus_one && alpha<minus_one && minus_one>(x->f_minmag/1000)) + { + SETFLOAT (&store->peaks[npeaks],minus_one); + SETFLOAT (&store->indices[npeaks],i-1); + npeaks++; + } + minus_two = minus_one; + minus_one = alpha; + } + for (i = 0; i < npeaks; i++) + { + ndx = atom_getfloatarg(i, 8192, store->indices); + t_delta = atom_getfloatarg(ndx, 16384, store->t_delta); + theta = atom_getfloatarg(ndx, 8192, store->theta); + t_prev = atom_getfloatarg(ndx, 8192, store->t_prev); + t_delta = (t_delta < -pi) ? (theta+twopi)-t_prev : (t_delta > pi) ? theta-(t_prev+twopi) : t_delta; + // t_delta = (t_delta < -pi) ? (theta+twopi)-t_prev : (t_delta > pi) ? theta-(t_prev+twopi) : t_delta; + peakfreq = (ndx * bin + (boff * (t_delta/pi))); + SETFLOAT (&store->peakfreqs[i], peakfreq); + } + outlet_list(x->mags_list, gensym("list"), (npeaks - 1), store->peaks); + outlet_list(x->peaks_list, gensym("list"), (npeaks - 1), store->peakfreqs); + return(w+5); +} + +void *peakit_tilde_dsp(t_peakit_tilde *x, t_signal **sp) +{ + x->x_ctl.f_real = sp[0]->s_vec; + x->x_ctl.f_imag = sp[1]->s_vec; + dsp_add(peakit_tilde_perform, 4, x, &x->x_ctl, sp[0]->s_vec, sp[0]->s_n); + return (void *)x; +} + +void *peakit_tilde_new(t_floatarg f) +{ + t_peakit_tilde *x = (t_peakit_tilde *)pd_new(peakit_tilde_class); + x->f_minmag = f; + memset(x->x_ctl.theta, 0, 8192); + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); + floatinlet_new(&x->x_obj, &x->f_minmag); + x->peaks_list = outlet_new(&x->x_obj, &s_list); + x->mags_list = outlet_new(&x->x_obj, &s_list); + return (void *)x; +} + +void peakit_tilde_setup(void) +{ + peakit_tilde_class = class_new(gensym("peakit~"), + (t_newmethod)peakit_tilde_new, + 0, sizeof(t_peakit_tilde), + CLASS_DEFAULT, A_DEFFLOAT, 0); + + post("|--<>---<>--<peakit~>-<>--<>----<>--|"); + post("|--<FFT peaks list>-<>---<>--<>-----|"); + post("|---<>-<frequencies and magnitudes>-|"); + post("|-<>-<edward>-<kelly>--<>---<2005>--|"); + + class_sethelpsymbol(peakit_tilde_class, gensym("help-peakit~")); + class_addmethod(peakit_tilde_class, (t_method)peakit_tilde_dsp, gensym("dsp"), 0); + CLASS_MAINSIGNALIN(peakit_tilde_class, t_peakit_tilde, f_dummy); +} |