pax_global_header00006660000000000000000000000064143450772020014516gustar00rootroot0000000000000052 comment=070ac4a0d78b1f833cccfa0f70eed247aa9783df pd-windowing-0.3.0/000077500000000000000000000000001434507720200141245ustar00rootroot00000000000000pd-windowing-0.3.0/LICENSE.txt000066400000000000000000000432541434507720200157570ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. pd-windowing-0.3.0/Makefile000066400000000000000000000013121434507720200155610ustar00rootroot00000000000000# Makefile for Makefile.pdlibbuilder. # lib.name := windowing bartlett~.class.sources = src/bartlett~.c blackman~.class.sources = src/blackman~.c connes~.class.sources = src/connes~.c cosine~.class.sources = src/cosine~.c gaussian~.class.sources = src/gaussian~.c hamming~.class.sources = src/hamming~.c hanning~.class.sources = src/hanning~.c kaiser~.class.sources = src/kaiser~.c lanczos~.class.sources = src/lanczos~.c welch~.class.sources = src/welch~.c datafiles = \ $(wildcard help/*-help.pd) \ help/dspSwitch~.pd \ LICENSE.txt \ README.md \ README.txt \ src/mconf.h \ windowing-meta.pd PDLIBBUILDER_DIR=pd-lib-builder/ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder pd-windowing-0.3.0/README.md000066400000000000000000000013221434507720200154010ustar00rootroot00000000000000

windowing - Windowing is an implementation of several window functions by Joseph A. Sarlo.

This git-fork of the Pure-data library windowing is cloned from https://git.puredata.info/cgit/svn2git/libraries/fwindowing.git, which is the svn-to-git from https://sourceforge.net/p/pure-data/svn/HEAD/tree/trunk/externals/windowing/.

See the original README.txt for more information. An extensive description of window functions can be found at https://en.wikipedia.org/wiki/Window_function.

For bugs found in this version, please report them to me. Joseph is not responsible for bugs introduced by me.

Fred Jan Kraan fjkraan@electrickery.nl 2022-12-10 pd-windowing-0.3.0/README.txt000066400000000000000000000007521434507720200156260ustar00rootroot00000000000000Provides: hammimng~, hanning~, blackman~, cosine~, connes~, bartlett~, welch~, lanczos~, gaussian~, and kaiser~ Usage: Windows inlet signal on each DSP block and sends to outlet gaussian~ takes one optional argument (standard deviation) May be set by float in left inlet kaiser~ takes one option argument (alpha) May be set by float in left inlet See windowing.pd To build: Linux: make windowing_linux Windows: nmake windowing_nt pd-windowing-0.3.0/help/000077500000000000000000000000001434507720200150545ustar00rootroot00000000000000pd-windowing-0.3.0/help/bartlett~-help.pd000066400000000000000000000042771434507720200203600ustar00rootroot00000000000000#N canvas 1 80 571 517 10; #X obj 4 493 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 2 cnv 15 550 40 empty \$0-pddp.cnv.header bartlett~ 3 12 0 18 -204280 -1 0; #X obj 3 258 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 318 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 373 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 278 cnv 17 3 25 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 59 formula:; #X obj 97 105 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 85 1; #X obj 94 65 loadbang; #X text 15 104 height --->; #X obj 94 124 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-bartlett 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 326 106 graph; #X text 102 408 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X obj 94 229 tabsend~ \$0-bartlett; #X text 169 72 1-x^2; #X text 15 25 description: generates a bartlett window for each dsp block; #X obj 72 338 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #N canvas 303 134 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 45 DESCRIPTION generate a bartlett window for each dsp block ; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X restore 501 494 pd META; #X text 101 276 signal; #X text 101 336 signal; #X text 151 276 - the height (amplitude) of the window is controlled by the signal on its inlet.; #X text 151 336 - a bartlett (triangle) window with size=dsp blocksize ; #X obj 486 7 bartlett~; #X obj 94 174 windowing/bartlett~; #X obj 255 216 windowing/dspSwitch~; #X connect 7 0 11 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 11 0 24 0; #X connect 24 0 14 0; pd-windowing-0.3.0/help/blackman~-help.pd000066400000000000000000000043431434507720200203010ustar00rootroot00000000000000#N canvas 1 80 559 522 10; #X obj 4 498 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 2 cnv 15 550 40 empty \$0-pddp.cnv.header blackman~ 3 12 0 18 -204280 -1 0; #X obj 3 258 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 318 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 378 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 278 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 59 formula:; #X obj 97 105 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 85 1; #X obj 94 65 loadbang; #X text 16 104 height --->; #X text 15 25 description: generates a blackman window for each dsp block; #X obj 94 127 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-blackman 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 326 105 graph; #X text 168 89 0.8*cos(2*pi*x); #X text 168 74 0.42+(0.5*cos(pi*x))+; #X text 102 413 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X obj 93 228 tabsend~ \$0-blackman; #X obj 73 338 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 102 278 signal; #X text 102 337 signal; #X text 152 278 - the height (amplitude) of the window is controlled by the signal on its inlet.; #X text 152 337 - a blackman window with size=dsp blocksize; #N canvas 306 207 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a blackman window for each dsp block ; #X restore 505 499 pd META; #X obj 490 5 blackman~; #X obj 94 175 windowing/blackman~; #X obj 249 215 windowing/dspSwitch~; #X connect 7 0 12 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 12 0 25 0; #X connect 25 0 17 0; pd-windowing-0.3.0/help/connes~-help.pd000066400000000000000000000043031434507720200200120ustar00rootroot00000000000000#N canvas 1 80 559 535 10; #X obj 4 513 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 3 cnv 15 550 40 empty \$0-pddp.cnv.header connes~ 3 12 0 18 -204280 -1 0; #X obj 3 259 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 319 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 379 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 279 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 60 formula:; #X floatatom 94 125 5 0 0 0 - - -, f 5; #X obj 97 106 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 86 1; #X obj 94 66 loadbang; #X text 15 105 height --->; #X text 103 427 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X obj 94 143 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-connes 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 301 110 graph; #X text 169 72 cos(pi*x/2); #X obj 72 339 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X obj 94 231 tabsend~ \$0-connes; #X text 102 278 SIGNAL: the height (amplitude) of the window is controlled by the signal on its inlet.; #X text 103 337 SIGNAL: a connes window with size=dsp blocksize; #X text 15 26 description: generates a connes window for each dsp block ; #N canvas 309 235 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a connes window for each dsp block ; #X restore 502 513 pd META; #X obj 242 217 windowing/dspSwitch~; #X obj 94 186 windowing/connes~; #X obj 487 9 connes~; #X connect 7 0 13 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 13 0 23 0; #X connect 23 0 17 0; pd-windowing-0.3.0/help/cosine~-help.pd000066400000000000000000000043701434507720200200110ustar00rootroot00000000000000#N canvas 1 80 559 497 10; #X obj 4 472 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 1 cnv 15 550 40 empty \$0-pddp.cnv.header cosine~ 3 12 0 18 -204280 -1 0; #X obj 3 250 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 310 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 370 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 270 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 58 formula:; #X floatatom 94 117 5 0 0 0 - - -, f 5; #X obj 97 98 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 78 1; #X obj 94 58 loadbang; #X text 13 99 height --->; #X text 103 388 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X obj 94 135 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-cosine 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 336 105 graph; #X text 169 70 cos(pi*x/2); #X text 15 24 description: generates a cosine window for each dsp block ; #X obj 94 228 tabsend~ \$0-cosine; #X obj 72 330 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 102 269 SIGNAL: the height (amplitude) of the window is controled by the signal on its inlet.; #X text 103 328 SIGNAL: a cosine (otherwise known as a sine - actually it's half a sine) window with size=dsp blocksize; #N canvas 309 222 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a cosine window for each dsp block ; #X restore 502 474 pd META; #X obj 255 215 windowing/dspSwitch~; #X obj 94 182 windowing/cosine~; #X obj 501 5 cosine~; #X connect 7 0 13 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 13 0 23 0; #X connect 23 0 17 0; pd-windowing-0.3.0/help/dspSwitch~.pd000066400000000000000000000025031434507720200175470ustar00rootroot00000000000000#N canvas 50 411 430 408 10; #X obj 50 95 tgl 30 0 THIS_IS_HERE_TO_GET_RID_OF_THE_OUTLET \$0-dsp-toggle dsp 2 9 1 17 -262144 -195568 -33289 0 1; #N canvas 436 649 433 356 dsp 0; #X obj 70 31 inlet; #X obj 151 250 select 0 1; #X msg 184 275 6; #X obj 151 87 route dsp; #X obj 151 60 receive pd; #X msg 70 251 dsp \$1; #X obj 70 276 send pd; #X msg 265 302 set \$1; #X msg 151 302 color \$1 20 12; #X obj 265 333 send \$0-dsp-toggle; #X msg 151 274 0; #X obj 285 130 loadbang; #X obj 265 100 sig~ 1; #X obj 265 192 snapshot~; #X obj 285 159 delay 100; #X obj 151 139 change -1; #X obj 3 3 cnv 15 425 20 empty empty empty 3 12 0 14 -204280 -1 0; #X text 7 4 Retrieve and set DSP state; #X connect 0 0 5 0; #X connect 0 0 15 0; #X connect 1 0 10 0; #X connect 1 1 2 0; #X connect 2 0 8 0; #X connect 3 0 15 0; #X connect 4 0 3 0; #X connect 5 0 6 0; #X connect 7 0 9 0; #X connect 8 0 9 0; #X connect 10 0 8 0; #X connect 11 0 14 0; #X connect 12 0 13 0; #X connect 13 0 1 0; #X connect 13 0 7 0; #X connect 14 0 13 0; #X connect 15 0 7 0; #X connect 15 0 1 0; #X restore 82 158 pd dsp logic; #X obj 2 2 cnv 15 425 20 empty empty empty 3 12 0 14 -204280 -1 0; #X text 7 3 DSP switch abstraction; #X text 20 355 Derived from output~.pd created by Katja Vetter after an idea by Claude Heiland-Allen; #X connect 0 0 1 0; #X coords 0 0 1 1 30 30 2 50 95; pd-windowing-0.3.0/help/gaussian~-help.pd000066400000000000000000000047471434507720200203530ustar00rootroot00000000000000#N canvas 1 80 569 517 10; #X obj 4 500 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 4 cnv 15 550 40 empty \$0-pddp.cnv.header gaussian~ 3 12 0 18 -204280 -1 0; #X obj 3 260 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 340 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 390 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 280 cnv 17 3 50 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 61 formula:; #X obj 97 107 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 81 1; #X obj 94 61 loadbang; #X text 15 106 height --->; #X obj 94 127 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-gaussian 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 326 108 graph; #X text 102 279 SIGNAL: the height (amplitude) of the window is controlled by the signal on its inlet.; #X text 15 27 description: generates a gaussian window for each dsp block; #X obj 95 231 tabsend~ \$0-gaussian; #X text 103 352 SIGNAL: a gaussian window with size=dsp blocksize; #X obj 195 107 hsl 71 15 0 2 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 1750 1; #X floatatom 192 126 5 0 0 0 - - -, f 5; #X msg 121 81 0.5; #X text 102 305 FLOAT: the width of the gaussian distribution curve is controlled by floats in the inlet; #X text 169 75 2^(-(x/d)^2); #X obj 73 351 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #N canvas 310 251 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a gaussian window for each dsp block ; #X restore 505 501 pd META; #X obj 483 7 gaussian~; #X obj 95 178 windowing/gaussian~; #X obj 255 218 windowing/dspSwitch~; #X text 103 413 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X connect 7 0 11 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 9 0 19 0; #X connect 11 0 25 0; #X connect 17 0 18 0; #X connect 18 0 25 0; #X connect 19 0 17 0; #X connect 25 0 15 0; pd-windowing-0.3.0/help/hamming~-help.pd000066400000000000000000000043421434507720200201500ustar00rootroot00000000000000#N canvas 1 80 559 514 10; #X obj 4 481 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 3 cnv 15 550 40 empty \$0-pddp.cnv.header hamming~ 3 12 0 18 -204280 -1 0; #X obj 3 249 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 309 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 369 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 269 cnv 17 3 25 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 60 formula:; #X floatatom 94 116 5 0 0 0 - - -, f 5; #X obj 97 97 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 77 1; #X obj 94 57 loadbang; #X text 15 96 height --->; #X text 15 26 description: generates a hamming window for each dsp block; #X obj 94 134 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-hamming 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 334 101 graph; #X text 167 73 0.54+0.46*(cos(pi*x)); #X text 102 391 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X text 103 327 SIGNAL: a hamming (raised cosine) window with size=dsp blocksize; #X obj 94 224 tabsend~ \$0-hamming; #X obj 72 329 cnv 17 3 25 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 102 268 SIGNAL: the height (amplitude) of the window is controlled by the signal on its inlet.; #N canvas 288 199 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a hamming window for each dsp block ; #X restore 505 481 pd META; #X obj 487 6 hamming~; #X obj 94 180 windowing/hamming~; #X obj 255 211 windowing/dspSwitch~; #X connect 7 0 13 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 13 0 23 0; #X connect 23 0 18 0; pd-windowing-0.3.0/help/hanning~-help.pd000066400000000000000000000043421434507720200201520ustar00rootroot00000000000000#N canvas 1 80 561 515 10; #X obj 4 477 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 1 cnv 15 550 40 empty \$0-pddp.cnv.header hanning~ 3 12 0 18 -204280 -1 0; #X obj 3 244 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 304 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 364 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 264 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-hanning 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 324 99 graph; #X text 168 71 0.5*(1+cos(pi*x)); #X obj 94 134 sig~ 1; #X text 168 58 formula:; #X floatatom 94 117 5 0 0 0 - - -, f 5; #X obj 97 98 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 78 1; #X obj 94 58 loadbang; #X text 103 322 SIGNAL: a hanning (inverted cosine) window with size=dsp blocksize; #X text 14 97 height --->; #X text 15 24 description: generates a hanning window for each dsp block; #X text 102 392 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X obj 94 222 tabsend~ \$0-hanning; #X text 102 263 SIGNAL: the height (amplitude) of the window is controled by the signal on its inlet.; #X obj 72 324 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #N canvas 290 213 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a hanning window for each dsp block ; #X restore 505 478 pd META; #X obj 491 5 hanning~; #X obj 94 180 windowing/hanning~; #X obj 253 209 windowing/dspSwitch~; #X connect 8 0 23 0; #X connect 10 0 8 0; #X connect 11 0 10 0; #X connect 12 0 11 0; #X connect 13 0 12 0; #X connect 23 0 18 0; pd-windowing-0.3.0/help/kaiser~-help.pd000066400000000000000000000050761434507720200200130ustar00rootroot00000000000000#N canvas 1 80 557 517 10; #X obj 4 506 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 3 cnv 15 550 40 empty \$0-pddp.cnv.header kaiser~ 3 12 0 18 -204280 -1 0; #X obj 3 279 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 359 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 399 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 299 cnv 17 3 50 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 47 formula:; #X obj 97 114 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 84 1; #X obj 94 64 loadbang; #X text 13 113 height --->; #X obj 94 133 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-kaiser 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 326 130 graph; #X text 103 423 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X text 102 298 SIGNAL: the height (amplitude) of the window is controlled by the signal on its inlet.; #X obj 186 114 hsl 81 15 1 240 1 0 empty empty empty -2 -6 0 10 -262144 -1 -1 3361 1; #X floatatom 183 133 5 0 0 0 - - -, f 5; #X obj 94 253 tabsend~ \$0-kaiser; #X text 169 91 modified Bessel function; #X text 169 77 where Io is 0th order; #X text 168 62 Io(a*sqrt(1-x^2))/Io(a); #X text 103 367 SIGNAL: a kaiser (exponential decay) window with size=dsp blocksize; #X msg 121 84 10; #X text 102 324 FLOAT: the narrowness of the kaiser window is controlled by floats in the inlet; #X text 15 26 description: generates a kaiser window for each dsp block ; #N canvas 286 187 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a kaiser window for each dsp block ; #X restore 506 506 pd META; #X obj 72 369 cnv 17 3 25 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X obj 94 198 windowing/kaiser~; #X obj 244 240 windowing/dspSwitch~; #X obj 493 8 kaiser~; #X connect 7 0 11 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 9 0 22 0; #X connect 11 0 27 0; #X connect 15 0 16 0; #X connect 16 0 27 0; #X connect 22 0 15 0; #X connect 27 0 17 0; pd-windowing-0.3.0/help/lanczos~-help.pd000066400000000000000000000042301434507720200201750ustar00rootroot00000000000000#N canvas 1 80 560 517 10; #X obj 4 479 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 1 cnv 15 550 40 empty \$0-pddp.cnv.header lanczos~ 3 12 0 18 -204280 -1 0; #X obj 3 257 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 317 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 370 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 277 cnv 17 3 30 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 51 formula:; #X obj 97 97 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 77 1; #X obj 94 57 loadbang; #X text 16 96 height --->; #X obj 94 115 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-lanczos 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 326 105 graph; #X text 102 391 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X text 102 276 SIGNAL: the height (amplitude) of the window is controlled by the signal on its inlet.; #X text 169 63 sin(pi*x)/(pi*x); #X text 15 24 description: generates a lanczos window for each dsp block; #X obj 94 228 tabsend~ \$0-lanczos; #X text 103 335 SIGNAL: a lanczos (sinc) window with size=dsp blocksize ; #X obj 72 337 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #N canvas 288 245 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a lanczos window for each dsp block ; #X restore 505 480 pd META; #X obj 483 4 lanczos~; #X obj 95 170 windowing/lanczos~; #X obj 255 215 windowing/dspSwitch~; #X connect 7 0 11 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 11 0 22 0; #X connect 22 0 17 0; pd-windowing-0.3.0/help/welch~-help.pd000066400000000000000000000041721434507720200176330ustar00rootroot00000000000000#N canvas 1 80 560 517 10; #X obj 4 482 cnv 15 550 20 empty \$0-pddp.cnv.footer empty 20 12 0 14 -228856 -66577 0; #X obj 4 2 cnv 15 550 40 empty \$0-pddp.cnv.header welch~ 3 12 0 18 -204280 -1 0; #X obj 3 246 cnv 3 550 3 empty \$0-pddp.cnv.inlets inlets 8 12 0 13 -228856 -1 0; #X obj 3 306 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlet 8 12 0 13 -228856 -1 0; #X obj 3 359 cnv 3 550 3 empty \$0-pddp.cnv.more_info more_info 8 12 0 13 -228856 -1 0; #X obj 72 266 cnv 17 3 25 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #X text 168 59 formula:; #X obj 97 105 hsl 71 15 -1 1 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 7000 1; #X msg 94 85 1; #X obj 94 65 loadbang; #X text 12 104 height --->; #X obj 94 123 sig~ 1; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-welch 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 326 97 graph; #X text 102 390 Windowing functions are used with FFTs. These transform the signal block-by-block into a spectral representation whose resolution in both the frequency and time domains are proportional to their size (as a power-of-two in PD). The different windows have different characteristics in terms of stopband attenuation and noise bandwidth.; #X text 102 265 SIGNAL: the height (amplitude) of the window is controlled by the signal on its inlet.; #X obj 94 220 tabsend~ \$0-welch; #X text 169 72 1-abs(x); #X text 103 324 SIGNAL: a welch window with size=dsp blocksize; #X text 15 25 description: generates a welch window for each dsp block ; #X obj 73 326 cnv 17 3 17 empty \$0-pddp.cnv.let.0 0 5 9 0 16 -228856 -162280 0; #N canvas 290 303 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION generate a welch window for each dsp block ; #X restore 505 483 pd META; #X obj 94 169 windowing/welch~; #X obj 255 207 windowing/dspSwitch~; #X obj 504 5 welch~; #X connect 7 0 11 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 11 0 21 0; #X connect 21 0 15 0; pd-windowing-0.3.0/help/windowing-help.pd000066400000000000000000000074101434507720200203360ustar00rootroot00000000000000#N canvas 26 103 857 779 10; #X declare -path ..; #X obj 16 82 sig~ 1; #X obj 185 82 sig~ 1; #X obj 16 227 sig~ 1; #X obj 185 227 sig~ 1; #X obj 16 369 sig~ 1; #X obj 185 369 sig~ 1; #X obj 16 534 sig~ 1; #X obj 185 534 sig~ 1; #X obj 16 674 sig~ 1; #X floatatom 68 677 5 0 0 0 - - -, f 5; #X obj 185 674 sig~ 1; #X floatatom 236 677 5 0 0 0 - - -, f 5; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-hanning 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 369 36 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-hamming 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 630 35 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-blackman 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 369 179 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-connes 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 631 178 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-cosine 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 369 322 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-bartlett 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 631 321 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-welch 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 369 466 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-lanczos 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 631 465 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-gaussian 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 369 610 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-kaiser 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 631 609 graph; #X text 278 392 (triangle); #X text 276 546 (sinc); #X text 16 58 0.5*(1+cos(pi*x)); #X text 185 59 0.54+0.46*(cos(pi*x)); #X text 16 205 0.8*cos(2*pi*x); #X text 185 202 (1-x^2)^2; #X text 16 190 0.42+(0.5*cos(pi*x))+; #X text 16 345 cos(pi*x/2); #X text 185 346 1-x^2; #X text 16 511 1 - abs(x); #X text 185 512 sin(pi*x)/(pi*x); #X text 16 633 2^(-(x/d)^2); #X text 185 653 modified Bessel function; #X text 185 639 where Io is 0th order; #X text 185 624 Io(a*sqrt(1-x^2))/Io(a); #X obj 186 27 declare -path ..; #N canvas 1126 735 494 344 META 0; #X text 12 125 HELP_PATCH_AUTHORS "pd meta" information added by Jonathan Wilkes for Pd version 0.42.; #X text 12 25 LICENSE GPL v2; #X text 12 5 KEYWORDS signal; #X text 12 65 INLET_0 signal; #X text 12 85 OUTLET_0 signal; #X text 12 105 AUTHOR Joe Sarlo; #X text 12 45 DESCRIPTION objects to create ten different windows; #X restore 318 733 pd META; #X obj 16 120 windowing/hanning~; #X obj 185 120 windowing/hamming~; #X obj 185 265 windowing/connes~; #X obj 185 409 windowing/bartlett~; #X obj 16 407 windowing/cosine~; #X obj 16 561 windowing/welch~; #X obj 16 707 windowing/gaussian~ 0.5; #X obj 185 707 windowing/kaiser~ 10; #X obj 185 561 windowing/lanczos~; #X obj 16 265 windowing/blackman~; #X obj 16 159 tabsend~ \$0-hanning; #X obj 185 159 tabsend~ \$0-hamming; #X obj 185 302 tabsend~ \$0-connes; #X obj 16 302 tabsend~ \$0-blackman; #X obj 16 445 tabsend~ \$0-cosine; #X obj 185 445 tabsend~ \$0-bartlett; #X obj 185 589 tabsend~ \$0-lanczos; #X obj 16 589 tabsend~ \$0-welch; #X obj 16 733 tabsend~ \$0-gaussian; #X obj 185 733 tabsend~ \$0-kaiser; #X obj 334 701 windowing/dspSwitch~; #X obj 0 4 cnv 15 350 20 empty empty empty 3 12 0 14 -204280 -1 0; #X text 6 5 All windowing objects; #X connect 0 0 39 0; #X connect 1 0 40 0; #X connect 2 0 48 0; #X connect 3 0 41 0; #X connect 4 0 43 0; #X connect 5 0 42 0; #X connect 6 0 44 0; #X connect 7 0 47 0; #X connect 8 0 45 0; #X connect 9 0 45 0; #X connect 10 0 46 0; #X connect 11 0 46 0; #X connect 39 0 49 0; #X connect 40 0 50 0; #X connect 41 0 51 0; #X connect 42 0 54 0; #X connect 43 0 53 0; #X connect 44 0 56 0; #X connect 45 0 57 0; #X connect 46 0 58 0; #X connect 47 0 55 0; #X connect 48 0 52 0; pd-windowing-0.3.0/objects.txt000066400000000000000000000011661434507720200163220ustar00rootroot00000000000000bartlett generates a bartlett (triangle) window for each dsp block blackman generates a blackman window for each dsp block connes generates a connes window for each dsp block cosine generates a cosine window for each dsp block gaussian generates a gaussian window for each dsp block hamming generates a hamming (raised cosine) window for each dsp block hanning generates a hanning (inverted cosine) window for each dsp block kaiser generates a kaiser (exponential decay) window for each dsp block lanczos generates a lanczos (sinc) window for each dsp block welch generates a welch window for each dsp block pd-windowing-0.3.0/pd-lib-builder/000077500000000000000000000000001434507720200167175ustar00rootroot00000000000000pd-windowing-0.3.0/pd-lib-builder/Makefile.pdlibbuilder000066400000000000000000001270261434507720200230270ustar00rootroot00000000000000# Makefile.pdlibbuilder dated 2019-12-21 version = 0.6.0 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - STRIP # - DESTDIR # # Optional user variables for make command line or environment: # # - PLATFORM # # Deprecated path variables: # # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overridden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # PLATFORM: # Target platform for cross compilation in the form of GNU triplet: # cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that # pdlibbuilder will use, if installed and locatable. System and architecture # will then be autodefined accordingly. In most cases no other variables need to # be overridden. # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # STRIP # Name of strip program. Default 'strip' can be overridden in cross compilation # environments. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/Pd/src # %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows) # # Default search path for binary pd.dll (Windows), overridable by PDBINDIR # # %PROGRAMFILES%/Pd/bin # %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows) # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # dumpmachine: print compiler output of option '-dumpmachine' # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### target platform detection ################################################## ################################################################################ #=== target platform =========================================================== # PLATFORM: optional user variable to define target platform for cross # compilation. Redefine build tools accordingly. PLATFORM should match # the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32, # x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes # will get the same. ifneq ($(PLATFORM),) ifneq ($(findstring darwin, $(PLATFORM)),) export CC = $(PLATFORM)-cc export CXX = $(PLATFORM)-c++ export CPP = $(PLATFORM)-cc else export CC = $(PLATFORM)-gcc export CXX = $(PLATFORM)-g++ export CPP = $(PLATFORM)-cpp endif STRIP = $(PLATFORM)-strip endif # Let (native or cross-) compiler report target triplet and isolate individual # words therein to facilitate later processing. target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine)) #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),) system = Linux endif ifneq ($(filter darwin%, $(target.triplet)),) system = Darwin endif ifneq ($(filter mingw% cygwin%, $(target.triplet)),) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== architecture ============================================================== # The following CPU names can be processed by pdlibbuilder: # i*86 Intel 32 bit # x86_64 Intel 64 bit # arm ARM 32 bit # aarch64 ARM 64 bit target.arch := $(firstword $(target.triplet)) ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. To see gcc's default architecture flags: # $ gcc -Q --help=target # ARMv6: Raspberry Pi 1st gen, not detectable from target.arch ifeq ($(shell uname), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard # ARMv7: Beagle, Udoo, RPi2 etc. else ifeq ($(target.arch), arm) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard # ARMv8 64 bit, not tested yet else ifeq ($(target.arch), aarch64) arch.c.flags = -mcpu=cortex-a53 # Intel 32 bit, build with SSE and SSE2 instructions else ifneq ($(filter i%86, $(target.arch)),) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions else ifeq ($(target.arch), x86_64) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 # if none of the above architectures detected else arch.c.flags = endif #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags = -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) endif #=== flags and paths for Darwin ================================================ # LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when # compiling with g++. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 ifneq ($(filter %g++, $(CXX)),) cxx.flags := -fcheck-new endif ifeq ($(extension), d_fat) arch := i386 x86_64 else arch := $(target.arch) endif ifneq ($(filter -mmacosx-version-min=%, $(cflags)),) version.flag := $(filter -mmacosx-version-min=%, $(cflags)) else version.flag = -mmacosx-version-min=10.6 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard when probing for a path, and use double quotes # when specifying a path in a command argument. # Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard # location for builds with native architecture, 'ProgramFiles(x86)' for i686 # builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces # required because of parentheses in variable name. ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifeq ($(target.arch), i686) programfiles := ${ProgramFiles(x86)} else programfiles := $(PROGRAMFILES) endif pdbinpath := $(programfiles)/Pd/bin pdincludepath := $(programfiles)/Pd/src endif # Store default path to pd.dll in PDBINDIR if the latter is not user-defined. # For include path this is done in the platform-independent paths section below, # but for PDBINDIR it is done here so ld flags can be evaluated as immediate # variables. ifeq ($(system), Windows) ifdef PDDIR PDBINDIR := $(PDDIR)/bin endif PDBINDIR ?= $(pdbinpath) endif # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) cpp.flags := -DMSW -DNT ifeq ($(target.arch), i686) arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse else ifeq ($(target.arch), x86_64) cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse else arch.c.flags = endif extension = dll c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd.dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libgcc -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd.dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd.dll" stripflags = --strip-all endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. Variable 'objectsdir' is supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDINCLUDEDIR ?= $(pdincludepath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifdef PDDIR PDINCLUDEDIR := $(wildcard $(PDDIR)/src) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags += $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .o, $(basename $(classes.sources))) common.objects := $(addsuffix .o, $(basename $(common.sources))) shared.objects := $(addsuffix .o, $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .o, $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # construct class executable names from class names classes.executables := $(addsuffix .$(extension), $(classes)) # Construct shared lib executable name if shared sources are defined. If # extension and shared extension are not identical, use both to facilitate co- # installation for different platforms, like .m_i386.dll and .m_amd64.dll. ifdef shared.sources ifeq ($(extension), $(shared.extension)) shared.lib = lib$(lib.name).$(shared.extension) else shared.lib = lib$(lib.name).$(extension).$(shared.extension) endif else shared.lib := endif ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # print Makefile.pdlibbuilder version before possible termination $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # Terminate if target triplet remained empty, to avoid all sorts of confusing # scenarios and spurious bugs. ifeq ($(target.triplet),) $(error Command "$(CC) -dumpmachine" did not return a target triplet, \ needed for a build. \ Is compiler "$(CC)" installed in your PATH? ($(PATH)). \ Does compiler "$(CC)" support option "-dumpmachine"?) endif # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # store path to pd.dll; if not found, ls will give a useful error ifeq ($(system), Windows) pddll := $(shell ls "$(PDBINDIR)/pd.dll") endif # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .o, $(basename $($2.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o $(shared.lib) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' $(shared.lib): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.o:: %.c $(call make-object-file,c) %.o:: %.cc $(call make-object-file,cxx) %.o:: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .o, $(basename $($v.class.sources))) \ $(addsuffix .o, $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1)) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ #=== strip ===================================================================== # Stripping of installed binaries will only be done when variable 'stripflags' # is defined non-empty. No default definition is provided except for Windows # where the unstripped binaries are large, especially in the case of Mingw-w64. # Note: while stripping all symbols ('-s' or '--strip-all') is possible for # Linux and Windows, in the case of OSX only non-global symbols can be stripped # (option '-x' or '--discard-all'). # Make definition of strip command overridable so it can be defined in an # environment for cross-compilation. STRIP ?= strip # Commands in 'strip-executables' will be executed conditionally in the rule for # target 'install-executables'. strip-executables = cd "$(installpath)" && \ $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';) #=== install =================================================================== # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) $(if $(stripflags), $(strip-executables),) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== platform test ============================================================= # This target can be used to test if the compiler for specified PLATFORM is # correctly defined and available. dumpmachine: @$(CC) -dumpmachine #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: pd-windowing-0.3.0/src/000077500000000000000000000000001434507720200147135ustar00rootroot00000000000000pd-windowing-0.3.0/src/bartlett~.c000066400000000000000000000052001434507720200170730ustar00rootroot00000000000000/* bartlett~ - bartlett windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #include #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFBLOCKSIZE 64 void fillBartlett(float *vec, int n) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = (float)(1 - fabs(x)); } } static t_class *bartlett_class; typedef struct _bartlett { t_object x_obj; int x_blocksize; float *x_table; } t_bartlett; static t_int* bartlett_perform(t_int *w) { t_bartlett *x = (t_bartlett *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillBartlett(x->x_table, x->x_blocksize); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void bartlett_dsp(t_bartlett *x, t_signal **sp) { dsp_add(bartlett_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void* bartlett_new(void) { t_bartlett *x = (t_bartlett *)pd_new(bartlett_class); x->x_blocksize = DEFBLOCKSIZE; x->x_table = malloc(x->x_blocksize * sizeof(float)); fillBartlett(x->x_table, x->x_blocksize); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void bartlett_free(t_bartlett *x) { free(x->x_table); } void bartlett_tilde_setup(void) { bartlett_class = class_new(gensym("bartlett~"), (t_newmethod)bartlett_new, (t_method)bartlett_free, sizeof(t_bartlett), 0, A_DEFFLOAT, 0); class_addmethod(bartlett_class, nullfn, gensym("signal"), 0); class_addmethod(bartlett_class, (t_method)bartlett_dsp, gensym("dsp"), 0); } pd-windowing-0.3.0/src/blackman~.c000066400000000000000000000053511434507720200170310ustar00rootroot00000000000000/* blackman~ - blackman windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #include #ifdef _WIN32 #define M_PI 3.14159265358979323846 #endif #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFBLOCKSIZE 64 void fillBlackman(float *vec, int n) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = (float)(0.42 + (0.5 * cos(M_PI * x)) + (0.08 * cos (2 * M_PI * x))); } } static t_class *blackman_class; typedef struct _blackman { t_object x_obj; int x_blocksize; float *x_table; } t_blackman; static t_int* blackman_perform(t_int *w) { t_blackman *x = (t_blackman *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillBlackman(x->x_table, x->x_blocksize); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void blackman_dsp(t_blackman *x, t_signal **sp) { dsp_add(blackman_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void* blackman_new(void) { t_blackman *x = (t_blackman *)pd_new(blackman_class); x->x_blocksize = DEFBLOCKSIZE; x->x_table = malloc(x->x_blocksize * sizeof(float)); fillBlackman(x->x_table, x->x_blocksize); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void blackman_free(t_blackman *x) { free(x->x_table); } void blackman_tilde_setup(void) { blackman_class = class_new(gensym("blackman~"), (t_newmethod)blackman_new, (t_method)blackman_free, sizeof(t_blackman), 0, A_DEFFLOAT, 0); class_addmethod(blackman_class, nullfn, gensym("signal"), 0); class_addmethod(blackman_class, (t_method)blackman_dsp, gensym("dsp"), 0); } pd-windowing-0.3.0/src/connes~.c000066400000000000000000000051071434507720200165450ustar00rootroot00000000000000/* connes~ - connes windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFBLOCKSIZE 64 void fillConnes(float *vec, int n) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = (float)((1 - (x * x)) * (1 - (x * x))); } } static t_class *connes_class; typedef struct _connes { t_object x_obj; int x_blocksize; float *x_table; } t_connes; static t_int* connes_perform(t_int *w) { t_connes *x = (t_connes *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillConnes(x->x_table, x->x_blocksize); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void connes_dsp(t_connes *x, t_signal **sp) { dsp_add(connes_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void* connes_new(void) { t_connes *x = (t_connes *)pd_new(connes_class); x->x_blocksize = DEFBLOCKSIZE; x->x_table = malloc(x->x_blocksize * sizeof(float)); fillConnes(x->x_table, x->x_blocksize); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void connes_free(t_connes *x) { free(x->x_table); } void connes_tilde_setup(void) { connes_class = class_new(gensym("connes~"), (t_newmethod)connes_new, (t_method)connes_free, sizeof(t_connes), 0, A_DEFFLOAT, 0); class_addmethod(connes_class, nullfn, gensym("signal"), 0); class_addmethod(connes_class, (t_method)connes_dsp, gensym("dsp"), 0); } pd-windowing-0.3.0/src/cosine~.c000066400000000000000000000052041434507720200165360ustar00rootroot00000000000000/* cosine~ - cosine windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #include #ifdef _WIN32 #define M_PI 3.14159265358979323846 #endif #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFBLOCKSIZE 64 void fillCosine(float *vec, int n) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = (float)cos(M_PI * x / 2); } } static t_class *cosine_class; typedef struct _cosine { t_object x_obj; int x_blocksize; float *x_table; } t_cosine; static t_int* cosine_perform(t_int *w) { t_cosine *x = (t_cosine *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillCosine(x->x_table, x->x_blocksize); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void cosine_dsp(t_cosine *x, t_signal **sp) { dsp_add(cosine_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void* cosine_new(void) { t_cosine *x = (t_cosine *)pd_new(cosine_class); x->x_blocksize = DEFBLOCKSIZE; x->x_table = malloc(x->x_blocksize * sizeof(float)); fillCosine(x->x_table, x->x_blocksize); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void cosine_free(t_cosine *x) { free(x->x_table); } void cosine_tilde_setup(void) { cosine_class = class_new(gensym("cosine~"), (t_newmethod)cosine_new, (t_method)cosine_free, sizeof(t_cosine), 0, A_DEFFLOAT, 0); class_addmethod(cosine_class, nullfn, gensym("signal"), 0); class_addmethod(cosine_class, (t_method)cosine_dsp, gensym("dsp"), 0); } pd-windowing-0.3.0/src/gaussian~.c000066400000000000000000000063271434507720200170770ustar00rootroot00000000000000/* gaussian~ - gaussian windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #include #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFDELTA 0.5 #define DEFBLOCKSIZE 64 /* MSW and OSX don't appear to have single-precision ANSI math */ #if defined(_WIN32) || defined(__APPLE__) #define powf pow #endif void fillGaussian(float *vec, int n, float delta) { int i; float xShift = (float)n / 2; float x; if (delta == 0) { delta = 1; } for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = (float)(pow(2, (-1 * (x / delta) * (x / delta)))); } } static t_class *gaussian_class; typedef struct _gaussian { t_object x_obj; int x_blocksize; float *x_table; float x_delta; } t_gaussian; static t_int* gaussian_perform(t_int *w) { t_gaussian *x = (t_gaussian *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillGaussian(x->x_table, x->x_blocksize, x->x_delta); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void gaussian_dsp(t_gaussian *x, t_signal **sp) { dsp_add(gaussian_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void gaussian_float(t_gaussian *x, t_float delta) { if (delta != 0) { x->x_delta = delta; fillGaussian(x->x_table, x->x_blocksize, x->x_delta); } } static void* gaussian_new(float delta) { t_gaussian *x = (t_gaussian *)pd_new(gaussian_class); x->x_blocksize = DEFBLOCKSIZE; if (delta == 0) { x->x_delta = DEFDELTA; } else { x->x_delta = delta; } x->x_table = malloc(x->x_blocksize * sizeof(float)); fillGaussian(x->x_table, x->x_blocksize, x->x_delta); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void gaussian_free(t_gaussian *x) { free(x->x_table); } void gaussian_tilde_setup(void) { gaussian_class = class_new(gensym("gaussian~"), (t_newmethod)gaussian_new, (t_method)gaussian_free, sizeof(t_gaussian), 0, A_DEFFLOAT, 0); class_addmethod(gaussian_class, nullfn, gensym("signal"), 0); class_addmethod(gaussian_class, (t_method)gaussian_dsp, gensym("dsp"), 0); class_addfloat(gaussian_class, (t_method)gaussian_float); } pd-windowing-0.3.0/src/hamming~.c000066400000000000000000000052551434507720200167040ustar00rootroot00000000000000/* hamming~ - hamming windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #include #ifdef _WIN32 #define M_PI 3.14159265358979323846 #endif #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFBLOCKSIZE 64 void fillHamming(float *vec, int n) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = (float)(0.54 + 0.46 * cos(M_PI * x)); } } static t_class *hamming_class; typedef struct _hamming { t_object x_obj; int x_blocksize; float *x_table; } t_hamming; static t_int* hamming_perform(t_int *w) { t_hamming *x = (t_hamming *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillHamming(x->x_table, x->x_blocksize); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void hamming_dsp(t_hamming *x, t_signal **sp) { dsp_add(hamming_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void* hamming_new(void) { t_hamming *x = (t_hamming *)pd_new(hamming_class); x->x_blocksize = DEFBLOCKSIZE; x->x_table = malloc(x->x_blocksize * sizeof(float)); fillHamming(x->x_table, x->x_blocksize); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void hamming_free(t_hamming *x) { free(x->x_table); } void hamming_tilde_setup(void) { hamming_class = class_new(gensym("hamming~"), (t_newmethod)hamming_new, (t_method)hamming_free, sizeof(t_hamming), 0, A_DEFFLOAT, 0); class_addmethod(hamming_class, nullfn, gensym("signal"), 0); class_addmethod(hamming_class, (t_method)hamming_dsp, gensym("dsp"), 0); } pd-windowing-0.3.0/src/hanning~.c000066400000000000000000000052531434507720200167040ustar00rootroot00000000000000/* hanning~ - hanning windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #include #ifdef _WIN32 #define M_PI 3.14159265358979323846 #endif #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFBLOCKSIZE 64 void fillHanning(float *vec, int n) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = (float)(0.5 * (1 + cos(M_PI * x))); } } static t_class *hanning_class; typedef struct _hanning { t_object x_obj; int x_blocksize; float *x_table; } t_hanning; static t_int* hanning_perform(t_int *w) { t_hanning *x = (t_hanning *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillHanning(x->x_table, x->x_blocksize); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void hanning_dsp(t_hanning *x, t_signal **sp) { dsp_add(hanning_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void* hanning_new(void) { t_hanning *x = (t_hanning *)pd_new(hanning_class); x->x_blocksize = DEFBLOCKSIZE; x->x_table = malloc(x->x_blocksize * sizeof(float)); fillHanning(x->x_table, x->x_blocksize); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void hanning_free(t_hanning *x) { free(x->x_table); } void hanning_tilde_setup(void) { hanning_class = class_new(gensym("hanning~"), (t_newmethod)hanning_new, (t_method)hanning_free, sizeof(t_hanning), 0, A_DEFFLOAT, 0); class_addmethod(hanning_class, nullfn, gensym("signal"), 0); class_addmethod(hanning_class, (t_method)hanning_dsp, gensym("dsp"), 0); } pd-windowing-0.3.0/src/kaiser~.c000066400000000000000000000300221434507720200165300ustar00rootroot00000000000000/* kaiser~ - kaiser windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include "mconf.h" #include #include #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFALPHA 10 #define DEFBLOCKSIZE 64 double i0(double x); double i0e(double x); void fillKaiser(float *vec, int n, float alpha) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = (float)(i0(alpha * sqrt(1 - (x * x))) / i0(alpha)); } } static t_class *kaiser_class; typedef struct _kaiser { t_object x_obj; int x_blocksize; float *x_table; float x_alpha; } t_kaiser; static t_int* kaiser_perform(t_int *w) { t_kaiser *x = (t_kaiser *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillKaiser(x->x_table, x->x_blocksize, x->x_alpha); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void kaiser_dsp(t_kaiser *x, t_signal **sp) { dsp_add(kaiser_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void kaiser_float(t_kaiser *x, t_float alpha) { x->x_alpha = alpha; fillKaiser(x->x_table, x->x_blocksize, x->x_alpha); } static void* kaiser_new(float alpha) { t_kaiser *x = (t_kaiser *)pd_new(kaiser_class); x->x_blocksize = DEFBLOCKSIZE; if (alpha == 0) { x->x_alpha = DEFALPHA; } else { x->x_alpha = alpha; } x->x_table = malloc(x->x_blocksize * sizeof(float)); fillKaiser(x->x_table, x->x_blocksize, x->x_alpha); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void kaiser_free(t_kaiser *x) { free(x->x_table); } void kaiser_tilde_setup(void) { kaiser_class = class_new(gensym("kaiser~"), (t_newmethod)kaiser_new, (t_method)kaiser_free, sizeof(t_kaiser), 0, A_DEFFLOAT, 0); class_addmethod(kaiser_class, nullfn, gensym("signal"), 0); class_addmethod(kaiser_class, (t_method)kaiser_dsp, gensym("dsp"), 0); class_addfloat(kaiser_class, (t_method)kaiser_float); } /* originally from i0.c * * Modified Bessel function of order zero * * * * SYNOPSIS: * * double x, y, i0(); * * y = i0( x ); * * * * DESCRIPTION: * * Returns modified Bessel function of order zero of the * argument. * * The function is defined as i0(x) = j0( ix ). * * The range is partitioned into the two intervals [0,8] and * (8, infinity). Chebyshev polynomial expansions are employed * in each interval. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0,30 6000 8.2e-17 1.9e-17 * IEEE 0,30 30000 5.8e-16 1.4e-16 * */ /* i0e.c * * Modified Bessel function of order zero, * exponentially scaled * * * * SYNOPSIS: * * double x, y, i0e(); * * y = i0e( x ); * * * * DESCRIPTION: * * Returns exponentially scaled modified Bessel function * of order zero of the argument. * * The function is defined as i0e(x) = exp(-|x|) j0( ix ). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0,30 30000 5.4e-16 1.2e-16 * See i0(). * */ /* i0.c */ /* Cephes Math Library Release 2.8: June, 2000 Copyright 1984, 1987, 2000 by Stephen L. Moshier */ #include "mconf.h" /* Chebyshev coefficients for exp(-x) I0(x) * in the interval [0,8]. * * lim(x->0){ exp(-x) I0(x) } = 1. */ #ifdef UNK static double A[] = { -4.41534164647933937950E-18, 3.33079451882223809783E-17, -2.43127984654795469359E-16, 1.71539128555513303061E-15, -1.16853328779934516808E-14, 7.67618549860493561688E-14, -4.85644678311192946090E-13, 2.95505266312963983461E-12, -1.72682629144155570723E-11, 9.67580903537323691224E-11, -5.18979560163526290666E-10, 2.65982372468238665035E-9, -1.30002500998624804212E-8, 6.04699502254191894932E-8, -2.67079385394061173391E-7, 1.11738753912010371815E-6, -4.41673835845875056359E-6, 1.64484480707288970893E-5, -5.75419501008210370398E-5, 1.88502885095841655729E-4, -5.76375574538582365885E-4, 1.63947561694133579842E-3, -4.32430999505057594430E-3, 1.05464603945949983183E-2, -2.37374148058994688156E-2, 4.93052842396707084878E-2, -9.49010970480476444210E-2, 1.71620901522208775349E-1, -3.04682672343198398683E-1, 6.76795274409476084995E-1 }; #endif #ifdef DEC static unsigned short A[] = { 0121642,0162671,0004646,0103567, 0022431,0115424,0135755,0026104, 0123214,0023533,0110365,0156635, 0023767,0033304,0117662,0172716, 0124522,0100426,0012277,0157531, 0025254,0155062,0054461,0030465, 0126010,0131143,0013560,0153604, 0026517,0170577,0006336,0114437, 0127227,0162253,0152243,0052734, 0027724,0142766,0061641,0160200, 0130416,0123760,0116564,0125262, 0031066,0144035,0021246,0054641, 0131537,0053664,0060131,0102530, 0032201,0155664,0165153,0020652, 0132617,0061434,0074423,0176145, 0033225,0174444,0136147,0122542, 0133624,0031576,0056453,0020470, 0034211,0175305,0172321,0041314, 0134561,0054462,0147040,0165315, 0035105,0124333,0120203,0162532, 0135427,0013750,0174257,0055221, 0035726,0161654,0050220,0100162, 0136215,0131361,0000325,0041110, 0036454,0145417,0117357,0017352, 0136702,0072367,0104415,0133574, 0037111,0172126,0072505,0014544, 0137302,0055601,0120550,0033523, 0037457,0136543,0136544,0043002, 0137633,0177536,0001276,0066150, 0040055,0041164,0100655,0010521 }; #endif #ifdef IBMPC static unsigned short A[] = { 0xd0ef,0x2134,0x5cb7,0xbc54, 0xa589,0x977d,0x3362,0x3c83, 0xbbb4,0x721e,0x84eb,0xbcb1, 0x5eba,0x93f6,0xe6d8,0x3cde, 0xfbeb,0xc297,0x5022,0xbd0a, 0x2627,0x4b26,0x9b46,0x3d35, 0x1af0,0x62ee,0x164c,0xbd61, 0xd324,0xe19b,0xfe2f,0x3d89, 0x6abc,0x7a94,0xfc95,0xbdb2, 0x3c10,0xcc74,0x98be,0x3dda, 0x9556,0x13ae,0xd4fe,0xbe01, 0xcb34,0xa454,0xd903,0x3e26, 0x30ab,0x8c0b,0xeaf6,0xbe4b, 0x6435,0x9d4d,0x3b76,0x3e70, 0x7f8d,0x8f22,0xec63,0xbe91, 0xf4ac,0x978c,0xbf24,0x3eb2, 0x6427,0xcba5,0x866f,0xbed2, 0x2859,0xbe9a,0x3f58,0x3ef1, 0x1d5a,0x59c4,0x2b26,0xbf0e, 0x7cab,0x7410,0xb51b,0x3f28, 0xeb52,0x1f15,0xe2fd,0xbf42, 0x100e,0x8a12,0xdc75,0x3f5a, 0xa849,0x201a,0xb65e,0xbf71, 0xe3dd,0xf3dd,0x9961,0x3f85, 0xb6f0,0xf121,0x4e9e,0xbf98, 0xa32d,0xcea8,0x3e8a,0x3fa9, 0x06ea,0x342d,0x4b70,0xbfb8, 0x88c0,0x77ac,0xf7ac,0x3fc5, 0xcd8d,0xc057,0x7feb,0xbfd3, 0xa22a,0x9035,0xa84e,0x3fe5, }; #endif #ifdef MIEEE static unsigned short A[] = { 0xbc54,0x5cb7,0x2134,0xd0ef, 0x3c83,0x3362,0x977d,0xa589, 0xbcb1,0x84eb,0x721e,0xbbb4, 0x3cde,0xe6d8,0x93f6,0x5eba, 0xbd0a,0x5022,0xc297,0xfbeb, 0x3d35,0x9b46,0x4b26,0x2627, 0xbd61,0x164c,0x62ee,0x1af0, 0x3d89,0xfe2f,0xe19b,0xd324, 0xbdb2,0xfc95,0x7a94,0x6abc, 0x3dda,0x98be,0xcc74,0x3c10, 0xbe01,0xd4fe,0x13ae,0x9556, 0x3e26,0xd903,0xa454,0xcb34, 0xbe4b,0xeaf6,0x8c0b,0x30ab, 0x3e70,0x3b76,0x9d4d,0x6435, 0xbe91,0xec63,0x8f22,0x7f8d, 0x3eb2,0xbf24,0x978c,0xf4ac, 0xbed2,0x866f,0xcba5,0x6427, 0x3ef1,0x3f58,0xbe9a,0x2859, 0xbf0e,0x2b26,0x59c4,0x1d5a, 0x3f28,0xb51b,0x7410,0x7cab, 0xbf42,0xe2fd,0x1f15,0xeb52, 0x3f5a,0xdc75,0x8a12,0x100e, 0xbf71,0xb65e,0x201a,0xa849, 0x3f85,0x9961,0xf3dd,0xe3dd, 0xbf98,0x4e9e,0xf121,0xb6f0, 0x3fa9,0x3e8a,0xcea8,0xa32d, 0xbfb8,0x4b70,0x342d,0x06ea, 0x3fc5,0xf7ac,0x77ac,0x88c0, 0xbfd3,0x7feb,0xc057,0xcd8d, 0x3fe5,0xa84e,0x9035,0xa22a }; #endif /* Chebyshev coefficients for exp(-x) sqrt(x) I0(x) * in the inverted interval [8,infinity]. * * lim(x->inf){ exp(-x) sqrt(x) I0(x) } = 1/sqrt(2pi). */ #ifdef UNK static double B[] = { -7.23318048787475395456E-18, -4.83050448594418207126E-18, 4.46562142029675999901E-17, 3.46122286769746109310E-17, -2.82762398051658348494E-16, -3.42548561967721913462E-16, 1.77256013305652638360E-15, 3.81168066935262242075E-15, -9.55484669882830764870E-15, -4.15056934728722208663E-14, 1.54008621752140982691E-14, 3.85277838274214270114E-13, 7.18012445138366623367E-13, -1.79417853150680611778E-12, -1.32158118404477131188E-11, -3.14991652796324136454E-11, 1.18891471078464383424E-11, 4.94060238822496958910E-10, 3.39623202570838634515E-9, 2.26666899049817806459E-8, 2.04891858946906374183E-7, 2.89137052083475648297E-6, 6.88975834691682398426E-5, 3.36911647825569408990E-3, 8.04490411014108831608E-1 }; #endif #ifdef DEC static unsigned short B[] = { 0122005,0066672,0123124,0054311, 0121662,0033323,0030214,0104602, 0022515,0170300,0113314,0020413, 0022437,0117350,0035402,0007146, 0123243,0000135,0057220,0177435, 0123305,0073476,0144106,0170702, 0023777,0071755,0017527,0154373, 0024211,0052214,0102247,0033270, 0124454,0017763,0171453,0012322, 0125072,0166316,0075505,0154616, 0024612,0133770,0065376,0025045, 0025730,0162143,0056036,0001632, 0026112,0015077,0150464,0063542, 0126374,0101030,0014274,0065457, 0127150,0077271,0125763,0157617, 0127412,0104350,0040713,0120445, 0027121,0023765,0057500,0001165, 0030407,0147146,0003643,0075644, 0031151,0061445,0044422,0156065, 0031702,0132224,0003266,0125551, 0032534,0000076,0147153,0005555, 0033502,0004536,0004016,0026055, 0034620,0076433,0142314,0171215, 0036134,0146145,0013454,0101104, 0040115,0171425,0062500,0047133 }; #endif #ifdef IBMPC static unsigned short B[] = { 0x8b19,0x54ca,0xadb7,0xbc60, 0x9130,0x6611,0x46da,0xbc56, 0x8421,0x12d9,0xbe18,0x3c89, 0x41cd,0x0760,0xf3dd,0x3c83, 0x1fe4,0xabd2,0x600b,0xbcb4, 0xde38,0xd908,0xaee7,0xbcb8, 0xfb1f,0xa3ea,0xee7d,0x3cdf, 0xe6d7,0x9094,0x2a91,0x3cf1, 0x629a,0x7e65,0x83fe,0xbd05, 0xbb32,0xcf68,0x5d99,0xbd27, 0xc545,0x0d5f,0x56ff,0x3d11, 0xc073,0x6b83,0x1c8c,0x3d5b, 0x8cec,0xfa26,0x4347,0x3d69, 0x8d66,0x0317,0x9043,0xbd7f, 0x7bf2,0x357e,0x0fd7,0xbdad, 0x7425,0x0839,0x511d,0xbdc1, 0x004f,0xabe8,0x24fe,0x3daa, 0x6f75,0xc0f4,0xf9cc,0x3e00, 0x5b87,0xa922,0x2c64,0x3e2d, 0xd56d,0x80d6,0x5692,0x3e58, 0x616e,0xd9cd,0x8007,0x3e8b, 0xc586,0xc101,0x412b,0x3ec8, 0x9e52,0x7899,0x0fa3,0x3f12, 0x9049,0xa2e5,0x998c,0x3f6b, 0x09cb,0xaca8,0xbe62,0x3fe9 }; #endif #ifdef MIEEE static unsigned short B[] = { 0xbc60,0xadb7,0x54ca,0x8b19, 0xbc56,0x46da,0x6611,0x9130, 0x3c89,0xbe18,0x12d9,0x8421, 0x3c83,0xf3dd,0x0760,0x41cd, 0xbcb4,0x600b,0xabd2,0x1fe4, 0xbcb8,0xaee7,0xd908,0xde38, 0x3cdf,0xee7d,0xa3ea,0xfb1f, 0x3cf1,0x2a91,0x9094,0xe6d7, 0xbd05,0x83fe,0x7e65,0x629a, 0xbd27,0x5d99,0xcf68,0xbb32, 0x3d11,0x56ff,0x0d5f,0xc545, 0x3d5b,0x1c8c,0x6b83,0xc073, 0x3d69,0x4347,0xfa26,0x8cec, 0xbd7f,0x9043,0x0317,0x8d66, 0xbdad,0x0fd7,0x357e,0x7bf2, 0xbdc1,0x511d,0x0839,0x7425, 0x3daa,0x24fe,0xabe8,0x004f, 0x3e00,0xf9cc,0xc0f4,0x6f75, 0x3e2d,0x2c64,0xa922,0x5b87, 0x3e58,0x5692,0x80d6,0xd56d, 0x3e8b,0x8007,0xd9cd,0x616e, 0x3ec8,0x412b,0xc101,0xc586, 0x3f12,0x0fa3,0x7899,0x9e52, 0x3f6b,0x998c,0xa2e5,0x9049, 0x3fe9,0xbe62,0xaca8,0x09cb }; #endif double chbevl(double x, double array[], int n) { double b0, b1, b2, *p; int i; p = array; b0 = *p++; b1 = 0.0; i = n - 1; do { b2 = b1; b1 = b0; b0 = x * b1 - b2 + *p++; } while( --i ); return( 0.5*(b0-b2) ); } double i0(double x) { double y; if( x < 0 ) x = -x; if( x <= 8.0 ) { y = (x/2.0) - 2.0; return( exp(x) * chbevl( y, A, 30 ) ); } return( exp(x) * chbevl( 32.0/x - 2.0, B, 25 ) / sqrt(x) ); } double i0e(double x) { double y; if( x < 0 ) x = -x; if( x <= 8.0 ) { y = (x/2.0) - 2.0; return( chbevl( y, A, 30 ) ); } return( chbevl( 32.0/x - 2.0, B, 25 ) / sqrt(x) ); } pd-windowing-0.3.0/src/lanczos~.c000066400000000000000000000053511434507720200167320ustar00rootroot00000000000000/* lanczos~ - lanczos windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #include #ifdef _WIN32 #define M_PI 3.14159265358979323846 #endif #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFBLOCKSIZE 64 void fillLanczos(float *vec, int n) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; if (x == 0) { vec[i] = 1; } else { vec[i] = (float)(sin(M_PI * x) / (M_PI * x)); } } } static t_class *lanczos_class; typedef struct _lanczos { t_object x_obj; int x_blocksize; float *x_table; } t_lanczos; static t_int* lanczos_perform(t_int *w) { t_lanczos *x = (t_lanczos *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillLanczos(x->x_table, x->x_blocksize); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void lanczos_dsp(t_lanczos *x, t_signal **sp) { dsp_add(lanczos_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void* lanczos_new(void) { t_lanczos *x = (t_lanczos *)pd_new(lanczos_class); x->x_blocksize = DEFBLOCKSIZE; x->x_table = malloc(x->x_blocksize * sizeof(float)); fillLanczos(x->x_table, x->x_blocksize); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void lanczos_free(t_lanczos *x) { free(x->x_table); } void lanczos_tilde_setup(void) { lanczos_class = class_new(gensym("lanczos~"), (t_newmethod)lanczos_new, (t_method)lanczos_free, sizeof(t_lanczos), 0, A_DEFFLOAT, 0); class_addmethod(lanczos_class, nullfn, gensym("signal"), 0); class_addmethod(lanczos_class, (t_method)lanczos_dsp, gensym("dsp"), 0); } pd-windowing-0.3.0/src/mconf.h000066400000000000000000000125431434507720200161730ustar00rootroot00000000000000/* mconf.h * * Common include file for math routines * * * * SYNOPSIS: * * #include "mconf.h" * * * * DESCRIPTION: * * This file contains definitions for error codes that are * passed to the common error handling routine mtherr() * (which see). * * The file also includes a conditional assembly definition * for the type of computer arithmetic (IEEE, DEC, Motorola * IEEE, or UNKnown). * * For Digital Equipment PDP-11 and VAX computers, certain * IBM systems, and others that use numbers with a 56-bit * significand, the symbol DEC should be defined. In this * mode, most floating point constants are given as arrays * of octal integers to eliminate decimal to binary conversion * errors that might be introduced by the compiler. * * For little-endian computers, such as IBM PC, that follow the * IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE * Std 754-1985), the symbol IBMPC should be defined. These * numbers have 53-bit significands. In this mode, constants * are provided as arrays of hexadecimal 16 bit integers. * * Big-endian IEEE format is denoted MIEEE. On some RISC * systems such as Sun SPARC, double precision constants * must be stored on 8-byte address boundaries. Since integer * arrays may be aligned differently, the MIEEE configuration * may fail on such machines. * * To accommodate other types of computer arithmetic, all * constants are also provided in a normal decimal radix * which one can hope are correctly converted to a suitable * format by the available C language compiler. To invoke * this mode, define the symbol UNK. * * An important difference among these modes is a predefined * set of machine arithmetic constants for each. The numbers * MACHEP (the machine roundoff error), MAXNUM (largest number * represented), and several other parameters are preset by * the configuration symbol. Check the file const.c to * ensure that these values are correct for your computer. * * Configurations NANS, INFINITIES, MINUSZERO, and DENORMAL * may fail on many systems. Verify that they are supposed * to work on your computer. */ /* Cephes Math Library Release 2.3: June, 1995 Copyright 1984, 1987, 1989, 1995 by Stephen L. Moshier */ /* Define if the `long double' type works. */ #define HAVE_LONG_DOUBLE 1 /* Define as the return type of signal handlers (int or void). */ #define RETSIGTYPE void /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef WORDS_BIGENDIAN */ /* Define if floating point words are bigendian. */ /* #undef FLOAT_WORDS_BIGENDIAN */ /* The number of bytes in a int. */ #define SIZEOF_INT 4 /* Define if you have the header file. */ #define HAVE_STRING_H 1 /* Name of package */ #define PACKAGE "cephes" /* Version number of package */ #define VERSION "2.7" /* Constant definitions for math error conditions */ #ifndef _WIN32 #define DOMAIN 1 /* argument domain error */ #define SING 2 /* argument singularity */ #define OVERFLOW 3 /* overflow range error */ #define UNDERFLOW 4 /* underflow range error */ #define TLOSS 5 /* total loss of precision */ #define PLOSS 6 /* partial loss of precision */ #endif #define EDOM 33 #define ERANGE 34 /* Complex numeral. */ #if 0 typedef struct { double r; double i; } cmplx; #ifdef HAVE_LONG_DOUBLE /* Long double complex numeral. */ typedef struct { long double r; long double i; } cmplxl; #endif #endif /* Type of computer arithmetic */ /* PDP-11, Pro350, VAX: */ /* #define DEC 1 */ /* Intel IEEE, low order words come first: */ /* #define IBMPC 1 */ /* Motorola IEEE, high order words come first * (Sun 680x0 workstation): */ /* #define MIEEE 1 */ /* UNKnown arithmetic, invokes coefficients given in * normal decimal format. Beware of range boundary * problems (MACHEP, MAXLOG, etc. in const.c) and * roundoff problems in pow.c: * (Sun SPARCstation) */ #define UNK 1 /* If you define UNK, then be sure to set BIGENDIAN properly. */ #ifdef FLOAT_WORDS_BIGENDIAN #define BIGENDIAN 1 #else #define BIGENDIAN 0 #endif /* Define this `volatile' if your compiler thinks * that floating point arithmetic obeys the associative * and distributive laws. It will defeat some optimizations * (but probably not enough of them). * * #define VOLATILE volatile */ #define VOLATILE /* For 12-byte long doubles on an i386, pad a 16-bit short 0 * to the end of real constants initialized by integer arrays. * * #define XPD 0, * * Otherwise, the type is 10 bytes long and XPD should be * defined blank (e.g., Microsoft C). * * #define XPD */ #define XPD 0, /* Define to support tiny denormal numbers, else undefine. */ #define DENORMAL 1 /* Define to ask for infinity support, else undefine. */ #define INFINITIES 1 /* Define to ask for support of numbers that are Not-a-Number, else undefine. This may automatically define INFINITIES in some files. */ #define NANS 1 /* Define to distinguish between -0.0 and +0.0. */ #define MINUSZERO 1 /* Define 1 for ANSI C atan2() function See atan.c and clog.c. */ #define ANSIC 1 /* Get ANSI function prototypes, if you want them. */ #if 1 /* #ifdef __STDC__ */ #define ANSIPROT 1 int mtherr ( char *, int ); #else int mtherr(); #endif /* Variable for error reporting. See mtherr.c. */ extern int merror; pd-windowing-0.3.0/src/welch~.c000066400000000000000000000050161434507720200163610ustar00rootroot00000000000000/* welch~ - welch windowing function for Pure Data ** ** Copyright (C) 2002 Joseph A. Sarlo ** ** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** jsarlo@mambo.peabody.jhu.edu */ #include "m_pd.h" #include #ifdef _MSC_VER #pragma warning( disable : 4244 ) #pragma warning( disable : 4305 ) #endif #define DEFBLOCKSIZE 64 void fillWelch(float *vec, int n) { int i; float xShift = (float)n / 2; float x; for (i = 0; i < n; i++) { x = (i - xShift) / xShift; vec[i] = 1 - (x * x); } } static t_class *welch_class; typedef struct _welch { t_object x_obj; int x_blocksize; float *x_table; } t_welch; static t_int* welch_perform(t_int *w) { t_welch *x = (t_welch *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int i; if (x->x_blocksize != n) { if (x->x_blocksize < n) { x->x_table = realloc(x->x_table, n * sizeof(float)); } x->x_blocksize = n; fillWelch(x->x_table, x->x_blocksize); } for (i = 0; i < n; i++) { *out++ = *(in++) * x->x_table[i]; } return (w + 5); } static void welch_dsp(t_welch *x, t_signal **sp) { dsp_add(welch_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } static void* welch_new(void) { t_welch *x = (t_welch *)pd_new(welch_class); x->x_blocksize = DEFBLOCKSIZE; x->x_table = malloc(x->x_blocksize * sizeof(float)); fillWelch(x->x_table, x->x_blocksize); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void welch_free(t_welch *x) { free(x->x_table); } void welch_tilde_setup(void) { welch_class = class_new(gensym("welch~"), (t_newmethod)welch_new, (t_method)welch_free, sizeof(t_welch), 0, A_DEFFLOAT, 0); class_addmethod(welch_class, nullfn, gensym("signal"), 0); class_addmethod(welch_class, (t_method)welch_dsp, gensym("dsp"), 0); } pd-windowing-0.3.0/windowing-help.png000066400000000000000000001663711434507720200176030ustar00rootroot00000000000000PNG  IHDR[F>TbKGD pHYs  tIMEͼd IDATxyX9져+((jfh{W_۬rɂefiZk澂↢r8g~AET뺼.a晙}<3n >uDDDDDDr-;`:""wY@LwDDDDDDTlɽТre[""""""*DDDDDD ye=+Ӣ眴/D}<.-{^n#V~)5=̂cֻ`ϰoq %4tGREDDDDDe\So8o&}=U\Y{sʽ˼6 wܫ=Y%08J,'X"bSEDDDDD{kGy #Zw̚ W-KXa3ߓ]¬(2ۙoy&q^>++ lғnZxu1F"?͚ѽu7A.|~> W0_x!E4](RvMJQn+nܪLE hā}=}0Q0נh6s*W4<8{9\=Պq hCv18ߑ̘ѺYq̥Z3ZQ3.[7y~YpR4 [ MO7 ._ާħRt{Yw]Zp(9P|:wnRpZQ%=%7٫n N ײ)%/PO !c&LM&̎p0ok͝ F)hD&ށ[MǙ˨e ~̘mb"""""S7qgrg,\Eé_N1nꜽYp hJsӅ+me:7nqWL8 ֳv"i+&9Z]ʊw˵p಍#^{,6.* ە(m2SVq;'D:m(6޳V(RP],i'dLּOWlG)c)1'ؑq]`77z'{?.`9/vVaoSB[""""""*DDDDDDTlHa Nbg _"o ͍!մ:ϱ5ζ3~a;+:ebKDDX)R84og/t )Lr>pdPҳ=omѰ|9:qR9ED$'V/ tC f|1WIgs_ˑ,mM> J1ȈW<%j `s}R10LMݕH"ue=BX6G`凝(k{ɾd ܨ5h&?̉7CxFhqvNUe9¢WS}Hgv3ڴŻ&S?2/=͏GOs;˂iW/bKJ1a eF6t\025{zY|%ΎXE\*Mg>yU8@Ԛ?fF8nX :Xƪib Sw&mO6Z3˜j3%Ӓ,_Jȭ|66.\Gb3^*o^̶Cqh3`X/mg`藞얬B6a$o3\t{塊iKgN.l|gP{;AI"Fm#dW;^ >%"y_}HSUl`2qGf3es[_7a}뙯 _j9fz8yU`3zzMbgٸa$I,,7V ֌MY-V rx+%Vg{v_g.ӊbXٵHDNY#Kֲ). ѥf|Hir^}k fٰ,ٓvmtibزkOKxeQCM-JݗRџ"'/9~g3/-BȵXm=[~B,Sgřꏯ/5de80hΛ ſB% 0haY㖿vsˇ]#N3kqIӪs9MR9|6,;JM-`]d$z]"?;}M1]p}H+HB;cƦ7RxGA?y<]m(i:s|DDD-{\] %U"y+䅱t)>*Dp0;t$YJDTd$>X%*DDDMuK H7#Tl*&XW'T% Quwc⃊-Ƀƃb(1bKDP0Qr"Rؐw{DDP&W9;xDDVVQrJD@AŖ+%U"=ivAAŖ -\"w%4XŖ -\"w!>(FQKDqć!*DDD`QbKDDD V.\J0Z7bKDDDV!Rbc@TpQuG)%TRc .["""`RB%*DDDr9LD ["""`)RB%bKy0QJ8 *DDrCY`*Q["""JP((>d!AzD1fr עxzz;V._qp^%|; ~&L/#.s Q}\KgYHAve""JD (C>.^>‘uC94~$Kf?+cʆK7\r@FLzr5]q)tVbK>\Q%JDq@Wo1[<>ʷoQ%xujWN|:3iږle6^-)y͞ToقZ\wwrtF+BcHjir\4 b`UjaNKlڅj>U[h$}ZgjT JBn56&о][%圱S|70 ~%3X :Xƪib Sw&fagK귇/~ǒWFՂ"WsʹI{%7/X:qAf=_H^hWG9(tA`*QŇUlsY:!7EB8*3gΰ&6?O0lk3&ЭȉWڜYqB|K8(f +Y#VvL=ʖ,Kri;K3Nc*T)ڃVe͘J4q\*Ңjo{Kv(?fq 8Ć]ׅj?mOcco>Q~ϱD\8ĹK[.wA)^Kخ&m:\G 蘋 -\*ҕKW0S9vލ\߁r(FE"8HO;Ɏ<,r݈s)dˍ!oE3z%-m|)a [c;ooa`XdX.ǰEХkURugrɭ V.zqUΦv,޼FqpT;7$ ]p|/:֢BKTpb˭FҘT,KD}}<{:vn/Y˻/oŏ^~6.Y K->  VܪgWb;;Һ;X>j"UF1)8}{RcdO"KYѕuGÝgV<7{WmvΕ _\r%蟆PϏ#{}?nivֿ(_++P" 4M cgɲ-lzV-zfCq(K%ۑϒ=GҾ<ㅿwhPz{N &eCPm& D>u5#VRՠW¿ˮ=îAwg}WǕعmB뱿˾hؚ1=cь94֢~y]xzBʍFk{R-=sǏyj#*_&‡ۮ֑z~eC\ƕ(Vu{|VtAd .Q ۈIn <=jcNF2e /on0.X øxmBEϧMFӎ|h4ܴQd9јia9ѧy^E'*F0cvm5=aTk5؟bFA6UG>aelwߤ}Fu; ~)V\h >+|pcDLf3TpsF36I;te=|KE=UXDtK_𛿔~7^^@A/)s]ֈ)uGPa(w-:tdS7\ 7G<|O[(pŇLu@ə -.Neѷ-%i!dX}ƿ^AmcDDzW0ы3D_n'#bKDDh)'_tnUl%Srw9U%""BKLbd[""$KLb(F%YdJD1BŖ,%S"'vHM^bG:(%R/!NXqWar\-\s}df)|xj-Q%_DfQuCl֙R2 ⻁4hH)Iq9VOY?5LkFw8-{I-UtQQ%*}8QPcE[1}VK/Zʩ)rՏ um5$T*`#~t Dź]xi&9".) -Q%Ydec܊)^nRUx߳L\JCN.XCbn&\ IDAT3VTNx3~e{{ zy86 @D}TD13ϫƿv(H"w- _о lNՕRWp=~ĞE +QQ%Rѕ|ŋ]lY>j"UF1)8ik&mElM?Ǥgɝ>*BKy$y{"rյA1+ڂB_V bҿ׻8}iهKt4ݻУ?B.9'3%{q.%Aҟ]|`qRQQ%yR?&r/bF~퇦pcCJr#t [ʨ?Ц+}@}TT( c|}}7tDDD.ٺUi'O&1M_ТDВ;*ƻȭČ?m v>*x)\*DJ/QKDDxI^)8ױ^t~x'!W>LGEnnhlȽJ硎ؑٿ{1ES!&RXǃ0\qPx17wJQSq!y-nO~)po/=%""!y:QRJŖ,% .WQ%""R*R?[""g+%R "bKDDT`~/"*DDDŕ("bKDDr5ƅ .:""""""*DDDDDDTl[""""""*DDDDDDTl-[""""""*DDDDDDDŖ-17Vb2}aSUɗŖU(QjHܩk~'e,"aXR8q |2N">9c&c1]mUb.4o{[ ߔ/ћNɷ;gՏI\}TDDD.[bi_;qBg:ЬųيOSB9K9HD;בҝbfܫuC%gDX*kT1Ԏc\nv!q7q܁WF[׳}tj=Ҿ"UhP '`$o4 & #&>v.r*ƛ+S׋OñInDuӫ˕wq܋%\"VGEDDDgkQ 3<:~=Gq.5;dT|&L&Nςrw_ n;#Sև0vW Szͦ$nxg~n P0ӛ=Ɍ׎ޕD7&܍I޸0͘&Lf3&#͆aw=6Bm(6{ӻ>Ճ=nq-&iN]kIMJk|}8+,vmElM?dNѲp2nv5a9{©̮>>*"""r%hrX3_{Sع.;`|_Zl!lRfcyݣl+e9cH0ggo9x[%wR{4ݻУ?B.I[Ƞ%unmkE߻J{Kg_G`>*"""%Sxx1|[ɄapXIN6puu7aKgE󙏲zawʘ[Цha9ꣅ4h|(&qwg+K;7}:0q '"gY\DDDDD$4B)W_""""/&"ygV]̄Uw $QMlQ%"""""bKDDDDDDTlQ%""""""*DDDDDDTl[""""""*DDDDDDTl-[""""""*DDDDDDDŖ-[""""""bKDDDDDns̍Ll-ab?GGEDDDed`*LH- *-|QlYٗ|Ehؚ|4e7o{rk3vIl,!AzD1fSVovTWԿGGEDDD Pˢ?gJA:L)7ΏN:v&q~9cˀG8n(Əd{?UhtW WoQQQl]\,aYxhBi5IkS92u\̸n jR7GH :SbUT&$oS4  ]QKZhS?r αb|(ezމukъT ,>*"""*rXpVaL_ͿH&pHhIw @8LCKhHܒ1}VKr_wsx=cOO?+$Xk),;m#yd-ǗQGـqo-vy<ފfJɄ) 1'.cOʔt$xflx$bO}ԸcN\y-̲ӶlOVewfanY|ʮi _؀yQGQCN>} 3v#{}0U;\DPeľO<(VXp8ξmXG :lzKEZT~21r)Ep ~bZ̈ i܉H!EOSB9K9HD;בҝbfܫuC%g S1ތ_^}jMpǖ|!D nqK`,\-a.Rep"~Y]nw4.XCbn3V HPauӫ˕wq܋%\bzrѼT{F1eT5E9LiYVՌXNغ ^♟1k6j;c5W p#{s+~OKU[h;O)ŖOKϕKky x]½I_,ٝn1(xlՃQoq>N(҉2Y|$}եkg 4Ȯ5Ĥ@ZFVƕ> +̥T\kt,I/Oԧ{-ܛǶqĝ-<]v1QnK<6.bk9L$PU-r+E{gLήj]jw$|{gCh.M//qv*`WiZLڡ mG̡DHѷv단rIӪsE_:\Ki/ܹ{F!~o:AԐJybTu8s(P|}}X$;.ۿZ{,-h?`!%)؜N1kă:?]p(q?SߩP_|E0i:Kny[;-Bh=wٗ [3fʥh"oGeJn8M׫ļ*E{=g'9,RNGt 3~9xUD2bBnM/%G'dwJ UAfL%H8VOH?>"Pxxq0Haa-0{f$%Y 0 멯1~K(U}T} o_0:T+j8mt~yq,0.,(zqcSƒJ_5lFƺD0DcӁFFaFK,'eM74mxU6-0-4f| $e p7Jc}#fbyqOM'0.{Ѹbg֓-k66'a651&KUGBsj c-;k\^7ȨqbFZxb%0 #q^FYư5Wpn֧|Ά?u6-7'?5Zgdnd#nnKBƥvo_5ϘtSL1Ʀ+ϒbBxxr͗j](0NMTUmޥܫoZTY}T}4?ʭg|F1JuYG ;he"zn2B9xUD2onM//D [}, ->UiϾXgv~wuU[f}u^%q!y>Sξ/O,:#T*!!V]hpM cCzR5'&5?8rT>gbҟkwr6 9bD+MH+ߦ}~q͜i^rgY`>ꅃL}[:_xp짗;0hΛfJ5>ɀD>=x3g?ݪpڙ>~/O L[F4>Z_I8q_"""rΖG$/yI 5E<""""G-;4C${wB-%U"Jߒ1fM[""J6?sTJ4s3~+^ *DDDrd$wng="n ["""Jn!R%"Vb-hݩ$Jɓ[)3Tlк$JɓH*Reʫm["""yR%"KE-ZwR$r:TtQu'3 3yY@DDڤ+/$)WC%BV↊-c⇊-;tiDThƂK#_[bD7>AC͜KQD'WXbfH_-Jxzͭ!>p?E[r֞KՄkQO<==g W`/ `ظ#_^vTW9δth.Q[."RВ]`Y*?t<[}~/VȺ?goԹ1}up\X7:a,9{Ai3]wSX)~9@BBw l3"7Y+rd\)6/59icZ3ltSED BU/%K"7.tq1Dq$[I#~%`I00cΧ1Lݙ ^tSSe.5G0FK^'f2v0ZPdJbR UvR%ǹ,őYlsY:!s ^g8{?C)W Gfz-Y:#6?d9ˡ E-EB8*3gΰ&6?O0lk3&ЭȉW h0C:8B\Z=hU֌DcW"-FFgh"8Sf~gP{;AIlunhPm< zlG#jr9@ 8wY.QDID\qD\TcI &|*λQ YT蟆PϏ#{}ɀ-~/>.ߟdz]7Bg~KZL~SLθ;l1r}#e?IO6綎GE2 _о lNʌn?a`XdXU;mcw΃pҵqRu78""J(h+ȝ+jt,I/Oԧ{-Maǣ'#jgNpQ6OmD>˄ \a ڗF<ۏ=vn/Y˻/Y4.0X,@Z|4/Xq}_2Ί,K`'V=8d.gɞDlh+M㖇,ƍ3}Q=q֫q|;ʅr]9lgH~J"*DW(L%g;5OH&Mc̓ʱd=ILXS2M)7hPz{^xZͿ{ڞԃYn{M><+9oR&< fk/p @䳉<_Z990aU!_ jH%ϼNX1pa׈ |JZ\e_Z4l͘u^aь94֢~y]xzBʍFkvr;_D$'WZpcbg'>kL\_\v:ƌMoRN]Ja7)n\ODɆ]B}T?~PDDD9(i\~%a*-XGjA% |:::/2U1(~c_ْ{KODqUiQ/%|p$,1ezo4݄)%v9_[?,_3/ŊXF<=/̠CwzDDt IDAT$["\it}ށN5{OSv"Eּ2;n1hJmc9:L@\B'~̆glcZ3lt[Q"DLI-:*Dl ^ZR*3^=޲ʹLha70.fdLڕq>ڼ5/&ĨNbk&S 3\T|X9s5gQ$I E9(Ŗد덷O`5kI%o?+|RNY \^9a$a㎜릒ٟ/lGp.z;Lr.5߷Ѭ'9M;\j`V=~;2OdLm>4upO7睎6N1+wRZPdJbRrZ$I4]GŖq~9cˀG8n(Ədi6SRf KϨfK; rn\_T2;Srڞar\-2+'rf}C[6VBԶ'豱7|<FJes ps7YT[0Q$rb].-fKGx~[vWݟw(C9d.0RIr*oQG%xujWN|:3iږJojr\4 b`UjaNKlڅj>U[h$}ZgjT J6JdgXc#iR۵%Q]ž[+`=wC iАSvy')i)frw4;?:%jD$M TQ+hUilӪ-?3Q(hVRUQآ $99 '~>xT&Ϲs];nKg jl«[nԳJݨpG/9|[6֟Penps4_%ǻyGD0Qq)$:I!-c\Xa~K*׈?fs}pE^H9kcɔ6r⋼0)]o`>''snFbfiWɎ5ߍ$ǂDNߘa2O;Q)Jv-0_2l%=6Ƭ}`AՁ9j8oI^u7goZz\`ɻkPvs*[<sՍZDKIFrxQ~r/k}t㈔I EAK>pB [YSSZ-k}!C{ىdO.'Cs0*]xwg>LJvpy/Z07Cԭd՘ a܆''y*8б^ Sfjbt#Jv-p#8yxm' n1;N'9)LbuZT z}NxrErvx^;2 Kvό^~[y+i}4^kAX-ߟGn=4w*㈔_򢶓J昢; ИR\þKĥc_秚?-{FI'q=L5QZv%Y1.Y*ҷ.>63ˑWR"-X/l}R,I& LMZ4rJv[׳@ {Y݅vM;lI-fr=bFXU-Œsǩ4bz멂" ZE39).}[[cV^z!k>isU59~[\[?GBԬml?{j~]aE+~/1:?7+ /E0gV>oտ=۾}+ٽlr1Ͻ?`b20c]&ġӱU^jA!wڒv[$?\h8.G9xbƸꢈq2&j[ч(U;<< +'o9'bd{A:_C^5 eC@cVV[[KoZXceafi+-b&"h)]ʡl~Vj|z1v UDpZԷEcJH\d.-bZ֢% \ ["""ib$~-WDDD2HԯE–hB&h\QфL#k)–hB&h\y #*e{WM4N(A*HuvQ_KSJ;u&р/"EIx.Q)"iBVr'G" ZRcJiW 5l%-Npl97#j74FEd,(phLAaUp)]Fg'Ѹ VT"%a2 (hSJRa+CiGݺuh1[ZVLPVOj[V0^ս>.w,΢" :u$ E5*R|'bХ-=(l:y&3i{,114{-Li&lyKgǭH<XI |}l]{ ~k)ɘVJH\eogׁ׃[>tÔX8nF.Fm&M?ZQNOz:霉dRd W <2dm+Qܠ%Iߢ1–Cm>7;>=ڽk=  ue\1m] dbPEmըhr$Š_oKa)%y\)ذeI"6g7e"mҢ9mk&*5d%5;ťR(hwVߖSJPGK?O0֌L1!20lNDq(i0wz2w ۍg~RǓP)"ab)~~#;AR*}\DJҘR֡0;HI b"%.ti_8%ET"gDcHIK۪MDqq8% [""pe%RBwq/W)J-)I%մ•HA/-@IVN"e_8%"IH _"R"""""" ["""""" ["""""" [""""""%"""""%"""""%"""""" ["""""" ["""""" [""""""%"""""%"""""%"""""" [""""""EΡ b2\aPDDDDJdt*KD5)aKUQAl; FP~mޖy2 umqM ނB[, kcJJ퉈RUT""""Rt *ڸIq/p*r-94-YJ]H)[y9+/534N=}"|ELmw4ٔ~OwG oj6Ϸ)5km> ۯkh|Gۑ_`HaPQnZ V """uoգ[Fک=>ʵ?{of"gu-?fd&dJ6lm#gY+Q3U3>9M܊qtX0{ݴg%bV$y `D\Ĩ׿G"Mta,f}/>ˑ-Ȳ097f#Go۴dw=h['g_ Gj=o;p,6|PknoI?~Ӵ/˘>Ole+bڨ\tk2jGܱpތ)1d&m%&&w՜(l;M:8[ Jm]طoF<^ɫA5+p꒙}[I O w;\N\zйmxq" u36hnG:='.mr~ܿnG>iIV憭>@ǭX}zڽ*s5'"""eY>еAW*oG߁ pK|ń{}3qiMiD&Z^Ɨӥknp۾ݗ~Ǻ-Zf|>~:VOze?7ѺC]{7rȑۼ,)0<bœVo]|m~*ڦpVO\>`I"6g7e"mҢ9{?X@:Ai͇?!;20c]&ġӱU^ۚb8.'0<1/.얹'E"F&xqFs*unoտnAL& (a!5k<q~JtXZ3Х纪FuWE?t"Rcw|='Spčvo/% Ǘrq5FEDDD)lx}<ը';5H+< Kqu+R܃HU V QHa=["""""" ["""""" ["""""" [""""""%"""""%"""""%"""""" ["""""" ["""""" [""""""%"""""%"""""%"""""" ["""""" ["""""" [""""""%"""""%"""""R8AL&S0~U94I*[JcPQDDDDmdUDDDDDn=[""""""%"lrbS n:S Ln;q :Wb8-jy%qE6pm̴C~y==UjjTDDDDsJg9V)T>}'Od_*3yqqoIcYs.[՜&bJ&" jT5 """RVфcэ "(]0 5iSǿM Y[NF͸$ZR;;>~ԭ[þы~ fN;S܏WpXϳaR0{S$6^y2D^̐k'rkѫUI20<gn=%c~6nKz4 gqCѷq/_ԦxwLMt'zΫ6o=Kk42.kV_{z݀ӷl>/5{nO-ܻq"܍;?Q> HOdى{4cGWƼ=h~މJv`>!C?Ɯq gK/ [Cș|Jj F}Ռc;%g+I?~Ӵ/˘>WmɄ)N]=}PqbU;b/\#lyzj7>gRr4/OQJ5*Sų8%r[{Tl՘ a܆''yjr3lO)=*hI˻`/?$m/e=JavRy(l݅myu]{n_Vzc'ÝYOǡ6V`훝pz`̷[lڹ;w7kzcNƄ #& pA쀫?ԁL OZ3WF2q0т59q>51W%г5j6-9mr|a}5{%_^vvvٙ0aȰr%ޞ>Y[캵Q+FlO)*B\>F)<ߧl_ہ4r3'mm)mnHEJjزseN'X \l sz1J?S^vn$bLw~qS&&-i&*ڦpVjuv$zr &(f #q;j`ńC::qR:. /Y9~ jN7\cϩDOÎny/\HbۭB }ko1Iގy)]nld{뺔WڬQUnhza_Nz|yO(&Ugv3x)=OD")_wgxomnpE C\#vOo?:%6nQ;UxG_k"V7/X:iƚ12i6?c0L9aS.5-r+.'0S<;avslZ,4 gI-^Ox`_Qf <>cݱs=_z󞪋ono޶я៽ǾeGFvJDH+^K>}(R!RFmFm"&H̩g>>*ϵ='Uv@c\؉a~g|듪򹯒^go3yc1 uA# oֺq`+^~ 7;~%QW^iߟ}.< IDATTu,WOw,y.}?7?>^-s{9^~\N簴p$z<f328)jg8>>Ӝw~-?1Db:JIn/( c>2qʰe[IުQ\iq߼a_p5ƉtøPƩ]Ʈ3Ǫ_3t~ѭV?c]_N.|t/POUIa>nj2s9M?wnFW)Yѩxc50̱6Aƴ4#qIGåB]y˖F˖-u ]Zq1v>+W7n18b6 ##ވhm룝[)vjXb[6<} ƿsFoNꆇG-a\mLyQo0c hhP<(a9oso׌mGm ]5 5k^^5Z ctaEGm#-"EnW`3L>=(+JVBc?BtMm[)G?-#"+qa4Buj/P߯0&J8pPQ}H1 [""""R|h7H J-MD4yK!цa\O%"I/mu\)Iٯ[*DDD?ɐ4)!+1@\ ["""e*\'kLB ~"RUr)l(`u{Ld[–H Y%qRs몗BHZ \ [""" Y4x)t%""%"x|у3DDDyDM1iZRQ*K1F\ [""" Y% t]D f)쾤 ["""E4 DMA3E7b%""R&@%1tDJk-b~"w7~k-6 Ģ&jjK܃VI ["""enTBUq$1NM ""%eă ]" Z%/+lkOk wɚ(h~,Ň&?r}6ҏ=ʖ(hɚHigJX [""" Z \"E2ƔqFۃ1p麈Ƙۏ]}ieKDDHAOhQ_ʖ$H!dMt$/9kX}Y}YaKMOtݤ$/cܗF/_%yLJ1}YʖDHt-8,+x{e||yi0(,\è]]kҕ_0m-+Tfk^YGzַe}Ds1DD4tNE+YߟUVʎ,pywB\mM\eyݔFm59c.qPsiFmUM%ߌh dXW8ˮz+h"&h"n|8l.aD;|0hř̮Y}酷wzON١4n:-gg+\?<t⡬mm͖!z3x)쓫۳ԿՂXzyȎ3n2 IF&6SoDFg!8zD7.&nu:ΤdQSe: "rJˆ\Fg'ѸDlˋ_#'Ed%`.h&EYaޙɜ#ٷmU#"Fw= G`$!7}̤DNT~G*R/{6n^c־TD@kɔ6r⋼0)]o87¡ Ve,_k]\D\Ĩ?~vT HĥWApn܃y gLͳnto]̸+h"$h|Q.S :J]~z\mxq"s]M:֋aN{z:ы\LOGp&8O}lW ~ԅmp܇ß C:u hĶy^4_+FR'P6/rHJ`ރZTǩ~~ ksl]a1cln[No _#.+3ksxslM[C1͉ʚ~ GW 2yf@>``.%em& /۟էKتHڻx@FR,G.Z(W ^KL`/UK=W$`¿326iќފMK =y޼>^Vnw]w}~x^Kqߒh0s$GGGMFrxQFK?5֪VvuX=kPf^ݒr`n" Z%roƖѧկ2l91oi\"SsO8R9Aqo6 ^+!YDzN'7=ËR˷??M\Ȉ_At>LV]xmk0gW絣/1a姱\C"?4>uZŊT֖f#BM+\cϩDOÎnw6!(hȽ+[GVgaaaYN-od>0 >M |tXΒ~!ykQ%~{0_3埏=?䖭S6@ΟRN&onUR[cmպ, {J)ר )f}ġfk?_LTy|)Oe;N3x[Z%Ce|sKwvTﻘcԏOuƧjfN$=4CJgξ^߶9B ;|QŬz1v IDD BV ]v%.lQcAKuQ:B _D\DAKdB&s,xRz–(hIN4!% \ ["""L49MDAKԿDD'Fٿ@E4!KV.}\ib$zBX"k-HM;h,Q/\ [""% \%R%"" Z%d 8"y 3*e{W(hIɚ5H9h^ 15ըI&r?㇮gsՎCA6HANDXҸTl&K%5nh쐂jJZޝ#jAroFՄo2Qi*VQ(hƸ}D8lUp)^Fg'Ѹ TT" ZָC -lwv( }[-}Y+`9Ê jيЙIvy" ƫ7ۇŷ5eYTApACFED/yc )~_~ߘa2O;QD@ߞl–dYq|܊3逕AiڗvpeLvIZQ-Q34nHa 6l9б^ Sfjbd6hnG:=s&ΓI1\1Ȑe8CD5*%x)px1CC/i`ÖCm>7;>=ڽk=  ue\1m] dbPEmըW38 6lYM0MHhN|ꚉJM;}%/YIuq"yT" Z%w=VhKPGK?O0֌L1!20lNDq(i0wz2w ۍg~ HOd KfBfdÖ6r&ߟl–dYq|܊3yo4Tc8̄fEŀI\.LXD<9^,Ow?OCζѸFWyv1fNKepR'vpԯ©K\LJp\]ǻ0Hڹ=GH$v99 X=P6/p֥-)L&'\3H5޵s]l̫ڳj8cn>&;{& u,;MKܼŚ~ GWO@DDDnEŌ?[84_jN4:oO!=q*Z"RH\h8Wq(^++"""0leoͲo)>@D}MDDDJPҤdP)aKJJRT,=4H["KQhPF; FP~mޖy2 umqM RF!mG~EY\JB88+-&:5Ϣ_j6fڡ{>N_)a\=N`˱k\;3^Pn&rV:d&dJ6lm#gY+Q3U3>9M̜e]Ĩn'p<$"^7ل-oɲgn<\HAju#|2x2l$avr!7}̤DNT>͇?d՘;c?3;yAiڗvpeLGB\>P47V_kz<+?X̡_r-+r_""""e>liߢNPBo¾}@aW;j8s WN%3ԟvMχsu;LdD";fp1j3)mݎruz)O\bۼxc֗.euB FpRs0ehF!־c6Ν;sCx ZWvտpJ&UDkRW_?i2wǎcyo5pa'pH,Gx"NxK(n:5]ٸy aƝbr_}uC"""͵AW*oG߁ pK|ń{}3qiMWR"-X/l}Rϵ^RNm_KVRcc]\D̑wsL0+ҷ.>63ˑK &;?ø)i|o2Q976x:`-HP5߱+T+a֐^;vb\#z tlAP|u,58>> 속d thVDDDJ}]@:Al4s/20xۏqt?}}ZN\MhFNNs%OA;.D滺r?>!3Q7W_gm&.3V_%ko:X}T0[i'ܦd`gnFܼ )mx՛hCpg<]Lֳ5*:^ts9{7rωP߉뫯ox8pDU $K IDATuNMCiԜMiu5ޞBpU_*ZGsu6WAw ˄8`:k[Sl'sGB߲Ÿx"Uϩ^7suԼ's&=Щ7۷?tˤaCLn= wnr:ؕ;7Y|w>k%̮ƎtYKZhtQWyEDDDJ(Sxxv10 M.שT~)6-/[ hQ;Ek?~o#+4_&qK `|\#"""RX2x@>Y)[j 5(lِr%őV_EDDDą-DDDDDDl꫈6(---QQQ---QQQ---Q)2qɔ翥3 TjT5-"""R"Ö&=+hb.ib4Y*tϖH[㬜;BB8Ӵۼ-e~„NcNZxz2tIxw_:VPigѯM5\3P]|\GYbfJq>5OI3ٗ ƅLA^t[GrtX֜+jB\TǪXsVlYɄ^:– FtÔX8as{b#jӛEt2 Վ\S8uL򾭤{a' 3qL!X5G,ál}SǙ?75/w_+C|[Lm>X -GJ]VjN{0UnÓ{ $*h֔3ڦeijb͌3S6TkZj4m)w3SsKEPSnqP󺮮+yg+ҽ"rI[)_镝Yy;~Zs..=\sɇ͋]=ޝ^`[Zֹoƶm}o{Xs7Ƃ3WGg'G FӾhN[䐪$.ze+f~4>STM#^JI4S7'س.u˗ms~R@;v0(Fb43)FoRUXMl'? <8#"r/o[Xl9Q ɗN9lk*\1d[).eڷ$b-46 &!# 5BQ{}b3ndkbtZP*qEޤƳ767&υ 3qk1}ΊXVDkxi;O$Bs>J0|WqX˦RxE}ʚllg7:toCa׾V^1j7Fl/Oa9sJ̼7{+*( )݊^|ٹv[OÌB&8Wމ."تԒᏸ3[3*]0ه7R]cx=2u%Ȍӑk_W Mɴ A|00I Kz8-͈'>s/>́pq7g཰xuUTԎϧ!{Le99.< Kib>OZǁEڮ;n?P=ho{ j´sΨS/dMa6\IUђM<pK^ٹ l9)NI`R%bH NI?Ko=qlטN`=}Uk?~vQfq2(w^GY|,C[[ ?Y|wC˜~f-1g_T܂x~6v#?%x:u=`xvGPoh"fB/{+)[bb]JiV(26?;qIPۨ.-{H2Lږjҏ0K3;=?6 xI><0MG@]&f_Wm`4bj^ae K̉f{I<^?&6[6mJ͋;Mvkˉf[1cb^4ӳ s󹮒s0ʬ:3&$x޽$|ܽ,k{F1UA.z@F9 XŨz7K5clڟ̉q|'B>À\|wJ8TnB:8S["J{m 7߷nǾ$i?5-"57S8G DVR*C[rUJ~м/yI~f/8:h,,0)~u/-^|ٹol߼n"*DD*=11fރ+|0I⺗7{m }/9~b?F@?O~vRKl gK>߳ lVTldlMc2M#LzMzAя_bIe^jR<*ٜ_=k%cRM{Mw}U4h5,ɛS9|N=규;?Ң?2#Oo?(xyHNxt 3O!35h<(OٲDDDcTf袥Θ})bT1xPe;.1)qI@+R>[I\ѫ/"@DDI"+Tl(QRbo͋s^R:*DDTIřTi_JT`X«|P%""J HoUcoc]DX-4)sViI^ Z-R1Ljk /*DDDJuU~V%r늬ؿ]'*DDDTdݢKH#4QDKTe\9hP%""r T|\[tU<c~|Q%""V]ymKQxQUHbR%"" /-}̨h:Ul*K'3*nW[Qt.h̨}_gUl(aR%R1CqbKDDDE/﫽TlHKtW%qdpP&/Ѹ~/*DDD (jRG&n"uP|߫QT/#){qe""r[;"**FW9:%""%Q`.e'ri߉ Sp͋FgDDZ:U/-**^%3[""DIn*>;bNnptfKDDThI$`"rQ:-Q%*Dc>~bKDDnsdIɗ ا{DDD{}/?EgDDD܂LvKQ*DDDTh/)#/vD}^Ŗ -Q%8vhPW%""BK|QW%""JDɗhy[""dI|QW%""J,I/%`C-%Kr KŖ%)Kxk\*DDDI,0Q%*DD0Q%*DD%%KLTh-Q$JD㇨қ((DR%""(XZKŖ(Y%_CX/^Ŗ(Y\Cnkϋ[""dIDhb߫*EDDɒ :nh{["R̢BKDW5v-Q,Q)} ,OQv`%; EanX;iѷkVbS Sh*bRfST7>e,p{a;6_PcIKz|Oނ= \\ cw[naBPe%M",Ҙ!R~[Ui5nܒ&Ik}iܨ1HɖZ[ד!1 ]o?M4͈8e˛E-vܕ71N2oՅ~=]fA^Y[W,-(-iG+qK޼9|2 j8]W}v>Đ-x癖^W>T>w3, Zv pz Z5PX[ ?Y|wz4=gzCcYfI;5L{im'?ΣSWȅD>̘6?,)%Z[YxzcJyyzegnζ\ KÈŮxAN/--op9tQxP>_2)[f*Y8eWA.^uiV# (;.MXpM{CTx>^NZE,ϳy{,u)JD*^¥Bb^6w$&PN9lk*OcY7Ž,@6wDLF݆0ad:dD 7me+~r9Z=sʽ+wwqnޮ 2A1X`0y%d[(͍ۚ<:?Vvf¤x%N"řpx!**P 2=AZ 7mULa)ݳoVUKzo\|:~ k<*rXnkX2sBN-ȳx&<ϸ% [VlZp;*ˬ ʯ`2V|_ XōNA BV-K V%N"śpŵh\RDDhuxHW:c/.wR&0jb||W3[y1؏]ښVΆMLp3qE8f2s:5ȝY}/ѧߩ_iJs*m>dukdc2z41|vd.7(yi~6|WS}斸TKE5ov5^Hyc0cǎ5q:Q́O3Gbgq/?wG |kF[S[u6'W^ W00f(]<%PZS}v6*juhےϟOMn՗ZR9z>̱=UrO:KQ3B{?eZg=vDDn$U%eM^ܖ]?%".=+T3[{:%"jo)HY8敖\*DD@DKqB8PZ[""*DTpU"+DXp;'HBAm"K*R#ufKD\DBKO<&܎`TldJDTpil-%S"A\%ɩ:VJF1*qゎ/"O< vwr%!űhL2[lC:"oLlb+iI/q ;#,/;C;V""""R*sY49➱2-⫯XI;U""""Rvџ4iҘ6# >ɗOҶg%=orּWouOw;UJuCŨb+潕̔-1DGGTw1hB+& .iXvӎēɠ9oeϋy}⿴K*`Xl4i1=r1q; tDjTj܇~.@&'z2eM4| ۿrcq菮ŨTbɇ͋]=ޝ^`[ZagFӾhN[䐪J""""RA$b-46 &!#O]PήxlYʎ6ceL""""RBun|:AX1Yzc«AV':vs By>wot؏B_ gHb }w iСWsouaQma0cǎX,cl nnN?g` &!=FybT"n)1b>UXY >Lg:Sª(Qj)[l95/qPbbO4P&̋IKz|O7謣oӧj~}J2B%R 15R_#J\v3փYNDDDnb9ebS.ٶڕ;.ճ)z?-|iҤ1mF|)}/#m;KzԶէ+z=Z Ne-=FujoyʲԠP/,bKD$_qQU\k¼%(ֽޕc=-]|l筄Zq,;e!}eN?Cٳt7YJ]k8 """*D4qˮ6fqL\Ace\3Nu׺4‰pa07΀S&4x;N5||0gtߖr₻s+.ta}|bWi=Bh<)ߩOCs?Z[jé """%""Œ;xfl=OJm+FK\8`ZhƯޟ`bM"n?ϟ3["rk9z>̱=UrO:KQ3Nk&[ˍMyIl^}Z^DDDAwiKӥQŴbKM.,D1)ŖUQA%""""r!"""""R֋%h>'R 󥌽Һ#drI„,.W3fPځNo;Aϱ#]-Z6DDDDeQn%ŷ\ÙfDRGJLˍOd+JŜR|gR7d},={gV0֟?ɗOҶg%DtʟG?Sـ Ѡ7ͺOaY[ny o{} )Ż5/UǛfݯg+Y~~.H+`)iD}/+c>aTF6jJhLD  -yo 5Q ɶk/F0 )wo®7ן&MfW)4EDDDV*5O<qb';#q^wѬr=-]|׬筄Zq,;e#}L|ъEѱl˩Ĝ˟ǘO-Md_-77-cN;O^}UD>̘6n[ 6svtj*/9ox9ZbdϪҩzήL+q i)-C[rn*VeC?|/ `HUP89ڿr ~,71IxMt};[|ÐXq䴉`pЇsXckch1j?R6+;lp>h|{˵L}K]KϚÈݴg{5ŴC4B=11fރ= 9 ՂP ̀-RxE}ʚllg7:to^l˭~gW<,ey1߲h%ZV-K V\g{+S#G,6qF&Wn8x_Uೝ d%pnκ*Zڋ씳xYƯbm/FmgOJ窗:{@v1u„iEBRDDDTl]f5>[Ӫ/td}#!t!]wݔbw>nNǗ`ȹ&q"ǥ|'^cIx"1M]m?x+Czׯv# iqt,L0?4h@#}1)uBO>;fiԎϧ!{Le9=5|Q{1W_=Fjs-蹵0Q{fȌӑk_W aƎ{s3X0Ɣ&=-s`a(]<%]^]~ڤƨbZ#)c%R/+<܇,8A~JX ~{<bhC_!(FEDDD&9 DDDDDD_ٲX xR@1*""""e*j+R 1VlKXu@JŨ4ݳ%"""""bKDDDDDDŖ-Q%"""""bKDDDDDDŖQ%"""""RA8L,KS![1)ŖYpbT1-"""R-%JDDDD2ݳ%"""""R&-k,K}DT'>ؑ^[WZwdޑoZ̻L"Ol$mxOYt֜3:]}ѣ?OT6`;)a4MSX{V2gᙿ&d<65/'HZ/a;)$uOҳW|vn[`}JUOթ"a><+CBhxGuF嶃(Fo$F vً≠/`|qu l0>{mu عs lH3߃;Aۮc u })oF #FX!t〥FȚo;ȍw\@g" O$-E?PDVI2O2 tv1Wd&9N>Xo^rV}~6mƮC|3G1,Z,8:;&G-->LN7k+9o)Cb=.ze+f~4>STM#^JunOg]) ޡ-9*V%C gh+g} 8:hvk Q@^Gho)0Fؗ;5A hg%ImLxݎT ˢ`QUst/rO7 U,9[<{S] osI[hmMCF j\juF&{rjA]f@V&5)ذT1~.\8[sVE'Z38Ny"Ą=Y~l3|A .Gp;ǡ+R* _ab8tNg7b(k'FmgOJc&5n=umgpiKN{/! KT{OamGY{0 qm'2a@ڷnI \n _lUjGܙ-V]FC.S~q wCU.uobksҺdv5įKWcdZuѠAZ>Ir Ĝ^?pz?sٌ>| !^a32Xw3{F kWH_KZ=8onMҁw8]uBO>;fiԎϧ!{Le9ݛsO蹵0Q{҆DK OƒD$cmgEI k^ ë7:_WK:܎! T^rV?۽#1_޽pkfw(½)w0w-?˦n&"",To0et+~R~-z;˼d📗e=?2˟2[n>S˄}v'}Kefl{i=l5&9zB|/n6[v1ofM4cӡGT1כ] 9d2yi=٤}Pr;Vh>j5&3i7lhfӧYT3 s,3o\XbNo7O<._dws;Σ3IyZwSZmgŝ5=M{ƘirjOB[&u۶m۶{q&sqp0}-et\0zWaNVj@XRb8{)Ѧ_H x@J=ؤ<)YD*v/cm?nϫc޽(½nUqS*e97S8G DVR~|O,Hc#v<)ʃYDbٓ2-ߎ+Λ[,:2TY~gW<,ey1߲hCR%Uuvi۹=l( <)t2'"W){ysSjaӉ '9{y>OZǁEڮ;nJ){E'5HH?Ewk$cջ=kߨǽ3TNd iGf!x֯%)sqTijaDʹX> c,WZ=q΃M<+F c9ۼ+"7d.hWk烇o`fNT3\u%f\hvlfGhe\3Q|s|O4^>75ta3v؛E0b^jUL+E4NTDǿfNGu݂evgrSw񷶮}ƨ V G̝<5k痗 A=X]G8KIH/Tp}eɱZ_;? l}nO1sْ1}3Dn2WX}Vې7?@ 2-⫯XfFd6q5 S֐dgfϟķu骔 wex`?kmݿ]b= ɵ3,/}gC x6Ѓ:-`G7m]gާRy^Y> L}1mKd]o}lY* NTpTgUlѫ9t8`с?&@j9|2 j8]1Q!H8Ѥ,jv畷2( frtzrW_BF3m8G Ʊ2.@j5εp񹛁ͮ#u,Vv-o= _nlYNy"Ą=[u9Z=s"1G񯡣98?ѻ8S7o}nТ@h5K/{)e\"EVQ%R} j~^ޑڹwq)<WXdLS8֡l!cͫtSgHz3ctd;%xU«"Odt oZ ʵo ۯԒᏸ3[ۼG糞 2=AZ 7Ʃy3:O؄${Vϯ1(V>ۆURvG7Rf SSU|dn%쭧R%C}^n2"""رcR1pnh!Yյ? ߂\Kzި_y59?_o>7f(]<%PzZjKm[m6( 0=U N{!/ H4=\ԫҺ#,oBW)=`ZĞj=ov<KQ35?POeZm{)J*-R1Q)9{{!j¼(EmB~/8-JYF&0-ɗUZ%79^}X 7_%>BKƏUpb9Z5S>/ -E闿rRmgX=%ui} k^QBW)s%QKDtl^l]v N] ~!ja_Ě׾(5}L|ъEѱl˩+׼Ա_*"3aZK4b N󟸐/bw^zRm$DJqo IDAT`TsY?4tj}ia_*""Jh QWUh4^Xp^Zb1̘#NWZa^pZ$%`"CJK;IY)|yk/\7T ՂP ̀-z7"UJz%s_s*[,X,JZҋ"sH4+\DQk,K}DTmjk*JDƐR_pjG/b-΋R'114ޏ/|uy/8- ]EP/KşRQJ\M2gW1<>M9"jx ?X5omg{`5c {W-a+Nqj԰8b>RBR7d},={gV0֧I!!4:Vp* /~>tlۉLЅ[2z p#@3O/-$t>ɗOҶgrWJaiO&i3+N&-jk{ ^y࿿za#Xrx-C6gsV(v+v۞vZ"JDIh 2^lUa_zcES(Ԕ>lߜs]8)SWsqBȜ̥pKhh Gl^{%wNxqbvˆEڮә=H y'~ fIZRXR.- R\mɹXq?Ca3bb0:O_}([Uܮ+ H=܇i%+Ϡ |k6!ܹVC&ǑVo0m,|u] |^V= zrhaВ:viƑ_p-PܛH~ưfy{7w!>e 751RxE}ʚllg7:to^ N"&BnC0m22H(Z oh&ָ,:њy U/]/v{rhHR["W|`:Oִo.h}nt,L0?4h@#}Vl<ewgljAx%H4 aV'<BI8BuM)˧#/ӯ^V=5s$ͥoRK?ΌnA2on'T&GyuQ2&rcmKm;FDDcǪ%DB8cr_ֶKB+nmڶ"lufKDDt.x-S%""JD h<o[""7w((1%drQ Wp))7Q[ ]hct`IrII+R}[ZŖȭWZwdޑsJZҋ" m$L hآ7e\g/Zi۟B:uSۋ̒h @]@^;p >y?E (1+~bKU ˢ]]/2gdrKL_t{lHSIaiO&i3+N | 9Hiz@av ϻtOGkZy|¨NmԔ!Q+ɫ6%2!|> 'Uo~FWMZsw`M1p+vsՉg)jrZOk]/*5WԧIvv3CT B_7p4>8gFH?j`Yl&`lM̾Zy}UkQ'gAv1u„iEBv>OGtsJ,P3' s{{UV +)Crorp!n cfkt7H!ETlq"ǥ|'^cIx"1M]p Ĝ^?pz?3YqHh'Gmםg7靛iՙG <.zk7D 7 w1ܗ̥ԫ,K6SOs7R63r!So5Bq#!MPg~`҈~><2ΜϜysLl4;߲džNzY7.HfOnkG`@#ڼOIf7wnE]Ҕ#Yk9v:̐S<A'$z+q: h؈f=^gǵvcQ9o2?fֻXE,ERrEL&LH@CP{qU=Kbm˭Y=[###-QȒ[Qq՛si!]F(""e6@aJE6iIAKl'p–Hv"ШYS.kEDjS¤XOԶFl'pU%"G(tImo{*{-, (t7rUDDXmR-[6GH~*5%"RE•SզMro{NoUKa,j6U%b{W+dI{֡"S(FbHMh{mڇi# ]s@(PܚfG5.Xgf+KQ}>m'%"r3?HE׬*rf+b G;f297[GG*[Qէ'H]~AWɞTzfZ4[Z ÚxxtE.FU""gTeݯ2. d4i&YY#PpƆֶ"l~)ߺ~uO,<_Yv`ţ37jT)"Ru?#RjzVO,|"Sv'fv`_AKyn×3U5̆jT)"""RVA: ' 4A&M}9q6{5[w}*b2d'|ÆJ58y'ó6G&~"l:w`lFU""""eFg`IB|gn" ?S OlJ,??L׽D,f^<O}Wsn $CA] F/Ʃ`ըSDDDj-^(hR^B׷pr YMr̸L!ƒXɪ7P ~HsP>EDDD*7[:|1 A-[Ӻ|_JxJԗ7@sˉN%/90*5n0bFT1ԸxS޳WӧTwHQէ–soFBT""""rVY_tjLnk#NU""""U(l1]N,""""bU|$ɳ#%U!RO*է(lYU* X""""%OQR+QزU (`–WQ-5">U"""" [ X"O aKgDKeW4՛–WQWlL/""b%*CZc2T[)eKADDDaKͫVRʟ C7+OWKDDDaKͫX}T͘^`?6%W5RjTAj@R%""R%Y+~)VQF5ڪUm?--JuLG5ڲx~^AKDDDaKͪT Qi} ɧkbI!4ܲ~1{\ T_k%?ds5s-;uZeF)|#~n /SZb>ݹOZ{>ex;1&<ч}oÐʼnfbg1<1GG}–9"ٖTBZn&7-fp%8\iJI$ϱ)Nzrh8 ##Q_Z Ú: 4g qw4~E:āb=OPc]y^Gs(η}!}~i%""R5֕e?VxB4[akNXvs6n АhHcќ-4%u>-iƢ?@/~~;s73-;/[׏ڳ'X9LG .}Loݚ: cz\r殗ybCgVYйM&s2/ 0]wl z,zƺs s5ηu/11:Xɪ7P ~Hs-g.0gSr^{Q: B<ޘț;v1'WʨҷbG~83`@r5gZ\Z?Ý7§yPz"u,[{skLsQGm=lJBUrK_b-v 'ɹ5O<NDDDnEo֬5G]pob+ ٚ\xصiw|>csjƴ],?PYl[w}*b2d'|ÆKeN DW/u_ɧ>.NldvnuuSY&=8xA: ' 4A&M}9q)q3R\D'撗Smܲxs{_O#=|h5O7 |ժdCXL7^cGkZ4P#/u.buR.`IͿZCV8Wƶ${g62_ӧpЗW?BX{l:jGȐx5g[͜߃Y?k>oG~OvLz}u l9zv}CZv'ʘaMחi\t\ZMfC[z9^xc߈z;'!O~ۜ˳|[=M<$Ϡ0|hg>p`k,{~.S=,ImZԮWtZ'&##j?˪Ŋgp닿3c )E{ܞB25׌3,Z4a„6dQ@v ͤ>$d0,֕cwDj*V7UFU[7sqq| ] 2IDAT)%GA`U2\"`f̡v[D-?"##-{f拑v؀#tz3«pGzkըrVrWKDD(l]3 #nE*FW.&""" [""Wֵ+W ا; @5*1hU!g̊51[J>)[Rn"""ban ~#jT*{R=IH% Z^(l(hY h)p(lHIKDDDDD,ngn(lM \"""b]""̡ADDDDD,I_ """~X5jT5wODDD*eRcPbPQV͚"""U0lY*n""""""VXcⲯԂKo19xMG/%1ɟ#>!4JWMsWjԼkٙ L>R2w6sRp执'՛2n!]Oj  TI N~{H"ɬzc~αNc&4>|@662#mkI;slDUXg[Rի^5ں)\[ guh}ZSdddq!=Z2g^mmwp.#=EG0ɪNtQ؂$"| +maRDaw<Ά4d2O+4nB=]~w }0iן4mڄ1k8k"Q 'a ǯD|HxhH_z $hlN~u–5-xT2f9uX~5apl5 ϰ/ eYJa{.{8~l-w;?Lٝ@||ٍvwF]1$䳯 2򈘳M?9?k$;v6IDlj.`$}[ ilG~X}/20#e 3 5 dxȄ@OY$1DŽmYľڑz肮2ƧTfdvtʘoii Tehq91_A>gBK7 \mc|2r~9Ďq0lپal3l-kwѿoYήb`ÚԬYYWT29r>йCOU""" [{,?BPNJ$~A4wν9}MgO2-*{0w5;֡/csH?yɷaMPLNeq2e[P_z5rr9ÔjQp>fo"ߗל+5DOkB62; "&t)USY/~'Fcv `-{|C#`Ùɹ_8]|ɏ,vLB:܂跕m VbC[w HKK#f&6u,cfG5zuKvKdig%""eF殗ybCg߯VNކT2~CCƬ=̺;^`oV[{lݻ{?֍0-© ;5l8I5Č :gq1wb#+KMC/b6;ڇ¾  >K8N֗:[:RKG'u^]8Ot21bzBK=\Yz [^i!Nztu To ݫ0 s;:Ω, ؞T:>eg`==a/ހԣmrn4`<jƧZ'&##jv}>vO+}|ּФv޷$r| Q Y7UPc}uLi"}^͍Z2o&4QDDĪ-Zd0a_dKx~Ϝ`&\\0.g`D4~լhp}F|Cu_4 »{AkgR"kEyl0; ?#{1GgWӸJ%Q\ә- [5Й-m"D t 2tQ̈́-E;QMhYDr%"6tD5ek3["""""" ["""""" ["""""" [""""""%"""""%"""""%"""""" ["""""" ["""""" [""""""R^v%IENDB`pd-windowing-0.3.0/windowing-meta.pd000066400000000000000000000004261434507720200174040ustar00rootroot00000000000000#N canvas 37 107 368 230 10; #X text 10 12 NAME windowing; #X text 10 52 AUTHOR Joe Sarlo; #X text 10 72 MAINTAINER Fred Jan Kraan ; #X text 10 92 LICENSE GPLv2 or later; #X text 10 112 VERSION 0.3.0; #X text 10 32 DESCRIPTION set of window generators;