diff --git a/COPYING.txt b/COPYING.txt new file mode 100644 index 00000000..903440c1 --- /dev/null +++ b/COPYING.txt @@ -0,0 +1,520 @@ + FAUST IDE + Copyright (C) 2017-2024 GRAME, Centre National de Creation Musicale + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 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 Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +---------------------------------------------------------------------------- + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 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. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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 with +this License. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; 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. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/README.md b/README.md index cbc516c4..4a844137 100644 --- a/README.md +++ b/README.md @@ -151,6 +151,8 @@ To test, put the directory in a local server, then open page: `./dist/index.html If you need to update the editor's version using `git pull`, as the repository has other dependencies hosted on Github, you may run `npm update` to make sure everything is up to date. +Note that the `src/static/examples` folder is a manually copied subset of the `faust/examples` that will have to be updated from time to time. + ## Launching the local editor A local HTTP server has to be started with `npm run serve` (or something similar), then use `http://127.0.0.1:8000/dist/` to launch the local editor. diff --git a/package-lock.json b/package-lock.json index b257cbbf..25d74578 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "fausteditorweb", - "version": "1.4.1", + "version": "1.5.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "fausteditorweb", - "version": "1.4.1", - "license": "GPL-3.0-or-later", + "version": "1.5.15", + "license": "LGPL-2.1", "devDependencies": { "@babel/core": "^7.18.9", "@babel/plugin-proposal-class-properties": "^7.18.6", @@ -16,8 +16,8 @@ "@babel/preset-typescript": "^7.18.6", "@babel/runtime": "^7.18.9", "@fortawesome/fontawesome-free": "^5.15.3", - "@grame/faustwasm": "^0.3.1", - "@shren/faust-ui": "^1.1.11", + "@grame/faustwasm": "^0.7.6", + "@shren/faust-ui": "^1.1.13", "@shren/kissfft-js": "^0.1.10", "@types/bootstrap": "^4.6.0", "@types/jquery": "^3.5.5", @@ -25,11 +25,11 @@ "@types/wavesurfer.js": "^3.3.2", "@typescript-eslint/eslint-plugin": "^2.34.0", "@typescript-eslint/parser": "^2.34.0", - "@zenfs/core": "^0.12.10", - "@zenfs/dom": "^0.2.13", + "@zenfs/core": "^1.2.9", + "@zenfs/dom": "^1.0.3", "ali-oss": "^6.18.1", "babel-loader": "^9.1.0", - "bootstrap": "^4.6.0", + "bootstrap": "^4.6.2", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.3", @@ -77,12 +77,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -90,30 +91,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -129,53 +130,55 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -184,19 +187,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -207,13 +208,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "engines": { @@ -224,9 +225,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -239,75 +240,41 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -317,35 +284,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -355,14 +322,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -372,116 +339,93 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", - "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.23.0", - "@babel/template": "^7.24.0", - "@babel/types": "^7.24.5" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -490,13 +434,28 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -506,12 +465,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -521,14 +480,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -538,13 +497,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -582,76 +541,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -661,12 +557,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -675,139 +571,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -817,12 +587,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -848,12 +618,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -863,15 +633,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -881,14 +650,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -898,12 +667,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -913,12 +682,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -928,13 +697,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -944,14 +713,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -961,18 +729,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -983,13 +749,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -999,12 +765,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1014,13 +780,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1030,12 +796,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1044,14 +810,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1061,13 +842,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1077,13 +858,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1093,13 +873,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1109,14 +889,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1126,13 +906,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1142,12 +921,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1157,13 +936,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1173,12 +951,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1188,13 +966,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1204,14 +982,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1221,15 +999,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1239,13 +1017,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1255,13 +1033,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1271,12 +1049,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1286,13 +1064,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1302,13 +1079,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1318,15 +1094,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1336,13 +1111,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1352,13 +1127,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1368,14 +1142,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1385,12 +1158,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1400,13 +1173,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1416,15 +1189,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1434,12 +1206,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1449,12 +1221,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1464,13 +1236,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1480,15 +1268,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -1500,12 +1288,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1515,13 +1303,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1531,12 +1319,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1546,12 +1334,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1561,12 +1349,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1576,15 +1364,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", - "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", + "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1594,12 +1383,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1609,13 +1398,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1625,13 +1414,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1641,13 +1430,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1657,91 +1446,79 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -1766,16 +1543,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1784,16 +1561,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1803,33 +1574,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1838,23 +1606,22 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", - "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true, "funding": [ { @@ -1867,16 +1634,16 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", - "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "dev": true, "funding": [ { @@ -1889,36 +1656,13 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", - "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz", - "integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", + "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", "dev": true, "funding": [ { @@ -1931,10 +1675,11 @@ } ], "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "postcss-selector-parser": "^6.0.13" + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1" } }, "node_modules/@discoveryjs/json-ext": { @@ -1967,9 +1712,9 @@ } }, "node_modules/@grame/faustwasm": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@grame/faustwasm/-/faustwasm-0.3.1.tgz", - "integrity": "sha512-YLs7PSqO/R4Z8EmWL2+wBTMl03b3LyVv1DGy6vZ+8gKwjpwZ2hllHXi+7+ks5Tsn5yr9yZbEJ6MOyjFQpMsvNg==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grame/faustwasm/-/faustwasm-0.7.6.tgz", + "integrity": "sha512-6bG7PMvY42a6HvOz5+W/j0eqoLddb9pebL6iVX8TXLtJ4W2O6D0c9fq7TubCwxNNLd048d5bgQn+BujzfaKT+w==", "dev": true, "dependencies": { "@types/emscripten": "^1.39.10" @@ -2023,9 +1768,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -2060,17 +1805,313 @@ "node": ">= 8" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/@rollup/plugin-babel": { @@ -2152,10 +2193,16 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@shren/faust-ui": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@shren/faust-ui/-/faust-ui-1.1.11.tgz", - "integrity": "sha512-QBW/EG8SLf3CUT6II9x45aYLuHEXQgqcrGvQEEg8WOwBb74CZ+fEid+xFA8IjD7XZWjBMBiQ4KnXHlJyu+l5Yw==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@shren/faust-ui/-/faust-ui-1.1.13.tgz", + "integrity": "sha512-W769nEvD87Kp5R3NRlT43G2uv3lJxRuEUCGKMu4ciDHR6CWLB2cddX1IcWnYC4EZdDReiJRKoPLz8g7Twok5mg==", "dev": true }, "node_modules/@shren/kissfft-js": { @@ -2187,15 +2234,15 @@ } }, "node_modules/@types/emscripten": { - "version": "1.39.11", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.11.tgz", - "integrity": "sha512-dOeX2BeNA7j6BTEqJQL3ut0bRCfsyQMd5i4FT8JfHfYhAOuJPCGh0dQFbxVJxUyQ+75x6enhDdndGb624/QszA==", + "version": "1.39.13", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", + "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==", "dev": true }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2219,9 +2266,9 @@ "dev": true }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "node_modules/@types/glob": { @@ -2235,9 +2282,9 @@ } }, "node_modules/@types/jquery": { - "version": "3.5.30", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", - "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.32.tgz", + "integrity": "sha512-b9Xbf4CkMqS02YH8zACqN1xzdxc3cO735Qe5AbSUFmyOiaWAbcpqh9Wna+Uk0vgACvoQHpWDg2rGdHkYPLmCiQ==", "dev": true, "dependencies": { "@types/sizzle": "*" @@ -2262,12 +2309,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", - "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.20.0" } }, "node_modules/@types/qrcode": { @@ -2280,9 +2327,9 @@ } }, "node_modules/@types/readable-stream": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.12.tgz", - "integrity": "sha512-SCaw+bs9o/HCX1eTa3glTcQgW1oPxof49mqP2Qikik3xzTimNv2M4p43BQHhBuf7CwOJdQW0s1SrWU3MZxz6lw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.18.tgz", + "integrity": "sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==", "dev": true, "dependencies": { "@types/node": "*", @@ -2299,9 +2346,9 @@ } }, "node_modules/@types/sizzle": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", + "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", "dev": true }, "node_modules/@types/trusted-types": { @@ -2316,6 +2363,13 @@ "integrity": "sha512-bujQxJR+2TDXe5hc2kG36n38rJtdTbCafQddWaNJwgdNDVqMVxCCKAFYRQWq1aXnN/h9BTHLIVwi4gM8IwRt5A==", "dev": true }, + "node_modules/@types/wicg-file-system-access": { + "version": "2020.9.8", + "resolved": "https://registry.npmjs.org/@types/wicg-file-system-access/-/wicg-file-system-access-2020.9.8.tgz", + "integrity": "sha512-ggMz8nOygG7d/stpH40WVaNvBwuyYLnrg5Mbyf6bmsj/8+gb6Ei4ZZ9/4PNpcPNTT8th9Q8sM8wYmWGjMWLX/A==", + "dev": true, + "optional": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "2.34.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", @@ -2421,9 +2475,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2433,148 +2487,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -2622,6 +2676,13 @@ } } }, + "node_modules/@xterm/xterm": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", + "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==", + "dev": true, + "optional": true + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -2635,37 +2696,66 @@ "dev": true }, "node_modules/@zenfs/core": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/@zenfs/core/-/core-0.12.10.tgz", - "integrity": "sha512-5DSLgXWGy/7BOA1Fclp4nb77GbEk3aSTx3C2Pe4uiw1+kDwKKrzr/Yn0S0u0Ruy4V8XT5WO1MpZF+0C3g9PiNA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@zenfs/core/-/core-1.4.2.tgz", + "integrity": "sha512-tkxSNvl78PHEGDqmtZwsEJv3X4sgboK5pjf0CP5KSY1FrliRqAfgsJPL99yXdateeCjR+ZZJZvUeRnLTzuaN1w==", "dev": true, "dependencies": { - "@types/node": "^20.12.12", + "@types/node": "^20.16.10", "@types/readable-stream": "^4.0.10", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", - "minimatch": "^9.0.3", "readable-stream": "^4.5.2", - "utilium": "^0.4.0" + "utilium": "^1.0.0" }, "bin": { - "build": "scripts/build.js", - "make-index": "scripts/make-index.js" + "make-index": "scripts/make-index.js", + "zenfs-test": "scripts/test.js" }, "engines": { - "node": ">= 18" + "node": ">= 16" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/james-pre" + }, + "optionalDependencies": { + "minimatch": "^9.0.3" + } + }, + "node_modules/@zenfs/core/node_modules/@types/node": { + "version": "20.17.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.8.tgz", + "integrity": "sha512-ahz2g6/oqbKalW9sPv6L2iRbhLnojxjYWspAqhjvqSWBgGebEJT5GvRmk0QXPj3sbC6rU0GTQjPLQkmR8CObvA==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" } }, + "node_modules/@zenfs/core/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "node_modules/@zenfs/dom": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/@zenfs/dom/-/dom-0.2.13.tgz", - "integrity": "sha512-maw7cDlD+EzFCGwp67VbMyBIF9Rf44IlJec4Y5s+AfzP0oAz/NN4QA6XoKtirNZAAq8GZnZse1sRU9J5PmowQg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@zenfs/dom/-/dom-1.0.6.tgz", + "integrity": "sha512-x1m5DVgxF2MLPKihsAvdslsr8plg0PDgtfq3ypjHoQul3oNOoSOQuhLbK6vJSu9WsaLNS2ZGQJz2S7m+KKICnA==", "dev": true, "engines": { "node": ">= 18" }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/james-pre" + }, + "optionalDependencies": { + "fake-indexeddb": "^6.0.0", + "file-system-access": "^1.0.4" + }, "peerDependencies": { - "@zenfs/core": "^0.12.10" + "@zenfs/core": "^1.3.0" } }, "node_modules/abort-controller": { @@ -2756,15 +2846,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2874,20 +2964,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", @@ -3043,9 +3121,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/at-least-node": { @@ -3073,9 +3151,9 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "dependencies": { "find-cache-dir": "^4.0.0", @@ -3090,13 +3168,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -3104,25 +3182,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3163,18 +3241,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", @@ -3223,9 +3289,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -3242,10 +3308,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3340,9 +3406,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001617", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", - "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", "dev": true, "funding": [ { @@ -3380,45 +3446,24 @@ "dev": true }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "engines": { "node": ">=6.0" @@ -3654,12 +3699,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", "dev": true, "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.24.2" }, "funding": { "type": "opencollective", @@ -3673,9 +3718,9 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "dependencies": { "nice-try": "^1.0.4", @@ -3707,9 +3752,9 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, "engines": { "node": ">=12 || >=16" @@ -3751,9 +3796,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", - "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3763,12 +3808,12 @@ } }, "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.1.tgz", + "integrity": "sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==", "dev": true, "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.1", "source-map-js": "^1.0.1" }, "engines": { @@ -3848,12 +3893,12 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4005,11 +4050,25 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/digest-header": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/digest-header/-/digest-header-1.1.0.tgz", "integrity": "sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8.0.0" } @@ -4075,9 +4134,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.761", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.761.tgz", - "integrity": "sha512-PIbxpiJGx6Bb8dQaonNc6CGTRlVntdLg/2nMa1YhnrwYOORY9a3ZgGN0UQYE6lAcj/lkyduJN7BPt/JiY+jAQQ==", + "version": "1.5.65", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.65.tgz", + "integrity": "sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==", "dev": true }, "node_modules/emoji-regex": { @@ -4095,12 +4154,6 @@ "node": ">= 4" } }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "dev": true - }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -4129,9 +4182,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", - "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -4151,9 +4204,9 @@ } }, "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -4172,9 +4225,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -4192,7 +4245,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -4208,10 +4261,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -4253,9 +4306,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", - "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es-object-atoms": { @@ -4294,14 +4347,14 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -4311,9 +4364,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -4338,6 +4391,7 @@ "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", @@ -4427,9 +4481,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4453,34 +4507,36 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -4670,9 +4726,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -4794,6 +4850,16 @@ "node": ">=4" } }, + "node_modules/fake-indexeddb": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-6.0.0.tgz", + "integrity": "sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=18" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4840,6 +4906,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -4858,6 +4930,30 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "optional": true, + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -4923,6 +5019,24 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/file-system-access": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/file-system-access/-/file-system-access-1.0.4.tgz", + "integrity": "sha512-JDlhH+gJfZu/oExmtN4/6VX+q1etlrbJbR5uzoBa4BzfTRQbEXGFuGIBRk3ZcPocko3WdEclZSu+d/SByjG6Rg==", + "dev": true, + "optional": true, + "dependencies": { + "@types/wicg-file-system-access": "^2020.9.2", + "fetch-blob": "^3.0.0", + "node-domexception": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "web-streams-polyfill": "^3.1.0" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -5048,6 +5162,7 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -5236,6 +5351,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -5363,9 +5479,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -5594,9 +5710,9 @@ "dev": true }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", "dev": true }, "node_modules/import-fresh": { @@ -5616,9 +5732,9 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -5720,6 +5836,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -5904,28 +6021,31 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "has-bigints": "^1.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { @@ -5963,12 +6083,15 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6037,6 +6160,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -6046,6 +6184,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6058,6 +6211,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -6176,6 +6341,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", @@ -6259,6 +6436,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -6271,6 +6460,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -6311,9 +6516,9 @@ "dev": true }, "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -6490,15 +6695,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -6637,9 +6842,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz", - "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", + "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", "dev": true }, "node_modules/leven": { @@ -6825,9 +7030,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.1.tgz", + "integrity": "sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==", "dev": true }, "node_modules/memorystream": { @@ -6876,12 +7081,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -6931,10 +7136,11 @@ } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "optional": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6995,9 +7201,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/mute-stream": { @@ -7018,9 +7224,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -7053,10 +7259,37 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "optional": true, + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-package-data": { @@ -7146,10 +7379,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7500,9 +7736,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -7610,9 +7846,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -7630,8 +7866,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -7650,13 +7886,13 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -7667,12 +7903,12 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -7697,15 +7933,15 @@ } }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true }, "node_modules/postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, "funding": [ { @@ -7729,9 +7965,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -7812,13 +8048,12 @@ } }, "node_modules/qrcode": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", - "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", "dev": true, "dependencies": { "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, @@ -7934,15 +8169,16 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/rechoir": { @@ -7957,6 +8193,27 @@ "node": ">= 10.13.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -7964,9 +8221,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -7991,15 +8248,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -8021,15 +8278,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -8037,27 +8294,24 @@ "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8156,6 +8410,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -8165,9 +8420,9 @@ } }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -8331,13 +8586,13 @@ "dev": true }, "node_modules/sass": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.0.tgz", - "integrity": "sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.81.0.tgz", + "integrity": "sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==", "dev": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -8345,6 +8600,9 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { @@ -8410,15 +8668,15 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -8500,12 +8758,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/send/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -8718,9 +8970,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8802,9 +9054,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true }, "node_modules/sprintf-js": { @@ -9104,47 +9356,56 @@ } }, "node_modules/stylelint": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.5.0.tgz", - "integrity": "sha512-IlCBtVrG+qTy3v+tZTk50W8BIomjY/RUuzdrDqdnlCYwVuzXtPbiGfxYqtyYAyOMcb+195zRsuHn6tgfPmFfbw==", + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz", + "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9", - "@csstools/selector-specificity": "^3.0.3", - "@dual-bundle/import-meta-resolve": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "@csstools/selector-specificity": "^4.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.2", - "css-tree": "^2.3.1", - "debug": "^4.3.4", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.0", + "debug": "^4.3.7", "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^9.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.1", + "ignore": "^6.0.2", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.30.0", + "known-css-properties": "^0.34.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", - "micromatch": "^4.0.5", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.38", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.0.16", + "picocolors": "^1.0.1", + "postcss": "^8.4.47", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", - "supports-hyperlinks": "^3.0.0", + "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", "table": "^6.8.2", "write-file-atomic": "^5.0.1" @@ -9154,34 +9415,62 @@ }, "engines": { "node": ">=18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" } }, "node_modules/stylelint-config-recommended": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz", - "integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "engines": { "node": ">=18.12.0" }, "peerDependencies": { - "stylelint": "^16.0.0" + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint/node_modules/@csstools/selector-specificity": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", + "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.1.0" } }, "node_modules/stylelint/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -9189,15 +9478,12 @@ } }, "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/stylelint/node_modules/ansi-styles": { @@ -9290,34 +9576,34 @@ } }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", "dev": true, "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^5.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", "dev": true, "dependencies": { - "flatted": "^3.2.9", + "flatted": "^3.3.1", "keyv": "^4.5.4" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/stylelint/node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "node_modules/stylelint/node_modules/globby": { @@ -9340,10 +9626,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint/node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/stylelint/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true, "engines": { "node": ">= 4" @@ -9385,6 +9680,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -9421,18 +9729,15 @@ } }, "node_modules/stylelint/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/stylelint/node_modules/table": { @@ -9451,31 +9756,10 @@ "node": ">=10.0.0" } }, - "node_modules/stylelint/node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/table/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/stylelint/node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "optional": true, "peer": true, @@ -9500,9 +9784,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, "dependencies": { "has-flag": "^4.0.0", @@ -9510,6 +9794,9 @@ }, "engines": { "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-hyperlinks/node_modules/has-flag": { @@ -9644,9 +9931,9 @@ } }, "node_modules/terser": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", - "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -9714,9 +10001,9 @@ } }, "node_modules/terser/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -9774,16 +10061,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -9918,9 +10197,9 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", @@ -9928,7 +10207,8 @@ "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -9938,17 +10218,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -9986,9 +10266,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, "node_modules/unescape": { @@ -10004,9 +10284,9 @@ } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "engines": { "node": ">=4" @@ -10026,9 +10306,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, "engines": { "node": ">=4" @@ -10084,9 +10364,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", - "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -10103,8 +10383,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -10193,10 +10473,20 @@ } }, "node_modules/utilium": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/utilium/-/utilium-0.4.1.tgz", - "integrity": "sha512-bYVObnhgSl9PMyE9E89OH6rEzOwSQPZ0TVw1LwgQum1PhL4UxCDTnICcQLhkU9fx/QRQd/wLLcwDfbEsMVkTmg==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/utilium/-/utilium-1.1.0.tgz", + "integrity": "sha512-02uMD58LHEacpSkzx46JZ0FDvFGpSGUYN6mSHY9wqNUi4sZVNzDdUXa9unLLCj5pRxK28HcYqqe/iQToBpmxTw==", + "dev": true, + "dependencies": { + "eventemitter3": "^5.0.1" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/james-pre" + }, + "optionalDependencies": { + "@xterm/xterm": "^5.5.0" + } }, "node_modules/utils-merge": { "version": "1.0.1", @@ -10224,9 +10514,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -10248,6 +10538,16 @@ "integrity": "sha512-meko20S9in+V5xBLSVV/9uYVBSbx5AsJNkAslZ+a5yYIeFGYwcCo4Yd1sUpSGaiNnyflzrJwC7x7TdJFYrdT8w==", "dev": true }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -10264,21 +10564,20 @@ } }, "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -10365,9 +10664,9 @@ } }, "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -10447,9 +10746,9 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -10458,15 +10757,6 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -10524,6 +10814,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", @@ -10676,15 +11011,15 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -11115,9 +11450,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { "node": ">=12.20" diff --git a/package.json b/package.json index 7ac11b68..088170bf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "fausteditorweb", - "version": "1.4.1", - "description": "Faust Editor", + "version": "1.5.15", + "description": "Faust IDE", "main": "src/index.ts", "private": true, "scripts": { @@ -26,7 +26,7 @@ "WebAssembly" ], "author": "Grame-CNCM", - "license": "GPL-3.0-or-later", + "license": "LGPL-2.1", "bugs": { "url": "https://github.com/grame-cncm/faustide/issues" }, @@ -39,8 +39,8 @@ "@babel/preset-typescript": "^7.18.6", "@babel/runtime": "^7.18.9", "@fortawesome/fontawesome-free": "^5.15.3", - "@grame/faustwasm": "^0.3.1", - "@shren/faust-ui": "^1.1.11", + "@grame/faustwasm": "^0.7.6", + "@shren/faust-ui": "^1.1.13", "@shren/kissfft-js": "^0.1.10", "@types/bootstrap": "^4.6.0", "@types/jquery": "^3.5.5", @@ -48,11 +48,11 @@ "@types/wavesurfer.js": "^3.3.2", "@typescript-eslint/eslint-plugin": "^2.34.0", "@typescript-eslint/parser": "^2.34.0", - "@zenfs/core": "^0.12.10", - "@zenfs/dom": "^0.2.13", + "@zenfs/core": "^1.2.9", + "@zenfs/dom": "^1.0.3", "ali-oss": "^6.18.1", "babel-loader": "^9.1.0", - "bootstrap": "^4.6.0", + "bootstrap": "^4.6.2", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.3", diff --git a/src/Scope.ts b/src/Scope.ts index f907b330..cf653b32 100644 --- a/src/Scope.ts +++ b/src/Scope.ts @@ -51,6 +51,7 @@ export class Scope { const l = d.length; ctx.strokeStyle = "#FFFFFF"; ctx.lineWidth = 2; + ctx.lineJoin = "round"; ctx.beginPath(); // Fastest way to get min and max to have: 1. max abs value for y scaling, 2. mean value for zero-crossing let min = d[0]; diff --git a/src/StaticScope.ts b/src/StaticScope.ts index 8d6e1cb7..d27a1c5e 100644 --- a/src/StaticScope.ts +++ b/src/StaticScope.ts @@ -166,6 +166,7 @@ export class StaticScope { const gridX = (w - left) / ($1 - $0 - 1); const step = Math.max(1, Math.round(1 / gridX)); // horizontal draw step for optimization ctx.lineWidth = 2; + ctx.lineJoin = "round"; for (let i = 0; i < t.length; i++) { ctx.beginPath(); ctx.strokeStyle = `hsl(${i * 60}, 100%, 85%)`; @@ -262,6 +263,7 @@ export class StaticScope { const gridX = (w - left) / ($1 - $0 - 1); const step = Math.max(1, Math.round(1 / gridX)); ctx.lineWidth = 2; + ctx.lineJoin = "round"; for (let i = 0; i < t.length; i++) { ctx.beginPath(); ctx.strokeStyle = t.length === 1 ? "white" : `hsl(${i * 60}, 100%, 85%)`; diff --git a/src/index.ts b/src/index.ts index e5864dcd..6b2f41cc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -117,7 +117,7 @@ $(async () => { const { FFTR } = kissFFT; const BrowserFS = await import("@zenfs/core"); const { IndexedDB } = await import("@zenfs/dom"); - await BrowserFS.configure({ + await BrowserFS.configureSingle({ backend: IndexedDB, storeName: "FaustIDE" as any }); @@ -297,7 +297,9 @@ $(async () => { await initAudioCtx(audioEnv); initAnalysersUI(uiEnv, audioEnv); } - const { useWorklet, bufferSize, voices, args, fftDsp } = compileOptions; + const { useWorklet, bufferSize, voices, useDouble, fftDsp } = compileOptions; + const args = compileOptions.args.slice(); + if (useDouble) args.push("-double"); let node: FaustScriptProcessorNode | FaustAudioWorkletNode; // Recorder, show current recorded length without too many refreshes let mediaLengthRaf: number; @@ -349,7 +351,7 @@ $(async () => { } if (!node) throw new Error("Unknown Error in WebAudio Node."); node.setPlotHandler(plotHandler); - node.listenSensors(); + node.startSensors(); } catch (e) { /* const uiWindow = ($("#iframe-faust-ui")[0] as HTMLIFrameElement).contentWindow; uiWindow.postMessage(JSON.stringify({ type: "clear" }), "*"); @@ -508,6 +510,7 @@ $(async () => { }; const compileOptions: FaustEditorCompileOptions = { useWorklet: false, + useDouble: false, bufferSize: 1024, saveCode: true, saveParams: false, @@ -665,6 +668,11 @@ $(async () => { if (compileOptions.realtimeCompile && audioEnv.dsp) runDsp(uiEnv.fileManager.mainCode); }); + // Double + $("#check-double").on("change", (e) => { + compileOptions.useDouble = e.currentTarget.checked; + saveEditorParams(); + })[0].checked = compileOptions.useDouble; // Save Code $("#check-save-code").on("change", (e) => { compileOptions.saveCode = e.currentTarget.checked; @@ -732,7 +740,9 @@ $(async () => { $("#btn-plot").on("click", async () => { if (compileOptions.plotMode === "offline") { const code = uiEnv.fileManager.mainCode; - const { args, plot, plotSR } = compileOptions; + const { plot, plotSR, useDouble } = compileOptions; + const args = compileOptions.args.slice(); + if (useDouble) args.push("-double"); const generator = new FaustMonoDspGenerator(); await generator.compile(faustCompiler, "main", code, args.join(" ")); const soundfileList = generator.getSoundfileList(); @@ -993,9 +1003,11 @@ $(async () => { $.ajax({ method: "GET", url: `${path}/precompile` - }).done((result) => { + }).done((result, status, jqXHR) => { if (result === "DONE") { - const href = `${path}/${plat === "android" ? "binary.apk" : "binary.zip"}`; + // faustservice MAY return Location : https://github.com/grame-cncm/faustservice/pull/10 + const location = jqXHR.getResponseHeader("Location"); + const href = location ? `${server}/${location}` : `${path}/${plat === "android" ? "binary.apk" : "binary.zip"}`; $("#a-export-download").attr({ href }); $("#export-download").show(); if (download === true) { @@ -1004,7 +1016,7 @@ $(async () => { $("#qr-code").show(); QRCode.toCanvas( $("#qr-code")[0], - `${path}/${plat === "android" ? "binary.apk" : "binary.zip"}` + href ); return; } @@ -1624,9 +1636,11 @@ $(async () => { $.ajax({ method: "GET", url: `${path}/precompile` - }).done((result) => { + }).done((result, status, jqXHR) => { if (result === "DONE") { - const href = `${path}/binary.zip`; + // faustservice MAY return Location : https://github.com/grame-cncm/faustservice/pull/10 + const location = jqXHR.getResponseHeader("Location"); + const href = location ? `${server}/${location}` : `${path}/binary.zip`; ((e.originalEvent as MessageEvent).source as WindowProxy).postMessage({ type: "exported", href }, "*"); } }).fail((jqXHR, textStatus) => { diff --git a/src/static/examples.json b/src/static/examples.json index 7b250148..1b0f3782 100644 --- a/src/static/examples.json +++ b/src/static/examples.json @@ -1 +1 @@ -{"path":"./src/static/examples","name":"examples","children":[{"path":"examples/ambisonics","name":"ambisonics","children":[{"path":"examples/ambisonics/fourSourcesToOcto.dsp","name":"fourSourcesToOcto.dsp","size":981,"extension":".dsp","type":"file"},{"path":"examples/ambisonics/oneSourceToStereo.dsp","name":"oneSourceToStereo.dsp","size":404,"extension":".dsp","type":"file"}],"size":1385,"type":"directory"},{"path":"examples/analysis","name":"analysis","children":[{"path":"examples/analysis/dbmeter.dsp","name":"dbmeter.dsp","size":628,"extension":".dsp","type":"file"},{"path":"examples/analysis/FFT.dsp","name":"FFT.dsp","size":874,"extension":".dsp","type":"file"},{"path":"examples/analysis/spectralLevel.dsp","name":"spectralLevel.dsp","size":233,"extension":".dsp","type":"file"},{"path":"examples/analysis/spectralTiltLab.dsp","name":"spectralTiltLab.dsp","size":668,"extension":".dsp","type":"file"},{"path":"examples/analysis/vumeter.dsp","name":"vumeter.dsp","size":545,"extension":".dsp","type":"file"}],"size":2948,"type":"directory"},{"path":"examples/bela","name":"bela","children":[{"path":"examples/bela/AdditiveSynth.dsp","name":"AdditiveSynth.dsp","size":1462,"extension":".dsp","type":"file"},{"path":"examples/bela/AdditiveSynth_Analog.dsp","name":"AdditiveSynth_Analog.dsp","size":1525,"extension":".dsp","type":"file"},{"path":"examples/bela/crossDelay2.dsp","name":"crossDelay2.dsp","size":2314,"extension":".dsp","type":"file"},{"path":"examples/bela/Faust-complement.lib","name":"Faust-complement.lib","size":2032,"extension":".lib","type":"file"},{"path":"examples/bela/FMSynth2.dsp","name":"FMSynth2.dsp","size":1956,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_Analog.dsp","name":"FMSynth2_Analog.dsp","size":1873,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_FX.dsp","name":"FMSynth2_FX.dsp","size":4569,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_FX_Analog.dsp","name":"FMSynth2_FX_Analog.dsp","size":4683,"extension":".dsp","type":"file"},{"path":"examples/bela/FXChaine2.dsp","name":"FXChaine2.dsp","size":5513,"extension":".dsp","type":"file"},{"path":"examples/bela/GrainGenerator.dsp","name":"GrainGenerator.dsp","size":3631,"extension":".dsp","type":"file"},{"path":"examples/bela/granulator.dsp","name":"granulator.dsp","size":2429,"extension":".dsp","type":"file"},{"path":"examples/bela/repeater.dsp","name":"repeater.dsp","size":2315,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleFX.dsp","name":"simpleFX.dsp","size":2434,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleFX_Analog.dsp","name":"simpleFX_Analog.dsp","size":2582,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth.dsp","name":"simpleSynth.dsp","size":2562,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_Analog.dsp","name":"simpleSynth_Analog.dsp","size":2596,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_FX.dsp","name":"simpleSynth_FX.dsp","size":5153,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_FX_Analog.dsp","name":"simpleSynth_FX_Analog.dsp","size":5350,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth.dsp","name":"WaveSynth.dsp","size":2230,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_Analog.dsp","name":"WaveSynth_Analog.dsp","size":2345,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_FX.dsp","name":"WaveSynth_FX.dsp","size":4895,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_FX_Analog.dsp","name":"WaveSynth_FX_Analog.dsp","size":5084,"extension":".dsp","type":"file"}],"size":69533,"type":"directory"},{"path":"examples/delayEcho","name":"delayEcho","children":[{"path":"examples/delayEcho/echo.dsp","name":"echo.dsp","size":462,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/quadEcho.dsp","name":"quadEcho.dsp","size":561,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/smoothDelay.dsp","name":"smoothDelay.dsp","size":825,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/stereoEcho.dsp","name":"stereoEcho.dsp","size":491,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/tapiir.dsp","name":"tapiir.dsp","size":1263,"extension":".dsp","type":"file"}],"size":3602,"type":"directory"},{"path":"examples/dynamic","name":"dynamic","children":[{"path":"examples/dynamic/compressor.dsp","name":"compressor.dsp","size":194,"extension":".dsp","type":"file"},{"path":"examples/dynamic/distortion.dsp","name":"distortion.dsp","size":192,"extension":".dsp","type":"file"},{"path":"examples/dynamic/gateCompressor.dsp","name":"gateCompressor.dsp","size":333,"extension":".dsp","type":"file"},{"path":"examples/dynamic/noiseGate.dsp","name":"noiseGate.dsp","size":182,"extension":".dsp","type":"file"},{"path":"examples/dynamic/volume.dsp","name":"volume.dsp","size":376,"extension":".dsp","type":"file"}],"size":1277,"type":"directory"},{"path":"examples/fft","name":"fft","children":[{"path":"examples/fft/fft_bandpass.dsp","name":"fft_bandpass.dsp","size":734,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_centroid.dsp","name":"fft_centroid.dsp","size":865,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_delay.dsp","name":"fft_delay.dsp","size":918,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_gain.dsp","name":"fft_gain.dsp","size":67,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_remove_phase.dsp","name":"fft_remove_phase.dsp","size":734,"extension":".dsp","type":"file"},{"path":"examples/fft/fft_synth.dsp","name":"fft_synth.dsp","size":97,"extension":".dsp","type":"file"}],"size":3415,"type":"directory"},{"path":"examples/filtering","name":"filtering","children":[{"path":"examples/filtering/APF.dsp","name":"APF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/bandFilter.dsp","name":"bandFilter.dsp","size":1314,"extension":".dsp","type":"file"},{"path":"examples/filtering/BPF.dsp","name":"BPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/cryBaby.dsp","name":"cryBaby.dsp","size":156,"extension":".dsp","type":"file"},{"path":"examples/filtering/diodeLadder.dsp","name":"diodeLadder.dsp","size":381,"extension":".dsp","type":"file"},{"path":"examples/filtering/DNN.dsp","name":"DNN.dsp","size":806,"extension":".dsp","type":"file"},{"path":"examples/filtering/filterBank.dsp","name":"filterBank.dsp","size":177,"extension":".dsp","type":"file"},{"path":"examples/filtering/graphicEqLab.dsp","name":"graphicEqLab.dsp","size":354,"extension":".dsp","type":"file"},{"path":"examples/filtering/highShelf.dsp","name":"highShelf.dsp","size":349,"extension":".dsp","type":"file"},{"path":"examples/filtering/HPF.dsp","name":"HPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/korg35HPF.dsp","name":"korg35HPF.dsp","size":379,"extension":".dsp","type":"file"},{"path":"examples/filtering/korg35LPF.dsp","name":"korg35LPF.dsp","size":379,"extension":".dsp","type":"file"},{"path":"examples/filtering/lfBoost.dsp","name":"lfBoost.dsp","size":1348,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowBoost.dsp","name":"lowBoost.dsp","size":1478,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowCut.dsp","name":"lowCut.dsp","size":1453,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowShelf.dsp","name":"lowShelf.dsp","size":347,"extension":".dsp","type":"file"},{"path":"examples/filtering/LPF.dsp","name":"LPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogHalfLadder.dsp","name":"moogHalfLadder.dsp","size":390,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogLadder.dsp","name":"moogLadder.dsp","size":378,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogVCF.dsp","name":"moogVCF.dsp","size":153,"extension":".dsp","type":"file"},{"path":"examples/filtering/multibandFilter.dsp","name":"multibandFilter.dsp","size":561,"extension":".dsp","type":"file"},{"path":"examples/filtering/notch.dsp","name":"notch.dsp","size":341,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheim.dsp","name":"oberheim.dsp","size":457,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimBPF.dsp","name":"oberheimBPF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimBSF.dsp","name":"oberheimBSF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimHPF.dsp","name":"oberheimHPF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimLPF.dsp","name":"oberheimLPF.dsp","size":396,"extension":".dsp","type":"file"},{"path":"examples/filtering/parametricEqLab.dsp","name":"parametricEqLab.dsp","size":437,"extension":".dsp","type":"file"},{"path":"examples/filtering/parametricEqualizer.dsp","name":"parametricEqualizer.dsp","size":185,"extension":".dsp","type":"file"},{"path":"examples/filtering/peakingEQ.dsp","name":"peakingEQ.dsp","size":349,"extension":".dsp","type":"file"},{"path":"examples/filtering/peakNotch.dsp","name":"peakNotch.dsp","size":350,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrder.dsp","name":"sallenKey2ndOrder.dsp","size":481,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderBPF.dsp","name":"sallenKey2ndOrderBPF.dsp","size":430,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderHPF.dsp","name":"sallenKey2ndOrderHPF.dsp","size":429,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderLPF.dsp","name":"sallenKey2ndOrderLPF.dsp","size":429,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePole.dsp","name":"sallenKeyOnePole.dsp","size":444,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePoleHPF.dsp","name":"sallenKeyOnePoleHPF.dsp","size":390,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePoleLPF.dsp","name":"sallenKeyOnePoleLPF.dsp","size":389,"extension":".dsp","type":"file"},{"path":"examples/filtering/spectralTilt.dsp","name":"spectralTilt.dsp","size":191,"extension":".dsp","type":"file"},{"path":"examples/filtering/vcfWahLab.dsp","name":"vcfWahLab.dsp","size":504,"extension":".dsp","type":"file"},{"path":"examples/filtering/vocoder.dsp","name":"vocoder.dsp","size":226,"extension":".dsp","type":"file"},{"path":"examples/filtering/wahPedal.dsp","name":"wahPedal.dsp","size":163,"extension":".dsp","type":"file"}],"size":19533,"type":"directory"},{"path":"examples/gameaudio","name":"gameaudio","children":[{"path":"examples/gameaudio/bubble.dsp","name":"bubble.dsp","size":1037,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/door.dsp","name":"door.dsp","size":1892,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/fire.dsp","name":"fire.dsp","size":1312,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/insects.dsp","name":"insects.dsp","size":4953,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/rain.dsp","name":"rain.dsp","size":622,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/wind.dsp","name":"wind.dsp","size":551,"extension":".dsp","type":"file"}],"size":10367,"type":"directory"},{"path":"examples/generator","name":"generator","children":[{"path":"examples/generator/filterOsc.dsp","name":"filterOsc.dsp","size":213,"extension":".dsp","type":"file"},{"path":"examples/generator/noise.dsp","name":"noise.dsp","size":1813,"extension":".dsp","type":"file"},{"path":"examples/generator/noiseMetadata.dsp","name":"noiseMetadata.dsp","size":2356,"extension":".dsp","type":"file"},{"path":"examples/generator/osc.dsp","name":"osc.dsp","size":471,"extension":".dsp","type":"file"},{"path":"examples/generator/osci.dsp","name":"osci.dsp","size":505,"extension":".dsp","type":"file"},{"path":"examples/generator/sawtoothLab.dsp","name":"sawtoothLab.dsp","size":239,"extension":".dsp","type":"file"},{"path":"examples/generator/virtualAnalog.dsp","name":"virtualAnalog.dsp","size":228,"extension":".dsp","type":"file"},{"path":"examples/generator/virtualAnalogLab.dsp","name":"virtualAnalogLab.dsp","size":268,"extension":".dsp","type":"file"}],"size":6093,"type":"directory"},{"path":"examples/LIBRARIES","name":"LIBRARIES","children":[{"path":"examples/LIBRARIES/aanl.lib","name":"aanl.lib","size":27753,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/all.lib","name":"all.lib","size":1016,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/analyzers.lib","name":"analyzers.lib","size":37512,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/basics.lib","name":"basics.lib","size":60106,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/compressors.lib","name":"compressors.lib","size":64754,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/delays.lib","name":"delays.lib","size":15122,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/demos.lib","name":"demos.lib","size":65185,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/dx7.lib","name":"dx7.lib","size":69103,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/envelopes.lib","name":"envelopes.lib","size":12032,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/fds.lib","name":"fds.lib","size":20559,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/filters.lib","name":"filters.lib","size":115548,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/hoa.lib","name":"hoa.lib","size":42799,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/instruments.lib","name":"instruments.lib","size":9395,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/interpolators.lib","name":"interpolators.lib","size":23955,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/maths.lib","name":"maths.lib","size":21483,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/maxmsp.lib","name":"maxmsp.lib","size":8174,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/mi.lib","name":"mi.lib","size":17280,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/misceffects.lib","name":"misceffects.lib","size":21753,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/noises.lib","name":"noises.lib","size":16086,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/oscillators.lib","name":"oscillators.lib","size":53381,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/phaflangers.lib","name":"phaflangers.lib","size":10024,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/physmodels.lib","name":"physmodels.lib","size":171348,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/platform.lib","name":"platform.lib","size":3131,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/quantizers.lib","name":"quantizers.lib","size":9855,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/reducemaps.lib","name":"reducemaps.lib","size":4836,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/reverbs.lib","name":"reverbs.lib","size":37506,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/routes.lib","name":"routes.lib","size":8565,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/sf.lib","name":"sf.lib","size":1066,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/signals.lib","name":"signals.lib","size":16416,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/soundfiles.lib","name":"soundfiles.lib","size":9361,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/spats.lib","name":"spats.lib","size":5193,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/stdfaust.lib","name":"stdfaust.lib","size":1270,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/synths.lib","name":"synths.lib","size":11395,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/tonestacks.lib","name":"tonestacks.lib","size":12354,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/tubes.lib","name":"tubes.lib","size":349789,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/vaeffects.lib","name":"vaeffects.lib","size":35897,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/version.lib","name":"version.lib","size":910,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/wdmodels.lib","name":"wdmodels.lib","size":89953,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/webaudio.lib","name":"webaudio.lib","size":12119,"extension":".lib","type":"file"}],"size":1493984,"type":"directory"},{"path":"examples/misc","name":"misc","children":[{"path":"examples/misc/autopan.dsp","name":"autopan.dsp","size":2292,"extension":".dsp","type":"file"},{"path":"examples/misc/capture.dsp","name":"capture.dsp","size":802,"extension":".dsp","type":"file"},{"path":"examples/misc/drumkit.dsp","name":"drumkit.dsp","size":1307,"extension":".dsp","type":"file"},{"path":"examples/misc/guitarix.dsp","name":"guitarix.dsp","size":8986,"extension":".dsp","type":"file"},{"path":"examples/misc/matrix.dsp","name":"matrix.dsp","size":551,"extension":".dsp","type":"file"},{"path":"examples/misc/midiTester.dsp","name":"midiTester.dsp","size":7986,"extension":".dsp","type":"file"},{"path":"examples/misc/mixer.dsp","name":"mixer.dsp","size":667,"extension":".dsp","type":"file"},{"path":"examples/misc/statespace.dsp","name":"statespace.dsp","size":1356,"extension":".dsp","type":"file"},{"path":"examples/misc/switcher.dsp","name":"switcher.dsp","size":564,"extension":".dsp","type":"file"},{"path":"examples/misc/tester.dsp","name":"tester.dsp","size":1082,"extension":".dsp","type":"file"},{"path":"examples/misc/tester2.dsp","name":"tester2.dsp","size":1189,"extension":".dsp","type":"file"},{"path":"examples/misc/UITester.dsp","name":"UITester.dsp","size":2158,"extension":".dsp","type":"file"}],"size":28940,"type":"directory"},{"path":"examples/phasing","name":"phasing","children":[{"path":"examples/phasing/flanger.dsp","name":"flanger.dsp","size":188,"extension":".dsp","type":"file"},{"path":"examples/phasing/phaser.dsp","name":"phaser.dsp","size":184,"extension":".dsp","type":"file"},{"path":"examples/phasing/phaserFlangerLab.dsp","name":"phaserFlangerLab.dsp","size":395,"extension":".dsp","type":"file"}],"size":767,"type":"directory"},{"path":"examples/physicalModeling","name":"physicalModeling","children":[{"path":"examples/physicalModeling/brass.dsp","name":"brass.dsp","size":263,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/brassMIDI.dsp","name":"brassMIDI.dsp","size":290,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/churchBell.dsp","name":"churchBell.dsp","size":244,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/clarinet.dsp","name":"clarinet.dsp","size":261,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/clarinetMIDI.dsp","name":"clarinetMIDI.dsp","size":288,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/djembeMIDI.dsp","name":"djembeMIDI.dsp","size":257,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/elecGuitarMIDI.dsp","name":"elecGuitarMIDI.dsp","size":330,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/englishBell.dsp","name":"englishBell.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk","name":"faust-stk","children":[{"path":"examples/physicalModeling/faust-stk/blowBottle.dsp","name":"blowBottle.dsp","size":5036,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/bowed.dsp","name":"bowed.dsp","size":5791,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/brass.dsp","name":"brass.dsp","size":5421,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/clarinet.dsp","name":"clarinet.dsp","size":5439,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/flute.dsp","name":"flute.dsp","size":5763,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/fluteStk.dsp","name":"fluteStk.dsp","size":6147,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/glassHarmonica.dsp","name":"glassHarmonica.dsp","size":5550,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/NLFeks.dsp","name":"NLFeks.dsp","size":3140,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/NLFfm.dsp","name":"NLFfm.dsp","size":3849,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/saxophony.dsp","name":"saxophony.dsp","size":6161,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/sitar.dsp","name":"sitar.dsp","size":1747,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/tibetanBowl.dsp","name":"tibetanBowl.dsp","size":6118,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/tunedBar.dsp","name":"tunedBar.dsp","size":5350,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/uniBar.dsp","name":"uniBar.dsp","size":3872,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/faust-stk/voiceForm.dsp","name":"voiceForm.dsp","size":5988,"extension":".dsp","type":"file"}],"size":75372,"type":"directory"},{"path":"examples/physicalModeling/flute.dsp","name":"flute.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fluteMIDI.dsp","name":"fluteMIDI.dsp","size":279,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/frenchBell.dsp","name":"frenchBell.dsp","size":249,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/germanBell.dsp","name":"germanBell.dsp","size":249,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/guitarMIDI.dsp","name":"guitarMIDI.dsp","size":258,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/karplus.dsp","name":"karplus.dsp","size":288,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/marimbaMIDI.dsp","name":"marimbaMIDI.dsp","size":336,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/modularInterpInstrMIDI.dsp","name":"modularInterpInstrMIDI.dsp","size":310,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/nylonGuitarMIDI.dsp","name":"nylonGuitarMIDI.dsp","size":268,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/russianBell.dsp","name":"russianBell.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/standardBell.dsp","name":"standardBell.dsp","size":255,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/violin.dsp","name":"violin.dsp","size":268,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/violinMIDI.dsp","name":"violinMIDI.dsp","size":257,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalBP.dsp","name":"vocalBP.dsp","size":258,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalBPMIDI.dsp","name":"vocalBPMIDI.dsp","size":286,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalFOF.dsp","name":"vocalFOF.dsp","size":233,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalFOFMIDI.dsp","name":"vocalFOFMIDI.dsp","size":261,"extension":".dsp","type":"file"}],"size":82116,"type":"directory"},{"path":"examples/pitchShifting","name":"pitchShifting","children":[{"path":"examples/pitchShifting/pitchShifter.dsp","name":"pitchShifter.dsp","size":559,"extension":".dsp","type":"file"}],"size":559,"type":"directory"},{"path":"examples/psychoacoustic","name":"psychoacoustic","children":[{"path":"examples/psychoacoustic/harmonicExciter.dsp","name":"harmonicExciter.dsp","size":379,"extension":".dsp","type":"file"}],"size":379,"type":"directory"},{"path":"examples/reverb","name":"reverb","children":[{"path":"examples/reverb/dattorro.dsp","name":"dattorro.dsp","size":189,"extension":".dsp","type":"file"},{"path":"examples/reverb/fdnRev.dsp","name":"fdnRev.dsp","size":200,"extension":".dsp","type":"file"},{"path":"examples/reverb/freeverb.dsp","name":"freeverb.dsp","size":173,"extension":".dsp","type":"file"},{"path":"examples/reverb/greyhole.dsp","name":"greyhole.dsp","size":177,"extension":".dsp","type":"file"},{"path":"examples/reverb/jprev.dsp","name":"jprev.dsp","size":168,"extension":".dsp","type":"file"},{"path":"examples/reverb/reverbDesigner.dsp","name":"reverbDesigner.dsp","size":307,"extension":".dsp","type":"file"},{"path":"examples/reverb/reverbTester.dsp","name":"reverbTester.dsp","size":205,"extension":".dsp","type":"file"},{"path":"examples/reverb/zitaRev.dsp","name":"zitaRev.dsp","size":239,"extension":".dsp","type":"file"},{"path":"examples/reverb/zitaRevFDN.dsp","name":"zitaRevFDN.dsp","size":217,"extension":".dsp","type":"file"}],"size":1875,"type":"directory"},{"path":"examples/smartKeyboard","name":"smartKeyboard","children":[{"path":"examples/smartKeyboard/acGuitar.dsp","name":"acGuitar.dsp","size":3902,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects","name":"associatedEffects","children":[{"path":"examples/smartKeyboard/associatedEffects/elecGuitarEffect.dsp","name":"elecGuitarEffect.dsp","size":186,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects/myEffect.dsp","name":"myEffect.dsp","size":89,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects/reverb.dsp","name":"reverb.dsp","size":89,"extension":".dsp","type":"file"}],"size":364,"type":"directory"},{"path":"examples/smartKeyboard/bells.dsp","name":"bells.dsp","size":3002,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/bowed.dsp","name":"bowed.dsp","size":3130,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/brass.dsp","name":"brass.dsp","size":3151,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/clarinet.dsp","name":"clarinet.dsp","size":5188,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/crazyGuiro.dsp","name":"crazyGuiro.dsp","size":3916,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/drums.dsp","name":"drums.dsp","size":2550,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/dubDub.dsp","name":"dubDub.dsp","size":3264,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/elecGuitar.dsp","name":"elecGuitar.dsp","size":2516,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/fm.dsp","name":"fm.dsp","size":2974,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/frog.dsp","name":"frog.dsp","size":2868,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/harp.dsp","name":"harp.dsp","size":3329,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/midiOnly.dsp","name":"midiOnly.dsp","size":2458,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/multiSynth.dsp","name":"multiSynth.dsp","size":2550,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/toy.dsp","name":"toy.dsp","size":2823,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/trumpet.dsp","name":"trumpet.dsp","size":1922,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/turenas.dsp","name":"turenas.dsp","size":4268,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/violin.dsp","name":"violin.dsp","size":3439,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/violin2.dsp","name":"violin2.dsp","size":3017,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/vocal.dsp","name":"vocal.dsp","size":1384,"extension":".dsp","type":"file"}],"size":62015,"type":"directory"},{"path":"examples/spat","name":"spat","children":[{"path":"examples/spat/panpot.dsp","name":"panpot.dsp","size":392,"extension":".dsp","type":"file"},{"path":"examples/spat/spat.dsp","name":"spat.dsp","size":695,"extension":".dsp","type":"file"}],"size":1087,"type":"directory"}],"size":1789875,"type":"directory"} \ No newline at end of file +{"path":"./src/static/examples","name":"examples","children":[{"path":"examples/LIBRARIES","name":"LIBRARIES","children":[{"path":"examples/LIBRARIES/aanl.lib","name":"aanl.lib","size":27890,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/all.lib","name":"all.lib","size":1016,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/analyzers.lib","name":"analyzers.lib","size":37932,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/basics.lib","name":"basics.lib","size":93372,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/compressors.lib","name":"compressors.lib","size":67156,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/delays.lib","name":"delays.lib","size":15135,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/demos.lib","name":"demos.lib","size":79693,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/dx7.lib","name":"dx7.lib","size":69129,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/envelopes.lib","name":"envelopes.lib","size":21947,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/fds.lib","name":"fds.lib","size":20561,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/filters.lib","name":"filters.lib","size":115542,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/hoa.lib","name":"hoa.lib","size":42801,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/instruments.lib","name":"instruments.lib","size":9397,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/interpolators.lib","name":"interpolators.lib","size":25109,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/maths.lib","name":"maths.lib","size":34331,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/maxmsp.lib","name":"maxmsp.lib","size":8176,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/mi.lib","name":"mi.lib","size":17282,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/misceffects.lib","name":"misceffects.lib","size":37726,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/noises.lib","name":"noises.lib","size":16090,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/oscillators.lib","name":"oscillators.lib","size":60457,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/phaflangers.lib","name":"phaflangers.lib","size":10026,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/physmodels.lib","name":"physmodels.lib","size":171474,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/platform.lib","name":"platform.lib","size":3513,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/quantizers.lib","name":"quantizers.lib","size":9857,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/reducemaps.lib","name":"reducemaps.lib","size":9170,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/reverbs.lib","name":"reverbs.lib","size":40816,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/routes.lib","name":"routes.lib","size":8567,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/sf.lib","name":"sf.lib","size":1066,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/signals.lib","name":"signals.lib","size":19181,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/soundfiles.lib","name":"soundfiles.lib","size":9363,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/spats.lib","name":"spats.lib","size":6001,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/stdfaust.lib","name":"stdfaust.lib","size":1270,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/synths.lib","name":"synths.lib","size":11361,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/tonestacks.lib","name":"tonestacks.lib","size":12356,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/tubes.lib","name":"tubes.lib","size":349815,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/vaeffects.lib","name":"vaeffects.lib","size":36059,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/version.lib","name":"version.lib","size":910,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/wdmodels.lib","name":"wdmodels.lib","size":89953,"extension":".lib","type":"file"},{"path":"examples/LIBRARIES/webaudio.lib","name":"webaudio.lib","size":12121,"extension":".lib","type":"file"}],"size":1603621,"type":"directory"},{"path":"examples/ambisonics","name":"ambisonics","children":[{"path":"examples/ambisonics/fourSourcesToOcto.dsp","name":"fourSourcesToOcto.dsp","size":981,"extension":".dsp","type":"file"},{"path":"examples/ambisonics/oneSourceToStereo.dsp","name":"oneSourceToStereo.dsp","size":404,"extension":".dsp","type":"file"}],"size":1385,"type":"directory"},{"path":"examples/analysis","name":"analysis","children":[{"path":"examples/analysis/FFT.dsp","name":"FFT.dsp","size":874,"extension":".dsp","type":"file"},{"path":"examples/analysis/dbmeter.dsp","name":"dbmeter.dsp","size":628,"extension":".dsp","type":"file"},{"path":"examples/analysis/spectralLevel.dsp","name":"spectralLevel.dsp","size":233,"extension":".dsp","type":"file"},{"path":"examples/analysis/spectralTiltLab.dsp","name":"spectralTiltLab.dsp","size":668,"extension":".dsp","type":"file"},{"path":"examples/analysis/vumeter.dsp","name":"vumeter.dsp","size":545,"extension":".dsp","type":"file"}],"size":2948,"type":"directory"},{"path":"examples/bela","name":"bela","children":[{"path":"examples/bela/AdditiveSynth.dsp","name":"AdditiveSynth.dsp","size":1462,"extension":".dsp","type":"file"},{"path":"examples/bela/AdditiveSynth_Analog.dsp","name":"AdditiveSynth_Analog.dsp","size":1525,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2.dsp","name":"FMSynth2.dsp","size":1956,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_Analog.dsp","name":"FMSynth2_Analog.dsp","size":1873,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_FX.dsp","name":"FMSynth2_FX.dsp","size":4569,"extension":".dsp","type":"file"},{"path":"examples/bela/FMSynth2_FX_Analog.dsp","name":"FMSynth2_FX_Analog.dsp","size":4683,"extension":".dsp","type":"file"},{"path":"examples/bela/FXChaine2.dsp","name":"FXChaine2.dsp","size":5513,"extension":".dsp","type":"file"},{"path":"examples/bela/Faust-complement.lib","name":"Faust-complement.lib","size":2032,"extension":".lib","type":"file"},{"path":"examples/bela/GrainGenerator.dsp","name":"GrainGenerator.dsp","size":3631,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth.dsp","name":"WaveSynth.dsp","size":2230,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_Analog.dsp","name":"WaveSynth_Analog.dsp","size":2345,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_FX.dsp","name":"WaveSynth_FX.dsp","size":4895,"extension":".dsp","type":"file"},{"path":"examples/bela/WaveSynth_FX_Analog.dsp","name":"WaveSynth_FX_Analog.dsp","size":5084,"extension":".dsp","type":"file"},{"path":"examples/bela/crossDelay2.dsp","name":"crossDelay2.dsp","size":2314,"extension":".dsp","type":"file"},{"path":"examples/bela/granulator.dsp","name":"granulator.dsp","size":2429,"extension":".dsp","type":"file"},{"path":"examples/bela/repeater.dsp","name":"repeater.dsp","size":2315,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleFX.dsp","name":"simpleFX.dsp","size":2434,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleFX_Analog.dsp","name":"simpleFX_Analog.dsp","size":2582,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth.dsp","name":"simpleSynth.dsp","size":2562,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_Analog.dsp","name":"simpleSynth_Analog.dsp","size":2596,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_FX.dsp","name":"simpleSynth_FX.dsp","size":5153,"extension":".dsp","type":"file"},{"path":"examples/bela/simpleSynth_FX_Analog.dsp","name":"simpleSynth_FX_Analog.dsp","size":5350,"extension":".dsp","type":"file"}],"size":69533,"type":"directory"},{"path":"examples/delayEcho","name":"delayEcho","children":[{"path":"examples/delayEcho/echo.dsp","name":"echo.dsp","size":462,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/quadEcho.dsp","name":"quadEcho.dsp","size":561,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/smoothDelay.dsp","name":"smoothDelay.dsp","size":825,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/stereoEcho.dsp","name":"stereoEcho.dsp","size":491,"extension":".dsp","type":"file"},{"path":"examples/delayEcho/tapiir.dsp","name":"tapiir.dsp","size":1263,"extension":".dsp","type":"file"}],"size":3602,"type":"directory"},{"path":"examples/dynamic","name":"dynamic","children":[{"path":"examples/dynamic/compressor.dsp","name":"compressor.dsp","size":194,"extension":".dsp","type":"file"},{"path":"examples/dynamic/distortion.dsp","name":"distortion.dsp","size":192,"extension":".dsp","type":"file"},{"path":"examples/dynamic/gateCompressor.dsp","name":"gateCompressor.dsp","size":333,"extension":".dsp","type":"file"},{"path":"examples/dynamic/noiseGate.dsp","name":"noiseGate.dsp","size":182,"extension":".dsp","type":"file"},{"path":"examples/dynamic/volume.dsp","name":"volume.dsp","size":376,"extension":".dsp","type":"file"}],"size":1277,"type":"directory"},{"path":"examples/filtering","name":"filtering","children":[{"path":"examples/filtering/APF.dsp","name":"APF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/BPF.dsp","name":"BPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/DNN.dsp","name":"DNN.dsp","size":806,"extension":".dsp","type":"file"},{"path":"examples/filtering/HPF.dsp","name":"HPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/LPF.dsp","name":"LPF.dsp","size":337,"extension":".dsp","type":"file"},{"path":"examples/filtering/bandFilter.dsp","name":"bandFilter.dsp","size":1314,"extension":".dsp","type":"file"},{"path":"examples/filtering/cryBaby.dsp","name":"cryBaby.dsp","size":156,"extension":".dsp","type":"file"},{"path":"examples/filtering/diodeLadder.dsp","name":"diodeLadder.dsp","size":381,"extension":".dsp","type":"file"},{"path":"examples/filtering/filterBank.dsp","name":"filterBank.dsp","size":177,"extension":".dsp","type":"file"},{"path":"examples/filtering/graphicEqLab.dsp","name":"graphicEqLab.dsp","size":354,"extension":".dsp","type":"file"},{"path":"examples/filtering/highShelf.dsp","name":"highShelf.dsp","size":349,"extension":".dsp","type":"file"},{"path":"examples/filtering/korg35HPF.dsp","name":"korg35HPF.dsp","size":379,"extension":".dsp","type":"file"},{"path":"examples/filtering/korg35LPF.dsp","name":"korg35LPF.dsp","size":379,"extension":".dsp","type":"file"},{"path":"examples/filtering/lfBoost.dsp","name":"lfBoost.dsp","size":1348,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowBoost.dsp","name":"lowBoost.dsp","size":1478,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowCut.dsp","name":"lowCut.dsp","size":1453,"extension":".dsp","type":"file"},{"path":"examples/filtering/lowShelf.dsp","name":"lowShelf.dsp","size":347,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogHalfLadder.dsp","name":"moogHalfLadder.dsp","size":390,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogLadder.dsp","name":"moogLadder.dsp","size":378,"extension":".dsp","type":"file"},{"path":"examples/filtering/moogVCF.dsp","name":"moogVCF.dsp","size":153,"extension":".dsp","type":"file"},{"path":"examples/filtering/multibandFilter.dsp","name":"multibandFilter.dsp","size":561,"extension":".dsp","type":"file"},{"path":"examples/filtering/notch.dsp","name":"notch.dsp","size":341,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheim.dsp","name":"oberheim.dsp","size":457,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimBPF.dsp","name":"oberheimBPF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimBSF.dsp","name":"oberheimBSF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimHPF.dsp","name":"oberheimHPF.dsp","size":397,"extension":".dsp","type":"file"},{"path":"examples/filtering/oberheimLPF.dsp","name":"oberheimLPF.dsp","size":396,"extension":".dsp","type":"file"},{"path":"examples/filtering/parametricEqLab.dsp","name":"parametricEqLab.dsp","size":437,"extension":".dsp","type":"file"},{"path":"examples/filtering/parametricEqualizer.dsp","name":"parametricEqualizer.dsp","size":185,"extension":".dsp","type":"file"},{"path":"examples/filtering/peakNotch.dsp","name":"peakNotch.dsp","size":350,"extension":".dsp","type":"file"},{"path":"examples/filtering/peakingEQ.dsp","name":"peakingEQ.dsp","size":349,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrder.dsp","name":"sallenKey2ndOrder.dsp","size":481,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderBPF.dsp","name":"sallenKey2ndOrderBPF.dsp","size":430,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderHPF.dsp","name":"sallenKey2ndOrderHPF.dsp","size":429,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKey2ndOrderLPF.dsp","name":"sallenKey2ndOrderLPF.dsp","size":429,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePole.dsp","name":"sallenKeyOnePole.dsp","size":444,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePoleHPF.dsp","name":"sallenKeyOnePoleHPF.dsp","size":390,"extension":".dsp","type":"file"},{"path":"examples/filtering/sallenKeyOnePoleLPF.dsp","name":"sallenKeyOnePoleLPF.dsp","size":389,"extension":".dsp","type":"file"},{"path":"examples/filtering/spectralTilt.dsp","name":"spectralTilt.dsp","size":191,"extension":".dsp","type":"file"},{"path":"examples/filtering/vcfWahLab.dsp","name":"vcfWahLab.dsp","size":504,"extension":".dsp","type":"file"},{"path":"examples/filtering/vocoder.dsp","name":"vocoder.dsp","size":226,"extension":".dsp","type":"file"},{"path":"examples/filtering/wahPedal.dsp","name":"wahPedal.dsp","size":163,"extension":".dsp","type":"file"}],"size":19533,"type":"directory"},{"path":"examples/gameaudio","name":"gameaudio","children":[{"path":"examples/gameaudio/bubble.dsp","name":"bubble.dsp","size":1037,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/complex_rain.dsp","name":"complex_rain.dsp","size":2402,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/door.dsp","name":"door.dsp","size":1892,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/fire.dsp","name":"fire.dsp","size":1312,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/insects.dsp","name":"insects.dsp","size":4953,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/rain.dsp","name":"rain.dsp","size":622,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/thunder.dsp","name":"thunder.dsp","size":2469,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/wind.dsp","name":"wind.dsp","size":551,"extension":".dsp","type":"file"},{"path":"examples/gameaudio/windchimes.dsp","name":"windchimes.dsp","size":5319,"extension":".dsp","type":"file"}],"size":20557,"type":"directory"},{"path":"examples/generator","name":"generator","children":[{"path":"examples/generator/churchOrgan.dsp","name":"churchOrgan.dsp","size":1272,"extension":".dsp","type":"file"},{"path":"examples/generator/filterOsc.dsp","name":"filterOsc.dsp","size":213,"extension":".dsp","type":"file"},{"path":"examples/generator/noise.dsp","name":"noise.dsp","size":1813,"extension":".dsp","type":"file"},{"path":"examples/generator/noiseMetadata.dsp","name":"noiseMetadata.dsp","size":2356,"extension":".dsp","type":"file"},{"path":"examples/generator/osc.dsp","name":"osc.dsp","size":471,"extension":".dsp","type":"file"},{"path":"examples/generator/osci.dsp","name":"osci.dsp","size":505,"extension":".dsp","type":"file"},{"path":"examples/generator/sawtoothLab.dsp","name":"sawtoothLab.dsp","size":239,"extension":".dsp","type":"file"},{"path":"examples/generator/virtualAnalog.dsp","name":"virtualAnalog.dsp","size":228,"extension":".dsp","type":"file"},{"path":"examples/generator/virtualAnalogLab.dsp","name":"virtualAnalogLab.dsp","size":268,"extension":".dsp","type":"file"}],"size":7365,"type":"directory"},{"path":"examples/misc","name":"misc","children":[{"path":"examples/misc/UITester.dsp","name":"UITester.dsp","size":2158,"extension":".dsp","type":"file"},{"path":"examples/misc/autopan.dsp","name":"autopan.dsp","size":2292,"extension":".dsp","type":"file"},{"path":"examples/misc/capture.dsp","name":"capture.dsp","size":802,"extension":".dsp","type":"file"},{"path":"examples/misc/drumkit.dsp","name":"drumkit.dsp","size":1307,"extension":".dsp","type":"file"},{"path":"examples/misc/guitarix.dsp","name":"guitarix.dsp","size":8986,"extension":".dsp","type":"file"},{"path":"examples/misc/matrix.dsp","name":"matrix.dsp","size":551,"extension":".dsp","type":"file"},{"path":"examples/misc/midiTester.dsp","name":"midiTester.dsp","size":7986,"extension":".dsp","type":"file"},{"path":"examples/misc/mixer.dsp","name":"mixer.dsp","size":667,"extension":".dsp","type":"file"},{"path":"examples/misc/statespace.dsp","name":"statespace.dsp","size":1356,"extension":".dsp","type":"file"},{"path":"examples/misc/switcher.dsp","name":"switcher.dsp","size":564,"extension":".dsp","type":"file"},{"path":"examples/misc/tester.dsp","name":"tester.dsp","size":1082,"extension":".dsp","type":"file"},{"path":"examples/misc/tester2.dsp","name":"tester2.dsp","size":1189,"extension":".dsp","type":"file"}],"size":28940,"type":"directory"},{"path":"examples/phasing","name":"phasing","children":[{"path":"examples/phasing/flanger.dsp","name":"flanger.dsp","size":188,"extension":".dsp","type":"file"},{"path":"examples/phasing/phaser.dsp","name":"phaser.dsp","size":184,"extension":".dsp","type":"file"},{"path":"examples/phasing/phaserFlangerLab.dsp","name":"phaserFlangerLab.dsp","size":395,"extension":".dsp","type":"file"}],"size":767,"type":"directory"},{"path":"examples/physicalModeling","name":"physicalModeling","children":[{"path":"examples/physicalModeling/brass.dsp","name":"brass.dsp","size":263,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/brassMIDI.dsp","name":"brassMIDI.dsp","size":290,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/churchBell.dsp","name":"churchBell.dsp","size":244,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/clarinet.dsp","name":"clarinet.dsp","size":261,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/clarinetMIDI.dsp","name":"clarinetMIDI.dsp","size":288,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/djembeMIDI.dsp","name":"djembeMIDI.dsp","size":257,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/elecGuitarMIDI.dsp","name":"elecGuitarMIDI.dsp","size":330,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/englishBell.dsp","name":"englishBell.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/flute.dsp","name":"flute.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/fluteMIDI.dsp","name":"fluteMIDI.dsp","size":279,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/frenchBell.dsp","name":"frenchBell.dsp","size":249,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/germanBell.dsp","name":"germanBell.dsp","size":249,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/guitarMIDI.dsp","name":"guitarMIDI.dsp","size":258,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/karplus.dsp","name":"karplus.dsp","size":288,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/marimbaMIDI.dsp","name":"marimbaMIDI.dsp","size":336,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/modularInterpInstrMIDI.dsp","name":"modularInterpInstrMIDI.dsp","size":310,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/nylonGuitarMIDI.dsp","name":"nylonGuitarMIDI.dsp","size":268,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/russianBell.dsp","name":"russianBell.dsp","size":252,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/standardBell.dsp","name":"standardBell.dsp","size":255,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/violin.dsp","name":"violin.dsp","size":268,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/violinMIDI.dsp","name":"violinMIDI.dsp","size":257,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalBP.dsp","name":"vocalBP.dsp","size":258,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalBPMIDI.dsp","name":"vocalBPMIDI.dsp","size":286,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalFOF.dsp","name":"vocalFOF.dsp","size":233,"extension":".dsp","type":"file"},{"path":"examples/physicalModeling/vocalFOFMIDI.dsp","name":"vocalFOFMIDI.dsp","size":261,"extension":".dsp","type":"file"}],"size":6744,"type":"directory"},{"path":"examples/pitchShifting","name":"pitchShifting","children":[{"path":"examples/pitchShifting/pitchShifter.dsp","name":"pitchShifter.dsp","size":559,"extension":".dsp","type":"file"}],"size":559,"type":"directory"},{"path":"examples/psychoacoustic","name":"psychoacoustic","children":[{"path":"examples/psychoacoustic/harmonicExciter.dsp","name":"harmonicExciter.dsp","size":379,"extension":".dsp","type":"file"}],"size":379,"type":"directory"},{"path":"examples/reverb","name":"reverb","children":[{"path":"examples/reverb/dattorro.dsp","name":"dattorro.dsp","size":189,"extension":".dsp","type":"file"},{"path":"examples/reverb/fdnRev.dsp","name":"fdnRev.dsp","size":200,"extension":".dsp","type":"file"},{"path":"examples/reverb/freeverb.dsp","name":"freeverb.dsp","size":173,"extension":".dsp","type":"file"},{"path":"examples/reverb/greyhole.dsp","name":"greyhole.dsp","size":177,"extension":".dsp","type":"file"},{"path":"examples/reverb/jprev.dsp","name":"jprev.dsp","size":168,"extension":".dsp","type":"file"},{"path":"examples/reverb/reverbDesigner.dsp","name":"reverbDesigner.dsp","size":307,"extension":".dsp","type":"file"},{"path":"examples/reverb/reverbTester.dsp","name":"reverbTester.dsp","size":205,"extension":".dsp","type":"file"},{"path":"examples/reverb/vital_rev.dsp","name":"vital_rev.dsp","size":182,"extension":".dsp","type":"file"},{"path":"examples/reverb/zitaRev.dsp","name":"zitaRev.dsp","size":239,"extension":".dsp","type":"file"},{"path":"examples/reverb/zitaRevFDN.dsp","name":"zitaRevFDN.dsp","size":217,"extension":".dsp","type":"file"}],"size":2057,"type":"directory"},{"path":"examples/smartKeyboard","name":"smartKeyboard","children":[{"path":"examples/smartKeyboard/acGuitar.dsp","name":"acGuitar.dsp","size":3902,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects","name":"associatedEffects","children":[{"path":"examples/smartKeyboard/associatedEffects/elecGuitarEffect.dsp","name":"elecGuitarEffect.dsp","size":186,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects/myEffect.dsp","name":"myEffect.dsp","size":89,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/associatedEffects/reverb.dsp","name":"reverb.dsp","size":89,"extension":".dsp","type":"file"}],"size":364,"type":"directory"},{"path":"examples/smartKeyboard/bells.dsp","name":"bells.dsp","size":3002,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/bowed.dsp","name":"bowed.dsp","size":3130,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/brass.dsp","name":"brass.dsp","size":3151,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/clarinet.dsp","name":"clarinet.dsp","size":5188,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/crazyGuiro.dsp","name":"crazyGuiro.dsp","size":3916,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/drums.dsp","name":"drums.dsp","size":2550,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/dubDub.dsp","name":"dubDub.dsp","size":3264,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/elecGuitar.dsp","name":"elecGuitar.dsp","size":2516,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/fm.dsp","name":"fm.dsp","size":2974,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/frog.dsp","name":"frog.dsp","size":2868,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/harp.dsp","name":"harp.dsp","size":3329,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/midiOnly.dsp","name":"midiOnly.dsp","size":2458,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/multiSynth.dsp","name":"multiSynth.dsp","size":2550,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/toy.dsp","name":"toy.dsp","size":2823,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/trumpet.dsp","name":"trumpet.dsp","size":1922,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/turenas.dsp","name":"turenas.dsp","size":4268,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/violin.dsp","name":"violin.dsp","size":3439,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/violin2.dsp","name":"violin2.dsp","size":3017,"extension":".dsp","type":"file"},{"path":"examples/smartKeyboard/vocal.dsp","name":"vocal.dsp","size":1384,"extension":".dsp","type":"file"}],"size":62015,"type":"directory"},{"path":"examples/spat","name":"spat","children":[{"path":"examples/spat/panpot.dsp","name":"panpot.dsp","size":392,"extension":".dsp","type":"file"},{"path":"examples/spat/spat.dsp","name":"spat.dsp","size":695,"extension":".dsp","type":"file"}],"size":1087,"type":"directory"}],"size":1832369,"type":"directory"} diff --git a/src/static/examples/LIBRARIES/aanl.lib b/src/static/examples/LIBRARIES/aanl.lib index 9b3f3a45..2186fc02 100644 --- a/src/static/examples/LIBRARIES/aanl.lib +++ b/src/static/examples/LIBRARIES/aanl.lib @@ -33,14 +33,16 @@ // // #### References // * -// * +// * Reducing the Aliasing in Nonlinear Waveshaping Using Continuous-time Convolution, +// Julian Parker, Vadim Zavalishin, Efflam Le Bivic, DAFX, 2016 +// * //######################################################################################## ba = library("basics.lib"); ma = library("maths.lib"); declare name "Faust Antialiased Nonlinearities"; -declare version "0.3"; +declare version "1.3.0"; //==============================Auxiliary Functions======================================= //======================================================================================== diff --git a/src/static/examples/LIBRARIES/analyzers.lib b/src/static/examples/LIBRARIES/analyzers.lib index cb79fd2a..3497820e 100644 --- a/src/static/examples/LIBRARIES/analyzers.lib +++ b/src/static/examples/LIBRARIES/analyzers.lib @@ -13,7 +13,7 @@ fi = library("filters.lib"); an = library("analyzers.lib"); // for compatible copy/paste out of this file declare name "Faust Analyzer Library"; -declare version "0.2"; +declare version "1.2.0"; /************************************************************************ FAUST library file, jos section @@ -54,8 +54,8 @@ abs_envelope_rect(period, x) = abs(x) : fi.avg_rect(period); //------------------`(an.)abs_envelope_tau`------------------------------------ -// Absolute value average with one-pole lowpass and tau response. -// (See filters.lib.) +// Absolute value average with one-pole lowpass and tau response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -76,8 +76,8 @@ abs_envelope_tau(period, x) = abs(x) : fi.avg_tau(period); //------------------`(an.)abs_envelope_t60`------------------------------------ -// Absolute value average with one-pole lowpass and t60 response. -// (See filters.lib.) +// Absolute value average with one-pole lowpass and t60 response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -98,8 +98,8 @@ abs_envelope_t60(period, x) = abs(x) : fi.avg_t60(period); //------------------`(an.)abs_envelope_t19`------------------------------------ -// Absolute value average with one-pole lowpass and t19 response. -// (See filters.lib.) +// Absolute value average with one-pole lowpass and t19 response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -222,8 +222,8 @@ ms_envelope_rect(period, x) = x * x : fi.avg_rect(period); //------------------`(an.)ms_envelope_tau`------------------------------------- -// Mean square average with one-pole lowpass and tau response. -// (see `filters.lib`) +// Mean square average with one-pole lowpass and tau response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -244,8 +244,8 @@ ms_envelope_tau(period, x) = x * x : fi.avg_tau(period); //------------------`(an.)ms_envelope_t60`------------------------------------- -// Mean square with one-pole lowpass and t60 response. -// (see `filters.lib`) +// Mean square with one-pole lowpass and t60 response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -266,8 +266,8 @@ ms_envelope_t60(period, x) = x * x : fi.avg_t60(period); //------------------`(an.)ms_envelope_t19`------------------------------------- -// Mean square with one-pole lowpass and t19 response. -// (see `filters.lib`) +// Mean square with one-pole lowpass and t19 response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -309,8 +309,8 @@ rms_envelope_rect(period, x) = ms_envelope_rect(period, x) : sqrt; //------------------`(an.)rms_envelope_tau`------------------------------------ -// Root mean square with one-pole lowpass and tau response. -// (see `filters.lib`) +// Root mean square with one-pole lowpass and tau response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -331,8 +331,8 @@ rms_envelope_tau(period, x) = ms_envelope_tau(period, x) : sqrt; //------------------`(an.)rms_envelope_t60`------------------------------------ -// Root mean square with one-pole lowpass and t60 response. -// (see `filters.lib`) +// Root mean square with one-pole lowpass and t60 response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -353,8 +353,8 @@ rms_envelope_t60(period, x) = ms_envelope_t60(period, x) : sqrt; //------------------`(an.)rms_envelope_t19`------------------------------------ -// Root mean square with one-pole lowpass and t19 response. -// (see `filters.lib`) +// Root mean square with one-pole lowpass and t19 response +// (see [filters.lib](https://faustlibraries.grame.fr/libs/filters/)). // // #### Usage // @@ -400,9 +400,8 @@ declare zcr license "MIT-style STK-4.3 license"; zcr(period, x) = ma.zc(x) : fi.lptau(period); -//============================================================================== -// Adaptive Frequency Analysis -//============================================================================== +//==============================Adaptive Frequency Analysis=============================== +//======================================================================================== //--------------------`(an.)pitchTracker`--------------------------------------- // @@ -418,7 +417,7 @@ zcr(period, x) = ma.zc(x) : fi.lptau(period); // // Where: // -// * `N`: compile-time constant, sets the order of the low-pass filter, which +// * `N`: a constant numerical expression, sets the order of the low-pass filter, which // determines the sensitivity of the algorithm for signals where partials are // stronger than the fundamental frequency. // * `tau`: response time in seconds based on exponentially-weighted averaging with tau time-constant. See . @@ -484,9 +483,9 @@ spectralCentroid(nonlinearity, t, x) = loop ~ _ 'y = (x - s) * G + s; 's = 2 * (x - s) * G + s; } - with { - G = tan(w(cf) / 2.0) / (1.0 + tan(w(cf) / 2.0)); - }; + with { + G = tan(w(cf) / 2.0) / (1.0 + tan(w(cf) / 2.0)); + }; highpass(cf, x) = x - lowpass(cf, x); xRMS = an.rms_envelope_tau(t, x); xLRMS = an.rms_envelope_tau(t, lowpass(fb, x)); @@ -559,7 +558,7 @@ spectralCentroid(nonlinearity, t, x) = loop ~ _ // // Where: // -// * `O`: order of filter used to split each frequency band into two +// * `O`: (odd) order of filter used to split each frequency band into two // * `M`: number of band-slices per octave // * `ftop`: highest band-split crossover frequency (e.g., 20 kHz) // * `N`: total number of bands (including dc and Nyquist) @@ -589,7 +588,7 @@ mth_octave_analyzer_default = mth_octave_analyzer6e; // default analyzer //============================Mth-Octave Spectral Level=================================== -// Spectral Level: Display (in bar graphs) the average signal level in each spectral band. +// Spectral Level: display (in bargraphs) the average signal level in each spectral band. //======================================================================================== diff --git a/src/static/examples/LIBRARIES/basics.lib b/src/static/examples/LIBRARIES/basics.lib index 1a964637..31165779 100644 --- a/src/static/examples/LIBRARIES/basics.lib +++ b/src/static/examples/LIBRARIES/basics.lib @@ -58,7 +58,7 @@ it = library("interpolators.lib"); si = library("signals.lib"); declare name "Faust Basic Element Library"; -declare version "0.9"; +declare version "1.18.0"; //=============================Conversion Tools=========================================== //======================================================================================== @@ -98,7 +98,7 @@ sec2samp(d) = d*ma.SR; //-------`(ba.)db2linear`---------- -// Converts a loudness in dB to a linear gain (0-1). +// dB-to-linear value converter. It can be used to convert an amplitude in dB to a linear gain ]0-N]. // `db2linear` is a standard Faust function. // // #### Usage @@ -109,13 +109,13 @@ sec2samp(d) = d*ma.SR; // // Where: // -// * `l`: loudness in dB +// * `l`: amplitude in dB //----------------------------- db2linear(l) = pow(10.0, l/20.0); //-------`(ba.)linear2db`---------- -// Converts a linear gain (0-1) to a loudness in dB. +// linea-to-dB value converter. It can be used to convert a linear gain ]0-N] to an amplitude in dB. // `linear2db` is a standard Faust function. // // #### Usage @@ -452,7 +452,7 @@ time = (+(1)~_) - 1; //-------`(ba.)ramp`---------- -// A linear ramp with a slope of '(+/-)1/n' samples to reach the next value. +// A linear ramp with a slope of '(+/-)1/n' samples to reach the next target value. // // #### Usage // @@ -470,9 +470,11 @@ ramp = case { //-------`(ba.)line`---------- -// A linear ramp to reach a next value in 'n' samples. -// Note that the interpolation process is restarted every time -// the desired output value changes, the interpolation time is sampled only then. +// A ramp interpolator that generates a linear transition to reach a target value: +// +// - the interpolation process restarts each time a new and distinct input value is received +// - it utilizes 'n' samples to achieve the transition to the target value +// - after reaching the target value, the output value is maintained. // // #### Usage // @@ -481,7 +483,7 @@ ramp = case { // ``` // Where: // -// * `n`: number of samples to reach the next value +// * `n`: number of samples to reach the new target received at its input //------------------------ line(n, x) = state ~ (_,_) : !,_ with { @@ -526,6 +528,29 @@ tempo(t) = (60*ma.SR)/t; period(p) = %(int(p))~+(1'); +//-------`(ba.)spulse`---------- +// Produces a single pulse of n samples when trig goes from 0 to 1. +// +// #### Usage +// +// ``` +// spulse(n,trig) : _ +// ``` +// +// Where: +// +// * `n`: pulse length as a number of samples +// * `trig`: the trigger signal (1: start the pulse) +//------------------------ +spulse(n, trig) = trig : trigger(n) +with { + upfront(x) = x > x'; // detect rising edge + reset = upfront(trig); // reset signal + decay(n, x) = ba.if(reset, 0, x - (x>0.0)/n); // decay the pulse, possibly using reset to restart the pulse + release(n) = + ~ decay(n); + trigger(n) = upfront : release(n) : >(0.0); +}; + //-------`(ba.)pulse`---------- // Pulses (like 10000) generated at period `p`. // @@ -661,7 +686,7 @@ with { //----------------------------`(ba.)pulse_countdown_loop`---------------------------- // Starts counting down pulses from 0 to n included. While trig is 1 the output // is counting down, while trig is 0 the counter is reset to 0. At the end -// of the countdown(n) the output value will be reset to 0. +// of the countdown (n) the output value will be reset to 0. // // #### Usage // @@ -778,7 +803,7 @@ subseq(head, 0, N) = head; // so that the computation at runtime can be faster than directly using the function. // Two techniques are implemented: // -// * `tabulate` computes the function in a table and read the points using interpolation +// * `tabulate` computes the function in a table and read the points using interpolation. `tabulateNd` is the N dimensions version of `tabulate` // // * `tabulate_chebychev` uses Chebyshev polynomial approximation // @@ -800,7 +825,8 @@ subseq(head, 0, N) = head; // line(n, x0, x1) = x0 + (ba.time%n)/n * (x1-x0); // }; // ``` -// + + //-------`(ba.)tabulate`---------- // Tabulate a 1D function over the range [r0, r1] for access via nearest-value, linear, cubic interpolation. // In other words, the uniformly tabulated function can be evaluated using interpolation of order 0 (none), 1 (linear), or 3 (cubic). @@ -853,7 +879,7 @@ tabulate(C, FX, S, r0, r1, x) = environment { rid(x, 1) = max(0, min(x, mid)); // Tabulate an unary 'FX' function on a range [r0, r1] - val = y0 with { y0 = rdtable(S, wf, rid(int(id), C)); }; + val = y0 with { y0 = rdtable(S, wf, rid(int(id+0.5), C)); }; // Tabulate an unary 'FX' function over the range [r0, r1] with linear interpolation lin = it.interpolate_linear(d,y0,y1) @@ -950,6 +976,547 @@ declare tabulate_chebychev copyright "Copyright (C) 2022 Oleg Nesterov _) + with { + // the truth table of which step size to use is a binary counting table + // so we use a variant on a function I wrote for slidingReduce + switch(i,j) = _*int2bin(j,i,nrReadIndexes); + }; + // since each interpolator has 2 inputs + nrReadIndexes = pow(2,N); + }; + + cub = + // same as .lin so far + parameters + : (par(i, N, int),si.bus(N*3)) + <: (ids,tables(nrReadIndexes,readIndexes)) + :mixers(1,nrReadIndexes) + with { + readIndexes = + si.bus(nParams) <: + ((stepSizes:ro.cross(N)) + , readIndex(sizesIds)) + // calculate the offsets for each interpolation read index and add them to the "base" readindex + :cubifiers; + // since each interpolator has 4 inputs + nrReadIndexes = pow(4,N); + // calculate the offsets and add them to the "base" readindex + // we do this by creating a tree, where each branch has 4 sub-branches + // there are N splits, so we end up with nrReadIndexes "leaves" + cubifiers = + // iterate trough the dimensions, each feeding into the next + seq(i, N, + si.bus(N-i-1),cubifier(pow(4,i))); + // take a step size and ``len`` input indexes and create 4*len output indexes + // offset the input index(es) with the amount needed for that dimension + cubifier(len) = + ((_<:si.bus(len*4)) + , (si.bus(len)<:si.bus(len*4))) + : ro.interleave(len*4,2) + :par(i, 4, + par(j, len, off(i)+_)) + with { + // the hardcoded numbers are the same offsets as in ``ba.tabulate`` + // but they get multiplied by the step size of the current dimension + off(0,stepSize) = -1*stepSize; + off(1,stepSize) = 0; + off(2,stepSize) = 1*stepSize; + off(3,stepSize) = 2*stepSize; + }; + }; + + // how many parameters have we been given? + nParams = outputs(parameters); + // the number of dimensions + N = int(nParams/4); + // the values we read from the tables + tables(nrReadIndexes,readIndexes) = + si.bus(nParams)<: + // table size, waveform, read index for each table + ((tableSize<:si.bus(nrReadIndexes)) + , (wf<:si.bus(nrReadIndexes)) + , readIndexes) + :ro.interleave(nrReadIndexes,3) + // the actual tables + :par(i, nrReadIndexes, rdtable); + + // the interpolators + mixers(linCub,nrReadIndexes)= + (ro.cross(N),si.bus(nrReadIndexes)) + : seq(i, N, mixer(linCub,i)); + + // the interpolator for a single dimension + // linear version + mixer(0,i) = + mixerUniversal(i,2,(_,!,_),it.interpolate_linear) ; + // cubic version + mixer(1,i) = + mixerUniversal(i,4,(_,!,_,!,_,!,_),it.interpolate_cubic) ; + + // i is the current dimension + // mult is the number of inputs of each interpolator + // sieve tells us which outputs to let trough and which to block, more on this soon + mixerUniversal(i,mult,sieve,it) = + // bypass the weights needed for the next dimension + si.bus(N-i-1), + // split our own weight + // in the end we need one weight per interpolator + // but since we need to interleave these with nrInterpolators*mult read values, we split it into as many busses as we have read values + (((_<:si.bus(nrInterpolators(i)*mult)) + // the read values bypass this step + , (si.bus(nrInterpolators(i)*mult))) + // interleave the weights with the read values + : ro.interleave(nrInterpolators(i)*mult,2) + // the actual interpolators + : par(i, nrInterpolators(i), + // take the id and turn it into the weight for this dimension + ((_<:(_-int(_))) + // throw away the extra weights we created for the interleave + ,sieve) + // a single interpolator + :it)) + with { + // the number of interpolators for this dimension + nrInterpolators(i) = pow(mult,N-i-1); + }; + + // total size of the table: s(0) * s(1) ... * s(N-2) * s(N-1) + // N in, 1 out + size(1) = _; + size(N) = _*size(N-1); + tableSize = size(N),par(i, N*3, !); + // the size of a step for each dimension. + // the first is 1, the second is the size of the first dimension times one + // the third is the second number, times the size of the second dimension + stepSizes = + (int(1),si.bus(N-1),par(i, 3*N+1, !)) + : seq(i, N-1, + ((si.bus(i),(_<:(_,_)), si.bus(N-i-1)) + :(si.bus(i+1),*,si.bus(N-i-2)))); + // Prepare the 'float' table read index for one parameter + id(sizeX,r0,r1,x) = (x-r0)/(r1-r0)*(sizeX-1); + // Prepare the 'float' table read index for all parameters + ids = + ro.interleave(N,4) + : par(i, N, id) ; + + // one waveform parameter write value: + wfp(prevSize,sizeX,r0,r1) = + r0+ + ((float(int(ba.time%(prevSize*sizeX)/prevSize))*(r1-r0)) + /float(sizeX-1)) + ,(prevSize*sizeX); + + // all waveform parameters write values: + wfps = + ro.interleave(N,3) + : (1,si.bus(3*N)) + : seq(i, N, si.bus(i),wfp, si.bus(3*N-(3*(i+1)))) + : (si.bus(N),!); + + // Create the table + wf = (wfps,par(i, N, !)):function; + + // Limit the table read index in [0, mid] if C = 1 + // we do this both for the total table and per dimension + rid(x,mid, 0) = int(x); + rid(x,mid, 1) = max(int(0), min(int(x), mid)); + + // for ``.val`` this is the stored value closest to the point of interest + // for ``.lin`` and ``cub`` it's the closest stored value at or below the point of interest + readIndex(sizesIds) = + // table sizes and ids for each dimension + sizesIds + // get the raw read index + : ri + // limit it and make it an int + : riPost ; + // helper function to route the arguments of rid + riPost(size,ri) = + rid(ri,size-int(1),C); + // the raw read index + ri = + // interleave the sizes and the ids + ro.interleave(N,2) + // the first iteration gets: + // 1 as the size of the previous dimension and 0 as the read index of the previous dimension + : (1,0 + // pass trough the sizes and ids + ,si.bus(2*N)) + // for each dimension + : seq(i, N, + // get the step size and the partial index for the next dimension + riN + // pass trough the sizes and ids for the next dimensions + , si.bus(2*(N-i-1))) ; + + // get the step size and the partial index for the next dimension + riN(prevSize,prevIX,sizeX,idX) = + // each step size is the previous step size times the current + (prevSize*sizeX) + // but the step we actually take in this dimension is the stepsize we calculated in the previous dimension + , ( (prevSize* + // round down and limit the id for this dimension to get the number of steps + rid(int(idX),(sizeX-int(1)),C)) + // add the result of that to the one we calculated in the previous dimension + +prevIX) ; + + // table sizes and ids for each dimension + // just a helper function to simplify routing + sizesIds = + ( + // from sizes + ( bs<:si.bus(N*2) ) + // from r0s,r1s,xs + , si.bus(N*3) + ) : + // from sizes + (si.bus(N) + // takes (midX,r0,r1,x) + ,ids); + + // the value of a single bit when binary counting + int2bin(i,n,maxN) = int(int((n)/(1<"; +declare tabulateNd license "AGPL-3.0"; + //============================Selectors (Conditions)====================================== //======================================================================================== @@ -971,6 +1538,83 @@ declare tabulate_chebychev license "MIT-style STK-4.3 license"; if(cond,then,else) = select2(cond,else,then); // TODO: perhaps it would make more sense to have an if(a,b) and an ifelse(a,b,c)? +//-----------------------------`(ba.)ifNc`-------------------------------------- +// if-then-elseif-then-...elsif-then-else implemented on top of `ba.if`. +// +// #### Usage +// +// ``` +// ifNc((cond1,then1, cond2,then2, ... condN,thenN, else)) : _ +// or +// ifNc(Nc, cond1,then1, cond2,then2, ... condN,thenN, else) : _ +// or +// cond1,then1, cond2,then2, ... condN,thenN, else : ifNc(Nc) : _ +// ``` +// +// Where: +// +// * `Nc` : number of branches/conditions (constant numerical expression) +// * `condX`: condition +// * `thenX`: signal selected if condX is the 1st true condition +// * `else`: signal selected if all the cond1-condN conditions are false +// +// #### Example test program +// +// ``` +// process(x,y) = ifNc((xy,+1, 0)); +// or +// process(x,y) = ifNc(2, xy,+1, 0); +// or +// process(x,y) = xy,+1, 0 : ifNc(2); +// ``` +// +// outputs `-1` if `xy`, `0` otherwise. +//----------------------------------------------------------------------------- +ifNc((c,r)) = c,r : ifNc(outputs(r)/2); +ifNc(1) = if; +ifNc(n) = _,_,ifNc(n-1) : ifNc(1); + +declare ifNc author "Oleg Nesterov"; +declare ifNc copyright "Copyright (C) 2023 Oleg Nesterov "; +declare ifNc license "MIT-style STK-4.3 license"; + +//-----------------------------`(ba.)ifNcNo`------------------------------------- +// `ifNcNo(Nc,No)` is similar to `ifNc(Nc)` above but then/else branches have `No` outputs. +// +// #### Usage +// +// ``` +// ifNcNo(Nc,No, cond1,then1, cond2,then2, ... condN,thenN, else) : sig.bus(No) +// ``` +// +// Where: +// +// * `Nc` : number of branches/conditions (constant numerical expression) +// * `No` : number of outputs (constant numerical expression) +// * `condX`: condition +// * `thenX`: list of No signals selected if condX is the 1st true condition +// * `else`: list of No signals selected if all the cond1-condN conditions are false +// +// #### Example test program +// +// ``` +// process(x) = ifNcNo(2,3, x<0, -1,-1,-1, x>0, 1,1,1, 0,0,0); +// ``` +// +// outputs `-1,-1,-1` if `x<0`, `1,1,1` if `x>0`, `0,0,0` otherwise. +//----------------------------------------------------------------------------- +ifNcNo(Nc,No) = si.bus(Ni) <: par(no,No, slice(no) : ifNc(Nc)) +with { + Ni = Nc*No + Nc+No; + slice(no) = route(Ni,2*Nc+1, (par(nc,Nc, ct(nc,no)),else(no))); + ct(nc,no) = nc*(No+1)+1, 2*nc+1, // cond[nc] + nc*(No+1)+2+no, 2*nc+2; // then[nc][no] + else(no) = Nc*(No+1)+1+no, 2*Nc+1; // else[no] +}; + +declare ifNcNo author "Oleg Nesterov"; +declare ifNcNo copyright "Copyright (C) 2023 Oleg Nesterov "; +declare ifNcNo license "MIT-style STK-4.3 license"; //-----------------------------`(ba.)selector`--------------------------------- // Selects the ith input among n at compile time. @@ -987,7 +1631,7 @@ if(cond,then,else) = select2(cond,else,then); // * `I`: input to select (int, numbered from 0, known at compile time) // * `N`: number of inputs (int, known at compile time, N > I) // -// There is also cselector for selecting among complex input signals of the form (real,imag). +// There is also `cselector` for selecting among complex input signals of the form (real,imag). // //----------------------------------------------------------------------------- selector(i,n) = par(j, n, S(i, j)) with { S(i,i) = _; S(i,j) = !; }; @@ -1054,6 +1698,29 @@ with { }; +//----------------------`(ba.)selectbus`----------------------------------------- +// Select a bus among `NUM_BUSES` buses, where each bus has `BUS_SIZE` outputs. +// The order of the signal inputs should be the signals of the first bus, the +// signals of the second bus, and so on. +// +// #### Usage +// +// ``` +// process = si.bus(BUS_SIZE*NUM_BUSES) : selectbus(BUS_SIZE, NUM_BUSES, i) : si.bus(BUS_SIZE); +// ``` +// +// Where: +// +// * `BUS_SIZE`: The number of outputs from each bus (int, known at compile time). +// * `NUM_BUSES`: The number of buses (int, known at compile time). +// * `i`: The index of the bus to select (int, `0<=i1 means over-compression) +//------------------------------------------------------------ + +declare strength2ratio author "Bart Brouns"; +declare strength2ratio license "GPLv3"; + +strength2ratio(strength) = 1/(1-strength); //=============================Functions Reference======================================== //======================================================================================== @@ -69,7 +127,7 @@ declare version "0.4"; // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector // @@ -125,10 +183,10 @@ with { // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `N`: the number of channels of the compressor, known at compile time // // It uses a strength parameter instead of the traditional ratio, in order to be able to @@ -185,10 +243,10 @@ peak_compression_gain_N_chan_db(strength,thresh,att,rel,knee,prePost,link,N) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `meter`: a gain reduction meter. It can be implemented like so: // `meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;` // * `N`: the number of channels of the compressor, known at compile time @@ -238,11 +296,11 @@ FFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector // * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `meter`: a gain reduction meter. It can be implemented like so: +// * `meter`: a gain reduction meter. It can be implemented with: // `meter = _ <: (_,(ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;` // or it can be omitted by defining `meter = _;`. // * `N`: the number of channels of the compressor, known at compile time @@ -292,11 +350,11 @@ FBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `FBFF`: fade between feed forward (0) and feed back (1) compression. +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `FBFF`: fade between feed forward (0) and feed back (1) compression // * `meter`: a gain reduction meter. It can be implemented like so: // `meter = _<:(_,(max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;` // * `N`: the number of channels of the compressor, known at compile time @@ -350,7 +408,7 @@ FBFFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector // @@ -408,10 +466,10 @@ RMS_compression_gain_mono_db(strength,thresh,att,rel,knee,prePost) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `N`: the number of channels of the compressor // // It uses a strength parameter instead of the traditional ratio, in order to be able to @@ -445,7 +503,7 @@ RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,prePost,link,N) = //--------------------`(co.)RMS_FBFFcompressor_N_chan`------------------- // RMS feed forward / feed back N channels dynamic range compressor. -// the feedback part has a much higher strength, so they end up sounding similar +// The feedback part has a much higher strength, so they end up sounding similar. // `RMS_FBFFcompressor_N_chan` is a standard Faust function. // // #### Usage @@ -463,12 +521,12 @@ RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,prePost,link,N) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `FBFF`: fade between feed forward (0) and feed back (1) compression. -// * `meter`: a gain reduction meter. It can be implemented like so: +// * `meter`: a gain reduction meter. It can be implemented with: // `meter = _<:(_,(max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;` // * `N`: the number of channels of the compressor, known at compile time // @@ -482,7 +540,7 @@ RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,prePost,link,N) = // // To save CPU we cheat a bit, in a similar way as in the original libs: // instead of crosfading between two sets of gain calculators as above, -// we take the abs of the audio from both the FF and FB, and crossfade between those, +// we take the `abs` of the audio from both the FF and FB, and crossfade between those, // and feed that into one set of gain calculators // again the strength is much higher when in FB mode, but implemented differently. // @@ -533,12 +591,12 @@ RMS_FBFFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // the limiter uses a knee half this size -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction -// * `meter`: compressor gain reduction meter. It can be implemented like so: +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `meter`: compressor gain reduction meter. It can be implemented with: // `meter = _<:(_,(max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;` -// * `meterLim`: brickwall limiter gain reduction meter. It can be implemented like so: +// * `meterLim`: brickwall limiter gain reduction meter. It can be implemented with: // `meterLim = _<:(_,(max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;` // * `N`: the number of channels of the compressor, known at compile time // @@ -564,7 +622,7 @@ declare RMS_FBcompressor_peak_limiter_N_chan author "Bart Brouns"; declare RMS_FBcompressor_peak_limiter_N_chan license "GPLv3"; RMS_FBcompressor_peak_limiter_N_chan(strength,thresh,threshLim,att,rel,knee,link,meter,meterLim,N) = - (((RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,0,link,N)),si.bus(N)) : ro.interleave(N,2) : par(i,N,(meter : ba.db2linear)*_) : FFcompressor_N_chan(1,threshLim,0,att:min(rel),knee*0.5,0,link,meterLim : ba.db2linear,N)) + (((RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,0,link,N)),si.bus(N)) : ro.interleave(N,2) : par(i,N,(meter : ba.db2linear)*_) : FFcompressor_N_chan(1,threshLim,0,att:min(rel),knee*0.5,0,link,meterLim,N)) ~ si.bus(N); @@ -592,7 +650,7 @@ RMS_FBcompressor_peak_limiter_N_chan(strength,thresh,threshLim,att,rel,knee,link // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector // @@ -640,10 +698,10 @@ peak_compression_gain_mono(strength,thresh,att,rel,knee,prePost) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `N`: the number of channels of the compressor, known at compile time // // It uses a strength parameter instead of the traditional ratio, in order to be able to @@ -692,7 +750,7 @@ peak_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector // @@ -740,10 +798,10 @@ RMS_compression_gain_mono(strength,thresh,att,rel,knee,prePost) = // * `knee`: a gradual increase in gain reduction around the threshold: // below thresh-(knee/2) there is no gain reduction, // above thresh+(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `N`: the number of channels of the compressor, known at compile time // // It uses a strength parameter instead of the traditional ratio, in order to be able to @@ -791,10 +849,10 @@ RMS_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) = // Where: // // * `lad`: lookahead delay in seconds (nonnegative) - gets rounded to nearest sample. -// The effective attack time is a good setting. +// The effective attack time is a good setting // * `ratio`: compression ratio (1 = no compression, >1 means compression) // Ratios: 4 is moderate compression, 8 is strong compression, -// 12 is mild limiting, and 20 is pretty hard limiting at the threshold. +// 12 is mild limiting, and 20 is pretty hard limiting at the threshold // * `thresh`: dB level threshold above which compression kicks in (0 dB = max level) // * `att`: attack time = time constant (sec) when level & compression are going up // * `rel`: release time = time constant (sec) coming out of compression @@ -827,7 +885,7 @@ compressor_lad_mono(lad,ratio,thresh,att,rel,x) // // * `ratio`: compression ratio (1 = no compression, >1 means compression) // Ratios: 4 is moderate compression, 8 is strong compression, -// 12 is mild limiting, and 20 is pretty hard limiting at the threshold. +// 12 is mild limiting, and 20 is pretty hard limiting at the threshold // * `thresh`: dB level threshold above which compression kicks in (0 dB = max level) // * `att`: attack time = time constant (sec) when level & compression are going up // * `rel`: release time = time constant (sec) coming out of compression @@ -925,19 +983,19 @@ with { // to get you started using compressors as limiters, so all // parameters are hardwired here to nominal values. // -// Ratio: 4 (moderate compression) +// `ratio`: 4 (moderate compression). // See `compressor_mono` comments for a guide to other choices. // Mike Shipley likes this (lowest) setting on the 1176. // (Grammy award-winning mixer for Queen, Tom Petty, etc.). // -// Thresh: -6 dB, meaning 4:1 compression begins at amplitude 1/2. +// `thresh`: -6 dB, meaning 4:1 compression begins at amplitude 1/2. // -// Att: 800 MICROseconds (Note: scaled by ratio in the 1176) +// `att`: 800 MICROseconds (Note: scaled by ratio in the 1176) // The 1176 range is said to be 20-800 microseconds. // Faster attack gives "more bite" (e.g. on vocals), // and makes hard-clipping less likely on fast overloads. // -// Rel: 0.5 s (Note: scaled by ratio in the 1176) +// `rel`: 0.5 s (Note: scaled by ratio in the 1176) // The 1176 range is said to be 50-1100 ms. // // The 1176 also has a "bright, clear eq effect" (use filters.lib if desired). @@ -959,21 +1017,22 @@ declare limiter_1176_R4_mono copyright declare limiter_1176_R4_mono license "MIT-style STK-4.3 license"; limiter_1176_R4_mono = compressor_mono(4,-6,0.0008,0.5); + //-------------------`(co.)limiter_1176_R4_stereo`--------------------- // A limiter guards against hard-clipping. It can be // implemented as a compressor having a high threshold (near the // clipping level), fast attack and release, and high ratio. Since // the ratio is so high, some knee smoothing is // desirable ("soft limiting"). This example is intended -// to get you started using compressor_* as a limiter, so all +// to get you started using `compressor_*` as a limiter, so all // parameters are hardwired to nominal values here. // -// Ratios: 4 (moderate compression), 8 (severe compression), +// `ratio`: 4 (moderate compression), 8 (severe compression), // 12 (mild limiting), or 20 to 1 (hard limiting). // -// Att: 20-800 MICROseconds (Note: scaled by ratio in the 1176). +// `att`: 20-800 MICROseconds (Note: scaled by ratio in the 1176). // -// Rel: 50-1100 ms (Note: scaled by ratio in the 1176). +// `rel`: 50-1100 ms (Note: scaled by ratio in the 1176). // // Mike Shipley likes 4:1 (Grammy-winning mixer for Queen, Tom Petty, etc.) // Faster attack gives "more bite" (e.g. on vocals). @@ -1020,10 +1079,10 @@ limiter_1176_R4_stereo = compressor_stereo(4,-6,0.0008,0.5); // * `knee`: a gradual increase in gain reduction around the threshold: // above thresh+(knee/2) there is no gain reduction, // below thresh-(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-range detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `maxHold`: the maximum hold time in samples, known at compile time // * `N`: the number of channels of the gain computer, known at compile time // @@ -1084,10 +1143,10 @@ with { // * `knee`: a gradual increase in gain reduction around the threshold: // above thresh+(knee/2) there is no gain reduction, // below thresh-(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-range detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `meter`: a gain reduction meter. It can be implemented like so: // `meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;` // * `maxHold`: the maximum hold time in samples, known at compile time @@ -1123,10 +1182,10 @@ expander_N_chan(strength,thresh,range,att,hold,rel,knee,prePost,link,meter,maxHo // * `knee`: a gradual increase in gain reduction around the threshold: // above thresh+(knee/2) there is no gain reduction, // below thresh-(knee/2) there is the same gain reduction as without a knee, -// and in between there is a gradual increase in gain reduction. +// and in between there is a gradual increase in gain reduction // * `prePost`: places the level detector either at the input or after the gain computer; // this turns it from a linear return-to-zero detector into a log domain return-to-range detector -// * `link`: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction +// * `link`: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction // * `meter`: a gain reduction meter. It can be implemented like so: // `meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;` // * `maxHold`: the maximum hold time in samples, known at compile time @@ -1160,9 +1219,9 @@ expanderSC_N_chan(strength,thresh,range,att,hold,rel,knee,prePost,link,meter,max // This version of the limiter uses a peak-holder with smoothed // attack and release based on tau time constant filters. // -// It is also possible to use a time constant that is 2PI*tau by dividing -// the attack and release times by 2PI. This time constant allows for -// the amplitude profile to reach 1 - e^(-2PI) of the final +// It is also possible to use a time constant that is `2PI*tau` by dividing +// the attack and release times by `2PI`. This time constant allows for +// the amplitude profile to reach `1 - e^(-2PI)` of the final // peak after the attack time. The input path can be delayed by the same // amount as the attack time to synchronise input and amplitude profile, // realising a system that is particularly effective as a colourless @@ -1193,12 +1252,12 @@ expanderSC_N_chan(strength,thresh,range,att,hold,rel,knee,prePost,link,meter,max // // Where: // -// * `N` is the number of channels, known at compile-time -// * `LD` is the lookahead delay in seconds, known at compile-time -// * `ceiling` is the linear amplitude output limit -// * `attack` is the attack time in seconds -// * `hold` is the hold time in seconds -// * `release` is the release time in seconds +// * `N`: is the number of channels, known at compile-time +// * `LD`: is the lookahead delay in seconds, known at compile-time +// * `ceiling`: is the linear amplitude output limit +// * `attack`: is the attack time in seconds +// * `hold`: is the hold time in seconds +// * `release`: is the release time in seconds // // Example for a stereo limiter: `limiter_lad_N(2, .01, 1, .01, .1, 1);` // @@ -1236,11 +1295,11 @@ limiter_lad_N(N, LD, ceiling, attack, hold, release) = // // Where: // -// * `LD` is the lookahead delay in seconds, known at compile-time -// * `ceiling` is the linear amplitude output limit -// * `attack` is the attack time in seconds -// * `hold` is the hold time in seconds -// * `release` is the release time in seconds +// * `LD`: is the lookahead delay in seconds, known at compile-time +// * `ceiling`: is the linear amplitude output limit +// * `attack`: is the attack time in seconds +// * `hold`: is the hold time in seconds +// * `release`: is the release time in seconds // // #### Reference: // @@ -1264,11 +1323,11 @@ limiter_lad_mono(LD) = limiter_lad_N(1, LD); // // Where: // -// * `LD` is the lookahead delay in seconds, known at compile-time -// * `ceiling` is the linear amplitude output limit -// * `attack` is the attack time in seconds -// * `hold` is the hold time in seconds -// * `release` is the release time in seconds +// * `LD`: is the lookahead delay in seconds, known at compile-time +// * `ceiling`: is the linear amplitude output limit +// * `attack`: is the attack time in seconds +// * `hold`: is the hold time in seconds +// * `release`: is the release time in seconds // // #### Reference: // @@ -1292,11 +1351,11 @@ limiter_lad_stereo(LD) = limiter_lad_N(2, LD); // // Where: // -// * `LD` is the lookahead delay in seconds, known at compile-time -// * `ceiling` is the linear amplitude output limit -// * `attack` is the attack time in seconds -// * `hold` is the hold time in seconds -// * `release` is the release time in seconds +// * `LD`: is the lookahead delay in seconds, known at compile-time +// * `ceiling`: is the linear amplitude output limit +// * `attack`: is the attack time in seconds +// * `hold`: is the hold time in seconds +// * `release`: is the release time in seconds // // #### Reference: // diff --git a/src/static/examples/LIBRARIES/delays.lib b/src/static/examples/LIBRARIES/delays.lib index 49a1a235..bdb19e4d 100644 --- a/src/static/examples/LIBRARIES/delays.lib +++ b/src/static/examples/LIBRARIES/delays.lib @@ -44,7 +44,7 @@ si = library("signals.lib"); fi = library("filters.lib"); declare name "Faust Delay Library"; -declare version "0.1"; +declare version "1.1.0"; //==================================Basic Delay Functions================================= //======================================================================================== @@ -101,7 +101,7 @@ fdelay(n,d,x) = delay(n+1,int(d),x)*(1 - ma.frac(d)) + delay(n+1,int(d)+1,x)*ma. // _ : sdelay(n,it,d) : _ // ``` // -// Where : +// Where: // // * `n`: the max delay length in samples // * `it`: interpolation time (in samples), for example 1024 @@ -167,7 +167,7 @@ with { }; -// ----------`(de.)prime_power_delays`----------- +//------------------`(de.)prime_power_delays`---------------- // Prime Power Delay Line Lengths. // // #### Usage diff --git a/src/static/examples/LIBRARIES/demos.lib b/src/static/examples/LIBRARIES/demos.lib index a3b481db..34449f0a 100644 --- a/src/static/examples/LIBRARIES/demos.lib +++ b/src/static/examples/LIBRARIES/demos.lib @@ -56,9 +56,12 @@ ve = library("vaeffects.lib"); pf = library("phaflangers.lib"); re = library("reverbs.lib"); en = library("envelopes.lib"); +it = library("interpolators.lib"); +aa = library("aanl.lib"); +sp = library("spats.lib"); declare name "Faust Demos Library"; -declare version "0.1"; +declare version "1.2.0"; //######################################################################################## /************************************************************************ @@ -323,7 +326,7 @@ with{ cbp = meter_group(checkbox("[0] Bypass [tooltip: When this is checked, the compressor has no effect]")); gainview = co.compression_gain_mono(ratio,threshold,attack,release) : ba.linear2db : - meter_group(hbargraph("[1] Compressor Gain [unit:dB] [tooltip: Current gain of + meter_group(hbargraph("[1] Compressor Gain Before Makeup [unit:dB] [tooltip: Current gain of the compressor in dB]",-50,+10)); displaygain = _,_ <: _,_,(abs,abs:+) : _,_,gainview : _,attach; @@ -556,6 +559,37 @@ with{ mdepth = select2(vibr,depth,2); // Improve "ease of use" }; +//-------------------------`(dm.)tapeStop_demo`--------------------------- +// Stereo tape-stop effect. +// +// #### Usage +// +// ``` +// _,_ : tapeStop_demo : _,_ +// ``` +//------------------------------------------------------------ +declare tapeStop_demo author "David Braun"; +declare tapeStop_demo copyright "Copyright (C) 2024 by David Braun "; +declare tapeStop_demo license "MIT-style STK-4.3 license"; + +tapeStop_demo = hgroup("Tape Stop", ef.tapeStop(2, LAGRANGE_ORDER, MAX_TIME_SAMP, crossfade, gainAlpha, stopAlpha, stopTime, stop)) +with { + LAGRANGE_ORDER = 3; + MAX_TIME_SEC = 4; + MIN_TIME_SEC = 0.01; + MIN_ALPHA = .01; + MAX_ALPHA = 2; + + MAX_TIME_SAMP = MAX_TIME_SEC : ba.sec2samp; + msec2samp = _/1000 : ba.sec2samp; + + stop = checkbox("[0] Stop"); + stopTime = hslider("[1] Stop Time [style:knob][unit:ms]", 100, MIN_TIME_SEC*1000, MAX_TIME_SEC*1000, 1) : msec2samp; + stopAlpha = hslider("[2] Stop Alpha [style:knob][tooltip:Alpha==1 represents a linear deceleration (constant force). Alpha<1 represents an initially weaker, then stronger force. Alpha>1 represents an initially stronger, then weaker force.]", 1, MIN_ALPHA, MAX_ALPHA, .01); + gainAlpha = hslider("[3] Gain Alpha [style:knob][tooltip:During the tape-stop, lower alpha stays louder longer]", 1, MIN_ALPHA, MAX_ALPHA, .01); + crossfade = hslider("[4] Crossfade [style:knob][unit:ms][tooltip:Crossfade to apply when resuming normal playback.]", 3, 0, 125, 1) : msec2samp; +}; + //======================================Reverbs=========================================== //======================================================================================== @@ -602,13 +636,15 @@ with{ // #### Usage // // ``` -// _ : stereo_reverb_tester : _ +// _,_ : stereo_reverb_tester(gui_group) : _,_ // ``` +// For suppressing the `gui_group` input, pass it as `!`. +// (See `(dm.)fdnrev0_demo` for an example of its use). //------------------------------------------------------------ declare stereo_reverb_tester author "Julius O. Smith III"; declare stereo_reverb_tester licence "MIT"; -stereo_reverb_tester(revin_group,x,y) = reverb_tester(_) +stereo_reverb_tester(revin_group,x,y) = reverb_tester(_,x,y) with { reverb_tester(revin_group,x,y) = inx,iny with { ck_group(x) = revin_group(vgroup("[1] Input Config",x)); @@ -888,8 +924,276 @@ with{ factor]", -20, -70, 40, 0.1)) : ba.db2linear : si.smoo; }; + +//----------------------------------`(dm.)vital_rev_demo`------------------------------ +// Example GUI for `vital_rev` with all parameters exposed. +// +// #### Usage +// +// ``` +// _,_ : vital_rev_demo : _,_ +// ``` +// +//------------------------------------------------------------ +vital_rev_demo = hgroup("Reverb", re.vital_rev(prelow, prehigh, lowcutoff, highcutoff, lowgain, highgain, chorus_amt, chorus_freq, predelay, time, size, mix)) +with { + // SMOO = _; + SMOO = si.smoo; // optionally turn on smoo of hsliders + + Prefilter(x) = hgroup("[0] Pre-filter", x:SMOO); + Filter(x) = hgroup("[1] Filter", x:SMOO); + Chorus(x) = hgroup("[2] Chorus", x:SMOO); + Space(x) = hgroup("[3] Space", x:SMOO); + + prelow = Prefilter(hslider("[0] Low Cutoff [style:knob]", it.remap(16,135,0,1,16), 0, 1, .01)); + prehigh = Prefilter(hslider("[1] High Cutoff [style:knob]", it.remap(16,135,0,1,110), 0, 1, .01)); + + lowcutoff = Filter(hslider("[0] Low Shelf [style:knob]", it.remap(16,135,0,1,16), 0, 1, .01)); + highcutoff = Filter(hslider("[2] High Shelf [style:knob]", it.remap(16,135,0,1,90), 0, 1, .01)); + + lowgain = Filter(hslider("[1] Low Gain [style:knob]", it.remap(-6,0,0,1,0), 0, 1, .01)); + highgain = Filter(hslider("[3] High Gain [style:knob]", it.remap(-6,0,0,1,-1), 0, 1, .01)); + + chorus_amt = Chorus(hslider("[0] Amount [style:knob]", .01, 0, 1, .01)); + chorus_freq = Chorus(hslider("[1] Rate [style:knob]", 0.1, 0, 1, .01)); + + predelay = Space(hslider("[0] Pre-Delay [style:knob]", 0, 0, 1, .01)); + time = Space(hslider("[1] Decay Time [style:knob]", 0.5, 0, 1, .01)); + size = Space(hslider("[2] Size [style:knob]", .5, 0, 1, .01)) : aa.clip(0, 1); + + mix = hslider("[4] Mix [style:knob]", 1, 0, 1, .01) : SMOO : aa.clip(0, 1); +}; +declare vital_rev_demo author "David Braun"; +declare vital_rev_demo license "GPL-3.0"; + + +//--------------------------`(dm.)reverbTank_demo`--------------------------- +// +// This is a stereo reverb following the "ReverbTank" example in [1], +// although some parameter ranges and scaling have been adjusted. +// It is an unofficial version of the Spin Semiconductor® Reverb. +// Other relevant instructional material can be found in [2-4]. +// +// #### Usage +// ``` +// _,_ : reverbTank_demo : _,_ +// ``` +// +// #### References +// * [1] Pirkle, W. C. (2019). Designing audio effect plugins in C++ (2nd ed.). Chapter 17.14. +// +// * [2] Spin Semiconductor. (n.d.). Reverberation. Retrieved 2024-04-16, from +// +// * [3] Zölzer, U. (2022). Digital audio signal processing (3rd ed.). Chapter 7, Figure 7.39. +// +// * [4] Valhalla DSP. (2010, August 25). RIP Keith Barr. Retrieved 2024-04-16, from +//----------------------------------------------------------------------- +reverbTank_demo = hgroup("Reverb", ef.dryWetMixer(wet, + (preDelay : preFilter : avg : ((si.bus(2) :> branches) ~ selectLastBranchDelay) : selectLR :> shelves) +)) +with { + /* + All-capitalized signals are compile-time constant. + All other signals can be modulated in real-time, although you may not necessarily want to modulate them. + */ + + // SMOO = _; // If you don't want to smooth parameters. + SMOO = si.smoo; + + PRE_DELAY_MAX_MSEC = 100; + OUTER_DELAY_MAX_MSEC = 100; + INNER_DELAY_MAX_MSEC = 100; + FIXED_DELAY_MAX_MSEC = 100; + + OUTER_DELAY_MAX_SAMPS = OUTER_DELAY_MAX_MSEC : msec2samp; + INNER_DELAY_MAX_SAMPS = INNER_DELAY_MAX_MSEC : msec2samp; + FIXED_DELAY_MAX_SAMPS = FIXED_DELAY_MAX_MSEC : msec2samp; + + enableLFO = 1; // set to zero if you don't want LFO, which is used for the chorus + LFO_MAX_MODULATION_MS = 0.3; + + outerG = 0.5; + innerG = -outerG; + lfoRates = 0.15, 0.33, 0.57, 0.73; // [NUM_BRANCHES]. Measured in Hz + + // Note that fixedDelayWeights and apfDelayWeights are not volume weights. + // They get multiplied by globalFixedMaxDelay and globalAPFMaxDelay respectively + // to current tap lengths (for the fixed delays) and current delays (for APF delays). + + // Note that if you turn `fixedDelayWeights` into something changing in real-time, + // then you need to remove an optimization related to `DELAY_MAX_SAMPS` in `multiTapDelay` + fixedDelayWeights = 1.0, 0.873, 0.707, 0.667; // [NUM_BRANCHES] + + // Thick mode: + TAPS_PER_BRANCH = 2; + tapPctsLeft = 23, 31, 41, 47, 59, 67, 73, 83; // [NUM_TAPS] + tapPctsRght = 29, 37, 43, 53, 61, 71, 79, 89; // [NUM_TAPS] + apfDelayWeights = 0.317, 0.873, 0.477, 0.291, 0.993, 0.757, 0.179, 0.575; // [NUM_TAPS] + + // Sparse mode: + // TAPS_PER_BRANCH = 1; + // tapPctsLeft = (23, 41, 59, 73); // [NUM_TAPS] + // tapPctsRght = (29, 43, 61, 79); // [NUM_TAPS] + // apfDelayWeights = 0.317, 0.873, 0.477, 0.291; // [NUM_TAPS] + + NUM_BRANCHES = 4; + NUM_TAPS = NUM_BRANCHES * TAPS_PER_BRANCH; + + PreUI(x) = hgroup("[0] Pre", x:SMOO); + DelayUI(x) = hgroup("[1] Delay", x:SMOO); + Filter(x) = hgroup("[2] Post-Filter", x:SMOO); + wet = hslider("[3] Wet [style:knob]", 1, 0, 1, .01) : SMOO; + + preDelayTime = PreUI(hslider("[0] Delay [style:knob][unit:ms]", 0, 0, PRE_DELAY_MAX_MSEC, 1)) : msec2samp; + preFilterCutoff = PreUI(hslider("[1] LPF Cutoff [style:knob][unit:KHz]", 16, 1, 20, .1))*1000; + + globalAPFMaxDelay = DelayUI(hslider("[0] APF Delay [style:knob][unit:ms]", 33*.85, 0, INNER_DELAY_MAX_MSEC, .01)) : msec2samp; + globalFixedMaxDelay = DelayUI(hslider("[1] Fixed Delay [style:knob][unit:ms]", 81.0, 0, OUTER_DELAY_MAX_MSEC, .01)) : msec2samp; + kRT = DelayUI(hslider("[2] Reverb Time [style:knob]", .5, 0, 1, .01)) : it.remap(0, 1, -72, -6) : ba.db2linear; + lfoDepth = DelayUI(hslider("[3] LFO Depth [style:knob][unit:ms]", LFO_MAX_MODULATION_MS*.1, 0, LFO_MAX_MODULATION_MS, .01)) : msec2samp; + lpfCutoff = DelayUI(hslider("[4] LPF Cutoff [style:knob][unit:KHz]", 15, 1, 20, .1))*1000; + + lowCutoffFrequency = Filter(hslider("[0] Low Shelf [style:knob][unit:midi]", 16, 16, 135, .1)) : aa.clip(16, 135) : ba.midikey2hz; + highCutoffFrequency = Filter(hslider("[2] High Shelf [style:knob][unit:midi]", 90, 16, 135, .1)) : aa.clip(16, 135) : ba.midikey2hz; + lowGain = Filter(hslider("[1] Low Gain [style:knob][unit:dB]", -20, -20, 20, .1)) : aa.clip(-20, 20); + highGain = Filter(hslider("[3] High Gain [style:knob][unit:dB]", -6, -20, 20, .1)) : aa.clip(-20, 20); + + msec2samp(ms) = ms*ma.SR/1000; + + // -------------`nestedDelayAPF`----------------- + // Nested Allpass Filter, as described in [1]. + // The user can pass an `outerDelay` function whose delay length + // is modulated by an LFO. The user can also put an LTI filter such + // as a low-pass filter on the outerDelay function. + // + // #### Usage + // ``` + // _ : nestedDelayAPF(outerDelay, MAXLEN, curDel, outerG, innerG) : _ + // ``` + // Where: + // * `outerDelay`: a delay function with one input and one output + // * `MAXLEN`: constant maximum delay in samples of the inner allpass filter + // * `curDel`: current delay in samples of the inner allpass filter + // * `outerG`: allpass minus-gain coefficient [-1..1] + // * `innerG`: allpass minus-gain coefficient [-1..1] + // + // #### References + // [1] Pirkle, W. C. (2019). Designing audio effect plugins in C++ (2nd ed.). Chapter 17.13.17. + //------------------------------------------------------------ + nestedDelayAPF(outerDelay, MAXLEN, curDel, outerG, innerG) = + (+ <: (innerAPF:outerDelay),*(outerG)) ~ *(-outerG) : mem,_ : + + with { + innerAPF = fi.allpass_fcomb(MAXLEN, curDel, innerG); + }; + + // inputs: + // * `i`: the branch index + // * `x`: input signal (sum of pre-delay and output of previous branch) + // + // outputs: + // * `i`: previous branch index plus 1 + // * `preBranchSig`: passthrough preBranchSig + // * Delayed value to be used for next branch + // * Sum of left channel tap(s) + // * Sum of right channel tap(s) + branch(i, x) = x : nestedAllpass : lpf : multiTapDelay + with { + nestedAllpass = nestedDelayAPF(outerDelay, INNER_DELAY_MAX_SAMPS, innerDelaySamps, outerG, innerG) + with { + outerDelay = lpf : de.fdelayltv(DELAY_ORDER, OUTER_DELAY_MAX_SAMPS, safeDelaySamps) // todo: is fdelayltv worth it? + with { + DELAY_ORDER = 2; + minDelaySamps = (DELAY_ORDER-1)/2; + delaySampsWithLFO = os.osc(lfoRate) : it.remap(-1, 1, outerDelaySamps, max(minDelaySamps, outerDelaySamps-lfoDepth)); + safeDelaySamps = ba.if(enableLFO, delaySampsWithLFO, outerDelaySamps) : max(minDelaySamps); + }; + outerDelaySamps = globalAPFMaxDelay*(ba.selectn(NUM_TAPS, i*2 , apfDelayWeights)); + innerDelaySamps = globalAPFMaxDelay*(ba.selectn(NUM_TAPS, i*2+1, apfDelayWeights)); + lfoRate = ba.selectn(NUM_BRANCHES, i, lfoRates); + }; + // note that the same LPF is used in two places (inside the nested APF and outside it but in the branch) + lpf = fi.lowpass(1, lpfCutoff); + + // Here we rely on Faust's compiler to only use one delay line! + multiTapDelay = _ <: delayLine(fixedDelaySamps)*kRT, getChannel(0), getChannel(1) + with { + // Note that we use fdelaylti instead of fdelayltv because we assume the delay lengths + // aren't being changed rapidly + delayLine(delaySamps) = de.fdelaylti(DELAY_ORDER, DELAY_MAX_SAMPS, safeDelaySamps) + with { + // If `fixedDelayWeights` is constant then we can use this memory optimization: + DELAY_MAX_SAMPS = OUTER_DELAY_MAX_SAMPS*fixedDelayWeight; + // Otherwise, we'd have to use this: + // DELAY_MAX_SAMPS = FIXED_DELAY_MAX_SAMPS; + + DELAY_ORDER = 2; + safeDelaySamps = max(delaySamps, (DELAY_ORDER-1)/2); + }; + + fixedDelayWeight = ba.selectn(NUM_BRANCHES, i, fixedDelayWeights); + fixedDelaySamps = globalFixedMaxDelay*fixedDelayWeight; + + getChannel(c) = sum(k, TAPS_PER_BRANCH, getTap(c, k)); + // Note that the tap positions scale with fixedDelaySamps rather than globalFixedMaxDelay or OUTER_DELAY_MAX_SAMPS + getTap(c, k) = delayLine(fixedDelaySamps*delayPct) * ((-1)^(i+c)) + with { + delayPct = tap_left, tap_rght : select2(c) : _/100 + with { + tap_left = ba.selectn(NUM_TAPS, i*TAPS_PER_BRANCH+k, tapPctsLeft); + tap_rght = ba.selectn(NUM_TAPS, i*TAPS_PER_BRANCH+k, tapPctsRght); + }; + }; + }; + }; + + repeatpar(1, FX) = FX; + repeatpar(n, FX) = FX <: (si.bus(iC), si.block(oC-iC):repeatpar(n-1, FX)), si.bus(oC) + with { + iC = inputs(FX); + oC = outputs(FX); + }; + + branches = (0, _, 0 : repeatpar(NUM_BRANCHES, fx)) : keepBranchChannels + with { + // inputs: + // * `i`: branch index, starting at 0 + // * `x`: the signal before all of the branches + // * `y`: the delayed signal from the previous branch, if any + // + // outputs: + // * increment `i` so that the next fx has i+1 in the same arg slot + // * passthrough `x` so it stays as the signal before all of the branches + // * the output(s) of the next branch, by passing `x+y` as input + fx(i, x, y) = i+1, x, branch(i, x+y); + + // For each branch, cut the integer `i` and `x` channels, but keep the remaining channels: + // * the local branch's "delayed" output + // * the left tap(s) + // * the right tap(s) + keepBranchChannels = par(b, NUM_BRANCHES, (!, !, si.bus(outputs(fx)-2))); + }; + + // use fdelaylti instead of fdelayltv because the user probably isn't changing the predelay quickly + preDelay = sp.stereoize(de.fdelaylti(DELAY_ORDER, preDelayMaxSamp, safeDelaySamps)) + with { + DELAY_ORDER = 1; + safeDelaySamps = max(preDelayTime, (DELAY_ORDER-1)/2); + preDelayMaxSamp = PRE_DELAY_MAX_MSEC : msec2samp; + }; + preFilter = sp.stereoize(fi.lowpass(1, preFilterCutoff)); + avg = _,_:> _*.5; + selectLastBranchDelay = ba.selector(0, 3*NUM_BRANCHES); + selectLR = par(i, NUM_BRANCHES, (!, _, _)); // for each branch, cut the "delayed" output and keep the left-right outputs + shelves = sp.stereoize(_/NUM_TAPS:(fi.lowshelf(1, lowGain, lowCutoffFrequency) : fi.highshelf(1, highGain, highCutoffFrequency))); +}; + +declare reverbTank_demo author "David Braun"; +declare reverbTank_demo copyright "Copyright (C) 2024 by David Braun "; +declare reverbTank_demo license "MIT-style STK-4.3 license"; + + //----------------------------------`(dm.)dattorro_rev_demo`------------------------------ -// Example GUI for `dattorro_rev` with all parameters exposed. With additional +// Example GUI for `dattorro_rev` with all parameters exposed and additional // dry/wet and output gain control. // // #### Usage @@ -946,9 +1250,9 @@ declare jprev_demo license "GPL2+"; jprev_demo = re.jpverb(t60, damp, size, early_diff, mod_depth, mod_freq, low, mid, high, low_cutoff, high_cutoff) with { rev_group(x) = vgroup("[0] JPrev",x); - + invSqrt2 = 1/sqrt(2); mix_group(x) = rev_group(hgroup("[0] Mix",x)); - early_diff = mix_group(hslider("[1]earlyDiff [style:knob]", 0.707, 0, 0.990, 0.001)); + early_diff = mix_group(hslider("[1]earlyDiff [style:knob]", invSqrt2, 0, 0.990, 0.001)); size = mix_group(hslider("[2]size [style:knob]", 1, 0.5, 3, 0.01)); t60 = mix_group(hslider("[3]t60 [style:knob]", 1, 0.1, 60, 0.1)); damp = mix_group(hslider("[4]damp [style:knob]", 0, 0, 0.999, 0.0001)); @@ -1531,7 +1835,7 @@ with{ gain = excitGroup(vslider("[1] Gain",0.5,0,1,0.01) : si.smoo); }; -//-----------------`(no.)colored_noise`-------------------- +//-----------------`(dm.)colored_noise_demo`-------------------- // A coloured noise signal generator. // // #### Usage diff --git a/src/static/examples/LIBRARIES/dx7.lib b/src/static/examples/LIBRARIES/dx7.lib index 9f4b6d33..7735b509 100644 --- a/src/static/examples/LIBRARIES/dx7.lib +++ b/src/static/examples/LIBRARIES/dx7.lib @@ -60,6 +60,8 @@ en = library("envelopes.lib"); ma = library("maths.lib"); os = library("oscillators.lib"); +declare version "1.1.0"; + //----------------------`(dx.)dx7_ampf`-------------------------- // DX7 amplitude conversion function. 3 versions of this function // are available: diff --git a/src/static/examples/LIBRARIES/envelopes.lib b/src/static/examples/LIBRARIES/envelopes.lib index 605be1a1..277c56fa 100644 --- a/src/static/examples/LIBRARIES/envelopes.lib +++ b/src/static/examples/LIBRARIES/envelopes.lib @@ -41,12 +41,14 @@ closed source license or any other license if you decide so. ************************************************************************ ************************************************************************/ +aa = library("aanl.lib"); ma = library("maths.lib"); ba = library("basics.lib"); si = library("signals.lib"); +it = library("interpolators.lib"); declare name "Faust Envelope Library"; -declare version "0.2"; +declare version "1.3.0"; declare author "GRAME"; declare copyright "GRAME"; declare license "LGPL with exception"; @@ -206,6 +208,257 @@ with { }; +adsr_bias_env = environment +{ + // In the functions below, we use the equation `y=bias_curve(b,x)`. + // `b`: bias between 0 and 1. Bias of 0.5 results in `y=x`. Bias above 0.5 pulls y upward. + // `x`: input between 0 and 1 that needs to be remapped/biased into `y` + // `y`: `x` after it has been biased. Note that `(y==0 iff x==0) AND (y==1 iff x==1)`. + bias_curve(b,x) = (x / ((((1.0/b) - 2.0)*(1.0 - x))+1.0)); + + // d/dx of bias_curve(b,x) + bias_curve_d_dx(b, x) = 0-(-1+b)*b/((1-x+b*(-1+2*x))^2); + + // Solve for x in y=bias_curve(b,x) + bias_curve_inverse(b,y) = (b-1)*y / (2*b*y-b-y); + + // We don't allow the bias to be too close to 0 or 1 because it leads to slopes too + // close to positive or negative infinity. + bias_clip = aa.clip(.03, .97); + + adsr_bias(att, dec, sus, rel, final, bias_att, bias_dec, bias_rel, legato, gate) = envelope + with { + ugate = gate>0; + + fb(_state, _y) = nextState, nextY + with { + // Legato control + onset = ba.impulsify(ugate); + state = select2(onset, _state, 0), _state : select2(legato); + + // two conditions in which we want to hard-reset the `y` to `final` + // instead of using the previous `_y`. + y = ba.if((onset & (legato<0.5)) | (ba.time==0), final, _y); + // note that if final is a constant zero then this could simply be + // y = ba.if(onset & (legato<0.5), 0, _y); + + // State 0: release + // State 1: attack + // State 2: decay + + y_at_release = ba.if(ba.time==0,1,y) : ba.latch(gate==0); + // note that if final is a constant zero then this could simply be + // y_at_release = y : ba.latch(gate==0); + + // Slope is a y-distance divided by a number of samples + att_slope = (1-final) / max(1,(att*ma.SR)); + dec_slope = (sus-1) / max(1,(dec*ma.SR)); + rel_slope = (final-y_at_release) / max(1,(rel*ma.SR)); + + // Get bias based on the state, then clip for safety. + b = bias_rel, bias_att, bias_dec : select3(state) : bias_clip; + + // We will remap from an input domain to [0..1] based on the current state. + from1 = ba.if(state==2, sus, final); + from2 = ba.if(state==0, y_at_release, 1); + + // Prevent divide-by-zero in it.remap + pct = it.remap(from1, from2, 0, 1, y), 0.5 : select2(from1==from2) : bias_curve_inverse(b); + + slope = rel_slope, att_slope, dec_slope : select3(state) : _*bias_curve_d_dx(b, pct); + + nextY = y + slope : aa.clip(from1, 1); + nextState = select2(ugate, + 0, + select3(state, + 1, + select2(y < 1.0, 2, 1), + 2 + ) + ); + }; + envelope = fb ~ (_,_) : !, _; + }; + + ahdsr_bias(att, hol, dec, sus, rel, final, bias_att, bias_dec, bias_rel, legato, gate) = envelope + with { + ugate = gate>0; + + fb(_state, _y) = nextState, nextY + with { + // Legato control + onset = ba.impulsify(ugate); + state = select2(onset, _state, 0), _state : select2(legato); + + // two conditions in which we want to hard-reset the `y` to `final` + // instead of using the previous `_y`. + y = ba.if((onset & (legato<0.5)) | (ba.time==0), final, _y); + // note that if final is a constant zero then this could simply be + // y = ba.if(onset & (legato<0.5), 0, _y); + + // State 0: release + // State 1: attack + // State 2: hold + // State 3: decay + + y_at_release = ba.if(ba.time==0,1,y) : ba.latch(gate==0); + // note that if final is a constant zero then this could simply be + // y_at_release = y : ba.latch(gate==0); + + // Slope is a y-distance divided by a number of samples + att_slope = (1-final) / max(1,(att*ma.SR)); + hold_slope = ba.if(gate, att_slope, rel_slope); + dec_slope = (sus-1) / max(1,(dec*ma.SR)); + rel_slope = (final-y_at_release) / max(1,(rel*ma.SR)); + + // Get bias based on the state, then clip for safety. + // Note that for the hold state, we choose a bias of 0.5 (the middle value). + b = bias_rel, bias_att, .5, bias_dec : ba.selectn(4, state) : bias_clip; + + from1 = ba.if(state==3, sus, final); + from2 = ba.if(state==0, y_at_release, 1); + + // Prevent divide-by-zero in it.remap + pct = it.remap(from1, from2, 0, 1, y), 0.5 : select2(from1==from2) : bias_curve_inverse(b); + + slope = rel_slope, att_slope, hold_slope, dec_slope : ba.selectn(4, state) : _*bias_curve_d_dx(b, pct); + + hold_time = ma.SR * hol; + hold_timer = ugate : +~(*(ugate * (state != 1))); + + nextY = y + slope : aa.clip(from1, 1); + nextState = select2(ugate, + 0, + ba.selectn(4, state, + 1, + select2(y < 1.0, 2, 1), + select2(hold_timer < hold_time, 3, 2), + 3 + ) + ); + }; + envelope = fb ~ (_,_) : !, _; + }; +}; + + +//------------------------`(en.)adsrf_bias`------------------------------ +// ADSR (Attack, Decay, Sustain, Release, Final) envelope generator with +// control over bias on each segment, and toggle for legato. +// +// #### Usage +// +// ``` +// adsrf_bias(at,dt,sl,rt,final,b_att,b_dec,b_rel,legato,t) : _ +// ``` +// +// Where: +// +// * `at`: attack time (sec) +// * `dt`: decay time (sec) +// * `sl`: sustain level (between 0..1) +// * `rt`: release time (sec) +// * `final`: final level (between 0..1) but less than or equal to `sl` +// * `b_att`: bias during attack (between 0..1) where 0.5 is no bias. +// * `b_dec`: bias during decay (between 0..1) where 0.5 is no bias. +// * `b_rel`: bias during release (between 0..1) where 0.5 is no bias. +// * `legato`: toggle for legato. If disabled, envelopes "re-trigger" from zero. +// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered +// when `t=0`) +//------------------------------------------------------------------------------- +declare adsrf_bias author "Andrew John March and David Braun"; +declare adsrf_bias licence "STK-4.3"; +adsrf_bias(att, dec, sus, rel, final, bias_att, bias_dec, bias_rel, legato, gate) = adsr_bias_env.adsr_bias(att, dec, sus, rel, final, bias_att, bias_dec, bias_rel, legato, gate); + + +//------------------------`(en.)adsr_bias`------------------------------ +// ADSR (Attack, Decay, Sustain, Release) envelope generator with +// control over bias on each segment, and toggle for legato. +// +// #### Usage +// +// ``` +// adsr_bias(at,dt,sl,rt,b_att,b_dec,b_rel,legato,t) : _ +// ``` +// +// Where: +// +// * `at`: attack time (sec) +// * `dt`: decay time (sec) +// * `sl`: sustain level (between 0..1) +// * `rt`: release time (sec) +// * `b_att`: bias during attack (between 0..1) where 0.5 is no bias. +// * `b_dec`: bias during decay (between 0..1) where 0.5 is no bias. +// * `b_rel`: bias during release (between 0..1) where 0.5 is no bias. +// * `legato`: toggle for legato. If disabled, envelopes "re-trigger" from zero. +// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered +// when `t=0`) +//------------------------------------------------------------------------------- +declare adsr_bias author "Andrew John March and David Braun"; +declare adsr_bias licence "STK-4.3"; +adsr_bias( att, dec, sus, rel, bias_att, bias_dec, bias_rel, legato, gate) = adsr_bias_env.adsr_bias(att, dec, sus, rel, 0, bias_att, bias_dec, bias_rel, legato, gate); + + +//------------------------`(en.)ahdsrf_bias`--------------------------- +// AHDSR (Attack, Hold, Decay, Sustain, Release, Final) envelope generator +// with control over bias on each segment, and toggle for legato. +// +// #### Usage +// +// ``` +// ahdsrf_bias(at,ht,dt,sl,rt,final,b_att,b_dec,b_rel,legato,t) : _ +// ``` +// +// Where: +// +// * `at`: attack time (sec) +// * `ht`: hold time (sec) +// * `dt`: decay time (sec) +// * `sl`: sustain level (between 0..1) +// * `rt`: release time (sec) +// * `final`: final level (between 0..1) but less than or equal to `sl` +// * `b_att`: bias during attack (between 0..1) where 0.5 is no bias. +// * `b_dec`: bias during decay (between 0..1) where 0.5 is no bias. +// * `b_rel`: bias during release (between 0..1) where 0.5 is no bias. +// * `legato`: toggle for legato. If disabled, envelopes "re-trigger" from zero. +// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered +// when `t=0`) +//--------------------------------------------------------------------- +declare ahdsrf_bias author "Andrew John March and David Braun"; +declare ahdsrf_bias licence "STK-4.3"; +ahdsrf_bias(att, hol, dec, sus, rel, final, bias_att, bias_dec, bias_rel, legato, gate) = adsr_bias_env.ahdsr_bias(att, hol, dec, sus, rel, final, bias_att, bias_dec, bias_rel, legato, gate); + + +//------------------------`(en.)ahdsr_bias`--------------------------- +// AHDSR (Attack, Hold, Decay, Sustain, Release) envelope generator +// with control over bias on each segment, and toggle for legato. +// +// #### Usage +// +// ``` +// ahdsr_bias(at,ht,dt,sl,rt,final,b_att,b_dec,b_rel,legato,t) : _ +// ``` +// +// Where: +// +// * `at`: attack time (sec) +// * `ht`: hold time (sec) +// * `dt`: decay time (sec) +// * `sl`: sustain level (between 0..1) +// * `rt`: release time (sec) +// * `final`: final level (between 0..1) but less than or equal to `sl` +// * `b_att`: bias during attack (between 0..1) where 0.5 is no bias. +// * `b_dec`: bias during decay (between 0..1) where 0.5 is no bias. +// * `b_rel`: bias during release (between 0..1) where 0.5 is no bias. +// * `legato`: toggle for legato. If disabled, envelopes "re-trigger" from zero. +// * `t`: trigger signal (attack is triggered when `t>0`, release is triggered +// when `t=0`) +//--------------------------------------------------------------------- +declare ahdsr_bias author "Andrew John March and David Braun"; +declare ahdsr_bias licence "STK-4.3"; +ahdsr_bias(att, hol, dec, sus, rel, bias_att, bias_dec, bias_rel, legato, gate) = adsr_bias_env.ahdsr_bias(att, hol, dec, sus, rel, 0, bias_att, bias_dec, bias_rel, legato, gate); + + //------------------------`(en.)smoothEnvelope`------------------------ // An envelope with an exponential attack and release. // `smoothEnvelope` is a standard Faust function. diff --git a/src/static/examples/LIBRARIES/fds.lib b/src/static/examples/LIBRARIES/fds.lib index cf0ce3a2..31b802dc 100644 --- a/src/static/examples/LIBRARIES/fds.lib +++ b/src/static/examples/LIBRARIES/fds.lib @@ -42,7 +42,7 @@ si = library("signals.lib"); ma = library("maths.lib"); declare name "Faust Finite Difference Schemes Library"; -declare version "0.0"; +declare version "1.1.0"; declare author "Riccardo Russo"; declare author "Romain Michon"; diff --git a/src/static/examples/LIBRARIES/filters.lib b/src/static/examples/LIBRARIES/filters.lib index 4726719f..fc8ba8f1 100644 --- a/src/static/examples/LIBRARIES/filters.lib +++ b/src/static/examples/LIBRARIES/filters.lib @@ -1,5 +1,5 @@ //##################################### filters.lib ######################################## -// Faust Filters library. Its official prefix is `fi`. +// Filters library. Its official prefix is `fi`. // // The Filters library is organized into 22 sections: // @@ -46,7 +46,7 @@ si = library("signals.lib"); fi = library("filters.lib"); // for compatible copy/paste out of this file declare name "Faust Filters Library"; -declare version "0.3"; +declare version "1.3.0"; //===============================Basic Filters============================================ //======================================================================================== @@ -759,7 +759,7 @@ bvav2nuv(bv,av) = par(m,M+1,nu(m)) with { }; //--------------------`(fi.)iir_lat2`----------------------- -// Two-multiply latice IIR filter of arbitrary order. +// Two-multiply lattice IIR filter of arbitrary order. // // #### Usage // @@ -864,7 +864,7 @@ with { }; //--------------------`(fi.)iir_lat1`----------------------- -// One-multiply latice IIR filter of arbitrary order. +// One-multiply lattice IIR filter of arbitrary order. // // #### Usage // @@ -1259,7 +1259,7 @@ with { s = ba.take(n,sv); cross = _,_ <: !,_,_,!; }; // s^2 + a1 s + 1 // ``` // -// where `a1 = sqrt(2)`. Therefore, a DIGITAL Butterworth lowpass +// where `a1 = sqrt(2)`. Therefore, a DIGITAL Butterworth lowpass // cutting off at `SR/4` is specified as `tf2s(0,0,1,sqrt(2),1,PI*SR/2);` // // #### Method @@ -1567,7 +1567,7 @@ with { // // Where: // -// * `N`: filter order (number of poles) [nonnegative constant numerical expression] +// * `N`: filter order (number of poles), nonnegative constant numerical expression // * `fc`: desired cut-off frequency (-3dB frequency) in Hz // // #### References @@ -1581,7 +1581,7 @@ lowpass(N,fc) = lowpass0_highpass1(0,N,fc); //----------------`(fi.)highpass`-------------------- -// Nth-order Butterworth highpass filters. +// Nth-order Butterworth highpass filter. // `highpass` is a standard Faust function. // // #### Usage @@ -1592,7 +1592,7 @@ lowpass(N,fc) = lowpass0_highpass1(0,N,fc); // // Where: // -// * `N`: filter order (number of poles) [nonnegative constant numerical expression] +// * `N`: filter order (number of poles), nonnegative constant numerical expression // * `fc`: desired cut-off frequency (-3dB frequency) in Hz // // #### References diff --git a/src/static/examples/LIBRARIES/hoa.lib b/src/static/examples/LIBRARIES/hoa.lib index 86231fef..4a792508 100644 --- a/src/static/examples/LIBRARIES/hoa.lib +++ b/src/static/examples/LIBRARIES/hoa.lib @@ -47,7 +47,7 @@ ro = library("routes.lib"); de = library("delays.lib"); declare name "High Order Ambisonics library"; -declare version "0.4"; +declare version "1.4.0"; declare author "Pierre Guillot"; declare author "Eliott Paris"; declare author "Julien Colafrancesco"; diff --git a/src/static/examples/LIBRARIES/instruments.lib b/src/static/examples/LIBRARIES/instruments.lib index 76676b4c..2b000a56 100644 --- a/src/static/examples/LIBRARIES/instruments.lib +++ b/src/static/examples/LIBRARIES/instruments.lib @@ -13,7 +13,7 @@ re = library("reverbs.lib"); declare name "Faust-STK Tools Library"; declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; declare copyright "Romain Michon"; -declare version "1.0"; +declare version "1.0.0"; declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); diff --git a/src/static/examples/LIBRARIES/interpolators.lib b/src/static/examples/LIBRARIES/interpolators.lib index cb7768b7..a9923bb7 100644 --- a/src/static/examples/LIBRARIES/interpolators.lib +++ b/src/static/examples/LIBRARIES/interpolators.lib @@ -139,12 +139,15 @@ ma = library("maths.lib"); si = library("signals.lib"); declare name "Faust Interpolator Library"; -declare version "0.3"; +declare version "1.3.1"; -reset(trig) = (trig-trig') <= 0; +// Produces 0 until the first trig, then 1 until the next trig (which outputs a 0 sample to reset), and so on +reset(trig) = hold * (trig <= trig') +with { + hold = select2(trig,_,trig) ~ _; +}; // The following 3 functions allow to adapt a 'single signal' fractional idv in this [idx, dv] model. - singleprecision int_part(idv) = idv : _,!; singleprecision frac_part(idv) = idv : !,_; singleprecision make_idv(id) = int(id), ma.frac(id); @@ -641,3 +644,35 @@ frwtable(N, S, init, w_idx, x, r_idx) = f_idx = ma.frac(r_idx) + int(N / 2); i_idx = int(r_idx); }; + + +//=========================Misc functions================================================= +//======================================================================================== + +//---------------`(it.)remap` --------------------------------------------- +// Linearly map from an input domain to an output range. +// +// #### Usage +// +// ``` +// _ : remap(from1, from2, to1, to2) : _ +// ``` +// +// Where: +// +// * `from1`: the domain's lower bound. +// * `from2`: the domain's upper bound. +// * `to1`: the range's lower bound. +// * `to2`: the range's upper bound. +// +// Note that having `from1` == `from2` in the mapping will cause a division by zero that has to be taken in account. +// +// Example: An oscillator remapped from [-1., 1.] to [100., 1000.] +// ``` +// os.osc(440) : it.remap(-1., 1., 100., 1000.) +// ``` +//------------------------------------------------------------ +declare remap author "David Braun"; + +remap(from1, from2, to1, to2, x) = to1 + (x-from1)*(to2-to1)/(from2-from1); + diff --git a/src/static/examples/LIBRARIES/maths.lib b/src/static/examples/LIBRARIES/maths.lib index df261890..933ac40c 100644 --- a/src/static/examples/LIBRARIES/maths.lib +++ b/src/static/examples/LIBRARIES/maths.lib @@ -54,7 +54,7 @@ pl = library("platform.lib"); ma = library("maths.lib"); // for compatible copy/paste out of this file declare name "Faust Math Library"; -declare version "2.5"; +declare version "2.8.0"; declare author "GRAME"; declare copyright "GRAME"; declare license "LGPL with exception"; @@ -75,7 +75,7 @@ declare license "LGPL with exception"; SR = pl.SR; //---------------------------------`(ma.)T`--------------------------------------- -// Current sampling rate given at init time. Constant during program execution. +// Current sample duration in seconds computed from the sampling rate given at init time. Constant during program execution. // // #### Usage // @@ -109,6 +109,30 @@ BS = pl.BS; PI = 3.14159265358979323846; +//---------------------------------`(ma.)deg2rad`---------------------------------- +// Convert degrees to radians. +// +// #### Usage +// +// ``` +// 45. : deg2rad +// ``` +//----------------------------------------------------------------------------- +deg2rad = _ * PI / 180.; + + +//---------------------------------`(ma.)rad2deg`---------------------------------- +// Convert radians to degrees. +// +// #### Usage +// +// ``` +// ma.PI : rad2deg +// ``` +//----------------------------------------------------------------------------- +rad2deg = _ * 180. / PI; + + //---------------------------------`(ma.)E`--------------------------------------- // Constant e in double precision. // @@ -122,7 +146,10 @@ E = 2.71828182845904523536; //---------------------------------`(ma.)EPSILON`--------------------------------------- -// Constant EPSILON in simple/double/quad precision. +// Constant EPSILON available in simple/double/quad precision, +// as defined in the [floating-point standard](https://en.wikipedia.org/wiki/IEEE_754) +// and [machine epsilon](https://en.wikipedia.org/wiki/Machine_epsilon), +// that is smallest positive number such that `1.0 + EPSILON != 1.0`. // // #### Usage // @@ -132,12 +159,12 @@ E = 2.71828182845904523536; //----------------------------------------------------------------------------- singleprecision EPSILON = 1.192092896e-07; doubleprecision EPSILON = 2.2204460492503131e-016; -quadprecision EPSILON = 2.2204460492503131e-016; +quadprecision EPSILON = 1.084202172485504434007452e-019; fixedpointprecision EPSILON = 2.2204460492503131e-016; //---------------------------------`(ma.)MIN`--------------------------------------- -// Constant MIN in simple/double/quad precision (minimal positive value). +// Constant MIN available in simple/double/quad precision (minimal positive value). // // #### Usage // @@ -152,7 +179,7 @@ fixedpointprecision MIN = 2.2250738585072014e-308; //---------------------------------`(ma.)MAX`------------------------------ -// Constant MAX in simple/double/quad precision (maximal positive value). +// Constant MAX available in simple/double/quad precision (maximal positive value). // // #### Usage // @@ -210,6 +237,19 @@ copysign = ffunction(float copysignf|copysign|copysignl (float, float), neg(x) = -x; +//---------------------------------`(ma.)not`--------------------------------------- +// Bitwise `not` implemented with [xor](https://faustdoc.grame.fr/manual/syntax/#xor-primitive) as `not(x) = x xor -1;`. +// So working regardless of the size of the integer, assuming negative numbers in two's complement. +// +// #### Usage +// +// ``` +// _ : not : _ +// ``` +//----------------------------------------------------------------------------- +not(x) = x xor -1; + + //-------`(ma.)sub(x,y)`------------------ // Subtract `x` and `y`. // @@ -756,3 +796,222 @@ nextpow2(x) = ceil(log(x)/log(2.0)); //----------------------------------------------------------------------------- zc(x) = x * x' < 0; + +//--------------------`(ma.)primes`------------------------------------------------ +// Return the n-th prime using a waveform primitive. Note that primes(0) is 2, +// primes(1) is 3, and so on. The waveform is length 2048, so the largest +// precomputed prime is primes(2047) which is 17863. +// +// #### Usage +// +// ``` +// _ : primes : _ +// ``` +//----------------------------------------------------------------------------- +primes(x) = rdtable(waveform{ +2,3,5,7,11,13,17,19,23,29, +31,37,41,43,47,53,59,61,67,71, +73,79,83,89,97,101,103,107,109,113, +127,131,137,139,149,151,157,163,167,173, +179,181,191,193,197,199,211,223,227,229, +233,239,241,251,257,263,269,271,277,281, +283,293,307,311,313,317,331,337,347,349, +353,359,367,373,379,383,389,397,401,409, +419,421,431,433,439,443,449,457,461,463, +467,479,487,491,499,503,509,521,523,541, +547,557,563,569,571,577,587,593,599,601, +607,613,617,619,631,641,643,647,653,659, +661,673,677,683,691,701,709,719,727,733, +739,743,751,757,761,769,773,787,797,809, +811,821,823,827,829,839,853,857,859,863, +877,881,883,887,907,911,919,929,937,941, +947,953,967,971,977,983,991,997,1009,1013, +1019,1021,1031,1033,1039,1049,1051,1061,1063,1069, +1087,1091,1093,1097,1103,1109,1117,1123,1129,1151, +1153,1163,1171,1181,1187,1193,1201,1213,1217,1223, +1229,1231,1237,1249,1259,1277,1279,1283,1289,1291, +1297,1301,1303,1307,1319,1321,1327,1361,1367,1373, +1381,1399,1409,1423,1427,1429,1433,1439,1447,1451, +1453,1459,1471,1481,1483,1487,1489,1493,1499,1511, +1523,1531,1543,1549,1553,1559,1567,1571,1579,1583, +1597,1601,1607,1609,1613,1619,1621,1627,1637,1657, +1663,1667,1669,1693,1697,1699,1709,1721,1723,1733, +1741,1747,1753,1759,1777,1783,1787,1789,1801,1811, +1823,1831,1847,1861,1867,1871,1873,1877,1879,1889, +1901,1907,1913,1931,1933,1949,1951,1973,1979,1987, +1993,1997,1999,2003,2011,2017,2027,2029,2039,2053, +2063,2069,2081,2083,2087,2089,2099,2111,2113,2129, +2131,2137,2141,2143,2153,2161,2179,2203,2207,2213, +2221,2237,2239,2243,2251,2267,2269,2273,2281,2287, +2293,2297,2309,2311,2333,2339,2341,2347,2351,2357, +2371,2377,2381,2383,2389,2393,2399,2411,2417,2423, +2437,2441,2447,2459,2467,2473,2477,2503,2521,2531, +2539,2543,2549,2551,2557,2579,2591,2593,2609,2617, +2621,2633,2647,2657,2659,2663,2671,2677,2683,2687, +2689,2693,2699,2707,2711,2713,2719,2729,2731,2741, +2749,2753,2767,2777,2789,2791,2797,2801,2803,2819, +2833,2837,2843,2851,2857,2861,2879,2887,2897,2903, +2909,2917,2927,2939,2953,2957,2963,2969,2971,2999, +3001,3011,3019,3023,3037,3041,3049,3061,3067,3079, +3083,3089,3109,3119,3121,3137,3163,3167,3169,3181, +3187,3191,3203,3209,3217,3221,3229,3251,3253,3257, +3259,3271,3299,3301,3307,3313,3319,3323,3329,3331, +3343,3347,3359,3361,3371,3373,3389,3391,3407,3413, +3433,3449,3457,3461,3463,3467,3469,3491,3499,3511, +3517,3527,3529,3533,3539,3541,3547,3557,3559,3571, +3581,3583,3593,3607,3613,3617,3623,3631,3637,3643, +3659,3671,3673,3677,3691,3697,3701,3709,3719,3727, +3733,3739,3761,3767,3769,3779,3793,3797,3803,3821, +3823,3833,3847,3851,3853,3863,3877,3881,3889,3907, +3911,3917,3919,3923,3929,3931,3943,3947,3967,3989, +4001,4003,4007,4013,4019,4021,4027,4049,4051,4057, +4073,4079,4091,4093,4099,4111,4127,4129,4133,4139, +4153,4157,4159,4177,4201,4211,4217,4219,4229,4231, +4241,4243,4253,4259,4261,4271,4273,4283,4289,4297, +4327,4337,4339,4349,4357,4363,4373,4391,4397,4409, +4421,4423,4441,4447,4451,4457,4463,4481,4483,4493, +4507,4513,4517,4519,4523,4547,4549,4561,4567,4583, +4591,4597,4603,4621,4637,4639,4643,4649,4651,4657, +4663,4673,4679,4691,4703,4721,4723,4729,4733,4751, +4759,4783,4787,4789,4793,4799,4801,4813,4817,4831, +4861,4871,4877,4889,4903,4909,4919,4931,4933,4937, +4943,4951,4957,4967,4969,4973,4987,4993,4999,5003, +5009,5011,5021,5023,5039,5051,5059,5077,5081,5087, +5099,5101,5107,5113,5119,5147,5153,5167,5171,5179, +5189,5197,5209,5227,5231,5233,5237,5261,5273,5279, +5281,5297,5303,5309,5323,5333,5347,5351,5381,5387, +5393,5399,5407,5413,5417,5419,5431,5437,5441,5443, +5449,5471,5477,5479,5483,5501,5503,5507,5519,5521, +5527,5531,5557,5563,5569,5573,5581,5591,5623,5639, +5641,5647,5651,5653,5657,5659,5669,5683,5689,5693, +5701,5711,5717,5737,5741,5743,5749,5779,5783,5791, +5801,5807,5813,5821,5827,5839,5843,5849,5851,5857, +5861,5867,5869,5879,5881,5897,5903,5923,5927,5939, +5953,5981,5987,6007,6011,6029,6037,6043,6047,6053, +6067,6073,6079,6089,6091,6101,6113,6121,6131,6133, +6143,6151,6163,6173,6197,6199,6203,6211,6217,6221, +6229,6247,6257,6263,6269,6271,6277,6287,6299,6301, +6311,6317,6323,6329,6337,6343,6353,6359,6361,6367, +6373,6379,6389,6397,6421,6427,6449,6451,6469,6473, +6481,6491,6521,6529,6547,6551,6553,6563,6569,6571, +6577,6581,6599,6607,6619,6637,6653,6659,6661,6673, +6679,6689,6691,6701,6703,6709,6719,6733,6737,6761, +6763,6779,6781,6791,6793,6803,6823,6827,6829,6833, +6841,6857,6863,6869,6871,6883,6899,6907,6911,6917, +6947,6949,6959,6961,6967,6971,6977,6983,6991,6997, +7001,7013,7019,7027,7039,7043,7057,7069,7079,7103, +7109,7121,7127,7129,7151,7159,7177,7187,7193,7207, +7211,7213,7219,7229,7237,7243,7247,7253,7283,7297, +7307,7309,7321,7331,7333,7349,7351,7369,7393,7411, +7417,7433,7451,7457,7459,7477,7481,7487,7489,7499, +7507,7517,7523,7529,7537,7541,7547,7549,7559,7561, +7573,7577,7583,7589,7591,7603,7607,7621,7639,7643, +7649,7669,7673,7681,7687,7691,7699,7703,7717,7723, +7727,7741,7753,7757,7759,7789,7793,7817,7823,7829, +7841,7853,7867,7873,7877,7879,7883,7901,7907,7919, +7927,7933,7937,7949,7951,7963,7993,8009,8011,8017, +8039,8053,8059,8069,8081,8087,8089,8093,8101,8111, +8117,8123,8147,8161,8167,8171,8179,8191,8209,8219, +8221,8231,8233,8237,8243,8263,8269,8273,8287,8291, +8293,8297,8311,8317,8329,8353,8363,8369,8377,8387, +8389,8419,8423,8429,8431,8443,8447,8461,8467,8501, +8513,8521,8527,8537,8539,8543,8563,8573,8581,8597, +8599,8609,8623,8627,8629,8641,8647,8663,8669,8677, +8681,8689,8693,8699,8707,8713,8719,8731,8737,8741, +8747,8753,8761,8779,8783,8803,8807,8819,8821,8831, +8837,8839,8849,8861,8863,8867,8887,8893,8923,8929, +8933,8941,8951,8963,8969,8971,8999,9001,9007,9011, +9013,9029,9041,9043,9049,9059,9067,9091,9103,9109, +9127,9133,9137,9151,9157,9161,9173,9181,9187,9199, +9203,9209,9221,9227,9239,9241,9257,9277,9281,9283, +9293,9311,9319,9323,9337,9341,9343,9349,9371,9377, +9391,9397,9403,9413,9419,9421,9431,9433,9437,9439, +9461,9463,9467,9473,9479,9491,9497,9511,9521,9533, +9539,9547,9551,9587,9601,9613,9619,9623,9629,9631, +9643,9649,9661,9677,9679,9689,9697,9719,9721,9733, +9739,9743,9749,9767,9769,9781,9787,9791,9803,9811, +9817,9829,9833,9839,9851,9857,9859,9871,9883,9887, +9901,9907,9923,9929,9931,9941,9949,9967,9973,10007, +10009,10037,10039,10061,10067,10069,10079,10091,10093,10099, +10103,10111,10133,10139,10141,10151,10159,10163,10169,10177, +10181,10193,10211,10223,10243,10247,10253,10259,10267,10271, +10273,10289,10301,10303,10313,10321,10331,10333,10337,10343, +10357,10369,10391,10399,10427,10429,10433,10453,10457,10459, +10463,10477,10487,10499,10501,10513,10529,10531,10559,10567, +10589,10597,10601,10607,10613,10627,10631,10639,10651,10657, +10663,10667,10687,10691,10709,10711,10723,10729,10733,10739, +10753,10771,10781,10789,10799,10831,10837,10847,10853,10859, +10861,10867,10883,10889,10891,10903,10909,10937,10939,10949, +10957,10973,10979,10987,10993,11003,11027,11047,11057,11059, +11069,11071,11083,11087,11093,11113,11117,11119,11131,11149, +11159,11161,11171,11173,11177,11197,11213,11239,11243,11251, +11257,11261,11273,11279,11287,11299,11311,11317,11321,11329, +11351,11353,11369,11383,11393,11399,11411,11423,11437,11443, +11447,11467,11471,11483,11489,11491,11497,11503,11519,11527, +11549,11551,11579,11587,11593,11597,11617,11621,11633,11657, +11677,11681,11689,11699,11701,11717,11719,11731,11743,11777, +11779,11783,11789,11801,11807,11813,11821,11827,11831,11833, +11839,11863,11867,11887,11897,11903,11909,11923,11927,11933, +11939,11941,11953,11959,11969,11971,11981,11987,12007,12011, +12037,12041,12043,12049,12071,12073,12097,12101,12107,12109, +12113,12119,12143,12149,12157,12161,12163,12197,12203,12211, +12227,12239,12241,12251,12253,12263,12269,12277,12281,12289, +12301,12323,12329,12343,12347,12373,12377,12379,12391,12401, +12409,12413,12421,12433,12437,12451,12457,12473,12479,12487, +12491,12497,12503,12511,12517,12527,12539,12541,12547,12553, +12569,12577,12583,12589,12601,12611,12613,12619,12637,12641, +12647,12653,12659,12671,12689,12697,12703,12713,12721,12739, +12743,12757,12763,12781,12791,12799,12809,12821,12823,12829, +12841,12853,12889,12893,12899,12907,12911,12917,12919,12923, +12941,12953,12959,12967,12973,12979,12983,13001,13003,13007, +13009,13033,13037,13043,13049,13063,13093,13099,13103,13109, +13121,13127,13147,13151,13159,13163,13171,13177,13183,13187, +13217,13219,13229,13241,13249,13259,13267,13291,13297,13309, +13313,13327,13331,13337,13339,13367,13381,13397,13399,13411, +13417,13421,13441,13451,13457,13463,13469,13477,13487,13499, +13513,13523,13537,13553,13567,13577,13591,13597,13613,13619, +13627,13633,13649,13669,13679,13681,13687,13691,13693,13697, +13709,13711,13721,13723,13729,13751,13757,13759,13763,13781, +13789,13799,13807,13829,13831,13841,13859,13873,13877,13879, +13883,13901,13903,13907,13913,13921,13931,13933,13963,13967, +13997,13999,14009,14011,14029,14033,14051,14057,14071,14081, +14083,14087,14107,14143,14149,14153,14159,14173,14177,14197, +14207,14221,14243,14249,14251,14281,14293,14303,14321,14323, +14327,14341,14347,14369,14387,14389,14401,14407,14411,14419, +14423,14431,14437,14447,14449,14461,14479,14489,14503,14519, +14533,14537,14543,14549,14551,14557,14561,14563,14591,14593, +14621,14627,14629,14633,14639,14653,14657,14669,14683,14699, +14713,14717,14723,14731,14737,14741,14747,14753,14759,14767, +14771,14779,14783,14797,14813,14821,14827,14831,14843,14851, +14867,14869,14879,14887,14891,14897,14923,14929,14939,14947, +14951,14957,14969,14983,15013,15017,15031,15053,15061,15073, +15077,15083,15091,15101,15107,15121,15131,15137,15139,15149, +15161,15173,15187,15193,15199,15217,15227,15233,15241,15259, +15263,15269,15271,15277,15287,15289,15299,15307,15313,15319, +15329,15331,15349,15359,15361,15373,15377,15383,15391,15401, +15413,15427,15439,15443,15451,15461,15467,15473,15493,15497, +15511,15527,15541,15551,15559,15569,15581,15583,15601,15607, +15619,15629,15641,15643,15647,15649,15661,15667,15671,15679, +15683,15727,15731,15733,15737,15739,15749,15761,15767,15773, +15787,15791,15797,15803,15809,15817,15823,15859,15877,15881, +15887,15889,15901,15907,15913,15919,15923,15937,15959,15971, +15973,15991,16001,16007,16033,16057,16061,16063,16067,16069, +16073,16087,16091,16097,16103,16111,16127,16139,16141,16183, +16187,16189,16193,16217,16223,16229,16231,16249,16253,16267, +16273,16301,16319,16333,16339,16349,16361,16363,16369,16381, +16411,16417,16421,16427,16433,16447,16451,16453,16477,16481, +16487,16493,16519,16529,16547,16553,16561,16567,16573,16603, +16607,16619,16631,16633,16649,16651,16657,16661,16673,16691, +16693,16699,16703,16729,16741,16747,16759,16763,16787,16811, +16823,16829,16831,16843,16871,16879,16883,16889,16901,16903, +16921,16927,16931,16937,16943,16963,16979,16981,16987,16993, +17011,17021,17027,17029,17033,17041,17047,17053,17077,17093, +17099,17107,17117,17123,17137,17159,17167,17183,17189,17191, +17203,17207,17209,17231,17239,17257,17291,17293,17299,17317, +17321,17327,17333,17341,17351,17359,17377,17383,17387,17389, +17393,17401,17417,17419,17431,17443,17449,17467,17471,17477, +17483,17489,17491,17497,17509,17519,17539,17551,17569,17573, +17579,17581,17597,17599,17609,17623,17627,17657,17659,17669, +17681,17683,17707,17713,17729,17737,17747,17749,17761,17783, +17789,17791,17807,17827,17837,17839,17851,17863 +}, x); diff --git a/src/static/examples/LIBRARIES/maxmsp.lib b/src/static/examples/LIBRARIES/maxmsp.lib index 08a78eee..cb20fc36 100644 --- a/src/static/examples/LIBRARIES/maxmsp.lib +++ b/src/static/examples/LIBRARIES/maxmsp.lib @@ -44,7 +44,7 @@ ma = library("maths.lib"); declare name "MaxMSP compatibility Library"; declare author "GRAME"; declare copyright "GRAME"; -declare version "1.1"; +declare version "1.1.0"; declare license "LGPL with exception"; atodb = db2lin; diff --git a/src/static/examples/LIBRARIES/mi.lib b/src/static/examples/LIBRARIES/mi.lib index f8ad2ab8..69888ba4 100644 --- a/src/static/examples/LIBRARIES/mi.lib +++ b/src/static/examples/LIBRARIES/mi.lib @@ -51,7 +51,7 @@ ma = library("maths.lib"); ba = library("basics.lib"); declare name "Faust mass-interaction physical modelling library"; -declare version "0.0"; +declare version "1.1.0"; declare author "James Leonard"; declare author "Romain Michon"; declare copyright "2018-2020 GRAME / GIPSA-Lab"; diff --git a/src/static/examples/LIBRARIES/misceffects.lib b/src/static/examples/LIBRARIES/misceffects.lib index 3b174de1..35f01488 100644 --- a/src/static/examples/LIBRARIES/misceffects.lib +++ b/src/static/examples/LIBRARIES/misceffects.lib @@ -1,5 +1,16 @@ //################################## misceffects.lib ########################################## -// This library contains a collection of audio effects. Its official prefix is `ef`. +// Collection of audio effects library. Its official prefix is `ef`. +// +// The library is organized into 7 sections: +// +// * [Dynamic](#Dynamic) +// * [Fibonacci](#fibonacci) +// * [Filtering](#filtering) +// * [Meshes](#meshes) +// * [Mixing](#mixing) +// * [Time Based](#time-based) +// * [Pitch Shifting](#pitch-shifting) +// * [Saturators](#saturators) // // #### References // * @@ -43,25 +54,12 @@ de = library("delays.lib"); si = library("signals.lib"); an = library("analyzers.lib"); fi = library("filters.lib"); +ro = library("routes.lib"); +aa = library("aanl.lib"); ef = library("misceffects.lib"); // for compatible copy/paste out of this file declare name "Misc Effects Library"; -declare version "2.0"; - -//######################################################################################## -/************************************************************************ -FAUST library file, jos section - -Except where noted otherwise, The Faust functions below in this -section are Copyright (C) 2003-2019 by Julius O. Smith III -([jos](http://ccrma.stanford.edu/~jos/)), and released under the -(MIT-style) [STK-4.3](#stk-4.3-license) license. - -MarkDown comments in this section are Copyright 2016-2019 by Romain -Michon and Julius O. Smith III, and are released under the -[CCA4I](https://creativecommons.org/licenses/by/4.0/) license (TODO: if/when Romain agrees!) - -************************************************************************/ +declare version "2.5.0"; //======================================Dynamic=========================================== //======================================================================================== @@ -81,7 +79,7 @@ Michon and Julius O. Smith III, and are released under the // // * `drive`: distortion amount, between 0 and 1 // * `offset`: constant added before nonlinearity to give even harmonics. Note: offset -// can introduce a nonzero mean - feed cubicnl output to dcblocker to remove this. +// can introduce a nonzero mean - feed cubicnl output to dcblocker to remove this. // // #### References: // @@ -98,6 +96,10 @@ with { cubicnl_nodc(drive,offset) = cubicnl(drive,offset) : fi.dcblocker; +declare cubicnl author "Julius O. Smith III"; +declare cubicnl license "STK-4.3"; +declare cubicnl_nodc author "Julius O. Smith III"; +declare cubicnl_nodc license "STK-4.3"; //-----------------`(ef.)gate_mono`------------------- // Mono signal gate. @@ -124,6 +126,8 @@ cubicnl_nodc(drive,offset) = cubicnl(drive,offset) : fi.dcblocker; //------------------------------------------------------------ gate_mono(thresh,att,hold,rel,x) = x * gate_gain_mono(thresh,att,hold,rel,x); +declare gate_mono author "Julius O. Smith III"; +declare gate_mono license "STK-4.3"; //-----------------`(ef.)gate_stereo`------------------- // Stereo signal gates. @@ -163,35 +167,126 @@ gate_gain_mono(thresh,att,hold,rel,x) = x : extendedrawgate : an.amp_follower_ar holdsamps = int(hold*ma.SR); }; +declare gate_stereo author "Julius O. Smith III"; +declare gate_stereo license "STK-4.3"; +declare gate_gain_mono author "Julius O. Smith III"; +declare gate_gain_mono license "STK-4.3"; + +//=====================================Fibonacci========================================== +//======================================================================================== + +//---------------`(ef.)fibonacci`--------------------------- +// Fibonacci system where the current output is the current +// input plus the sum of the previous N outputs. +// +// #### Usage +// +// ``` +// _ : fibonacci(N) : _ +// ``` +// +// Where: +// +// * `N`: the Fibonacci system's order, where 2 is standard +// +// #### Example +// Generate the famous series: [1, 1, 2, 3, 5, 8, 13, ...] +// +// ``` +// 1. : ba.impulsify : fibonacci(2) +// ``` +//------------------------------------------------------------ +declare fibonacci author "Dario Sanfilippo"; + +fibonacci(order) = +~(_<:sum(i, order, @(i)):>_); + + +//---------------`(ef.)fibonacciGeneral`---------------------- +// Fibonacci system with customizable coefficients. +// The order of the system is inferred from the number of coefficients. +// +// #### Usage +// +// ``` +// _ : fibonacciGeneral(wave) : _ +// ``` +// +// Where: +// +// * `wave`: a waveform such as `waveform{1, 1}` +// +// #### Example: +// Use the update equation `y = 2*y' + 3*y'' + 4*y'''` +// +// ``` +// 1. : ba.impulsify : fibonacciGeneral(waveform{2, 3, 4}) +// ``` +//------------------------------------------------------------ +declare fibonacciGeneral author "Dario Sanfilippo and David Braun"; + +fibonacciGeneral(wave) = +~(_<:sum(i, N, func(i)):>_) +with { + N = wave : _, !; + func(i) = @(i) : _ * (wave, i : rdtable); +}; + +//---------------`(ef.)fibonacciSeq`--------------------------- +// First N numbers of the Fibonacci sequence [1, 1, 2, 3, 5, 8, ...] +// as parallel channels. +// +// #### Usage +// +// ``` +// fibonacciSeq(N) : si.bus(N) +// ``` +// +// Where: +// +// * `N`: The number of Fibonacci numbers to generate as channels. +// +//------------------------------------------------------------ + +fibonacciSeq(N) = iterate(N, (1, 1)) +with { + iterate(1, (A0, A1)) = A0; + iterate(N, (A0, A1)) = A0 , iterate(N - 1, (A1, A0 + A1)); +}; + +declare fibonacciSeq author "Dario Sanfilippo"; + //=====================================Filtering========================================== //======================================================================================== //-------------------------`(ef.)speakerbp`------------------------------- // Dirt-simple speaker simulator (overall bandpass eq with observed -// roll-offs above and below the passband). +// roll-offs above and below the passband). `speakerbp` is a standard Faust function. // // Low-frequency speaker model = +12 dB/octave slope breaking to // flat near f1. Implemented using two dc blockers in series. // // High-frequency model = -24 dB/octave slope implemented using a // fourth-order Butterworth lowpass. + // -// Example based on measured Celestion G12 (12" speaker): -// -// `speakerbp` is a standard Faust function. // // #### Usage +// ``` +// _ : speakerbp(f1,f2) : _ +// ``` +// #### Example // +// Based on measured Celestion G12 (12" speaker): // ``` -// speakerbp(f1,f2) -// _ : speakerbp(130,5000) : _ +// speakerbp(130,5000) // ``` //------------------------------------------------------------ // TODO: perhaps this should be moved to physmodels.lib // [JOS: I don't think so because it's merely a bandpass filter tuned to speaker bandwidth] speakerbp(f1,f2) = fi.dcblockerat(f1) : fi.dcblockerat(f1) : fi.lowpass(4,f2); +declare speakerbp author "Julius O. Smith III"; +declare speakerbp license "STK-4.3"; //------------`(ef.)piano_dispersion_filter`--------------- // Piano dispersion allpass filter in closed form. @@ -206,7 +301,7 @@ speakerbp(f1,f2) = fi.dcblockerat(f1) : fi.dcblockerat(f1) : fi.lowpass(4,f2); // Where: // // * `M`: number of first-order allpass sections (compile-time only) -// Keep below 20. 8 is typical for medium-sized piano strings. +// Keep below 20. 8 is typical for medium-sized piano strings. // * `B`: string inharmonicity coefficient (0.0001 is typical) // * `f0`: fundamental frequency in Hz // @@ -251,6 +346,9 @@ with { Df0 = polydel(a1) - polydel(1.0/a1); }; +declare piano_dispersion_filter author "Julius O. Smith III"; +declare piano_dispersion_filter license "STK-4.3"; + //-------------------------`(ef.)stereo_width`--------------------------- // Stereo Width effect using the Blumlein Shuffler technique. // `stereo_width` is a standard Faust function. @@ -281,6 +379,9 @@ with { sgain = w/2; }; +declare stereo_width author "Julius O. Smith III"; +declare stereo_width license "STK-4.3"; + //===========================================Meshes======================================= //======================================================================================== @@ -309,30 +410,34 @@ with { // The mesh is constructed recursively using 2x2 embeddings. Thus, // the top level of `mesh_square(M)` is a block 2x2 mesh, where each // block is a `mesh(M/2)`. Let these blocks be numbered 1,2,3,4 in the -// geometry NW,NE,SW,SE, i.e., as +// geometry NW,NE,SW,SE, i.e., as: +// // 1 2 // 3 4 +// // Each block has four vector inputs and four vector outputs, where the -// length of each vector is `M/2`. Label the input vectors as Ni,Ei,Wi,Si, +// length of each vector is `M/2`. Label the input vectors as Ni,Ei,Wi,Si, // i.e., as the inputs from the North, East South, and West, -// and similarly for the outputs. Then, for example, the upper -// left input block of M/2 signals is labeled 1Ni. Most of the -// connections are internal, such as 1Eo -> 2Wi. The `8*(M/2)` input -// signals are grouped in the order +// and similarly for the outputs. Then, for example, the upper +// left input block of M/2 signals is labeled 1Ni. Most of the +// connections are internal, such as 1Eo -> 2Wi. The `8*(M/2)` input +// signals are grouped in the order: +// // 1Ni 2Ni // 3Si 4Si // 1Wi 3Wi // 2Ei 4Ei -// and the output signals are +// +// and the output signals are: +// // 1No 1Wo // 2No 2Eo // 3So 3Wo // 4So 4Eo -// or -// -// In: 1No 1Wo 2No 2Eo 3So 3Wo 4So 4Eo +// or: // -// Out: 1Ni 2Ni 3Si 4Si 1Wi 3Wi 2Ei 4Ei +// In: 1No 1Wo 2No 2Eo 3So 3Wo 4So 4Eo +// Out: 1Ni 2Ni 3Si 4Si 1Wi 3Wi 2Ei 4Ei // // Thus, the inputs are grouped by direction N,S,W,E, while the // outputs are grouped by block number 1,2,3,4, which can also be @@ -345,15 +450,16 @@ with { // // ``` // mesh_square_test(N,x) = mesh_square(N)~(busi(4*N,x)) // input to corner -// with { busi(N,x) = bus(N) : par(i,N,*(-1)) : par(i,N-1,_), +(x); }; +// with { +// busi(N,x) = bus(N) : par(i,N,*(-1)) : par(i,N-1,_), +(x); +// }; // process = 1-1' : mesh_square_test(4); // all modes excited forever // ``` // // In this simple example, the mesh edges are connected as follows: // -// 1No -> 1Ni, 1Wo -> 2Ni, 2No -> 3Si, 2Eo -> 4Si, -// -// 3So -> 1Wi, 3Wo -> 3Wi, 4So -> 2Ei, 4Eo -> 4Ei +// 1No -> 1Ni, 1Wo -> 2Ni, 2No -> 3Si, 2Eo -> 4Si, +// 3So -> 1Wi, 3Wo -> 3Wi, 4So -> 2Ei, 4Eo -> 4Ei // // A routing matrix can be used to obtain other connection geometries. //------------------------------------------------------------ @@ -403,6 +509,293 @@ with { : si.bus(16*N); }; +declare mesh_square author "Julius O. Smith III"; +declare mesh_square license "STK-4.3"; + + +//=====================================Mixing============================================= +//======================================================================================== + +// Implementation to share common code +dwmEnv(wetAmount, FX) = environment +{ + N = inputs(FX); + wet(wg) = FX : par(i, N, *(wg)); + dry(dg) = par(i, N, *(dg)); + out(wg, dg) = si.bus(N) <: wet(wg), dry(dg) :> si.bus(N); + + dryWetMixer = out(wetGain, dryGain) + with { + wetGain = wetAmount; + dryGain = 1. - wetGain; + }; + + dryWetMixerConstantPower = out(wetGain, dryGain) + with { + theta = ma.PI*wetAmount/2.; + dryGain = cos(theta)/sqrt(2.); + wetGain = sin(theta)/sqrt(2.); + }; +}; + + +//---------------`(ef.)dryWetMixer`------------- +// Linear dry-wet mixer for a N inputs and N outputs effect. +// +// #### Usage +// +// ``` +// si.bus(inputs(FX)) : dryWetMixer(wetAmount, FX) : si.bus(inputs(FX)) +// ``` +// +// Where: +// +// * `wetAmount`: the wet amount (0-1). 0 produces only the dry signal and 1 produces only the wet signal +// * `FX`: an arbitrary effect (N inputs and N outputs) to apply to the input bus +//------------------------------------------------------------ +declare dryWetMixer author "David Braun, revised by Stéphane Letz"; + +dryWetMixer(wetAmount, FX) = dwmEnv(wetAmount, FX).dryWetMixer; + + +//---------------`(ef.)dryWetMixerConstantPower`------------- +// Constant-power dry-wet mixer for a N inputs and N outputs effect. +// +// #### Usage +// +// ``` +// si.bus(inputs(FX)) : dryWetMixerConstantPower(wetAmount, FX) :si.bus(inputs(FX)) +// ``` +// +// Where: +// +// * `wetAmount`: the wet amount (0-1). 0 produces only the dry signal and 1 produces only the wet signal +// * `FX`: an arbitrary effect (N inputs and N outputs) to apply to the input bus +//------------------------------------------------------------ +declare dryWetMixerConstantPower author "David Braun, revised by Stéphane Letz"; + +dryWetMixerConstantPower(wetAmount, FX) = dwmEnv(wetAmount, FX).dryWetMixerConstantPower; + + +mixingEnv = environment +{ + // Note that i goes from 0 to N-1. + // m goes from 0 to N-1 typically, but the output should be periodic with size N. + // In other words the output with m=-4*N is the same as -2*N, -1*N, 0, 1*N, 2*N etc. + phaseLoop(N, m, i) = select2(abs(phase1) si.bus(C) + with { + N = 2; // We know in advance that there are 2 sounds (the dry and wet). + C = inputs(FX); + weights = weightsLinearClamp(N, wetAmount) <: ro.interleave(N, C); + sounds = si.bus(C) <: si.bus(C), FX; + }; + + dryWetMixerConstantPower(wetAmount, FX) = si.vecOp((weights, sounds), *) :> si.bus(C) + with { + N = 2; // We know in advance that there are 2 sounds (the dry and wet). + C = inputs(FX); + weights = weightsPowerClamp(N, wetAmount) <: ro.interleave(N, C); + sounds = si.bus(C) <: si.bus(C), FX; + }; + + // Suppose `sounds` is N buses, each of C channels. + // We want to linearly mix the buses using index `m` [0;N-1] + mixLinearClamp(N, C, m, sounds) = si.vecOp((weights, sounds), *) :> si.bus(C) + with { + weights = weightsLinearClamp(N, m) <: ro.interleave(N, C); + }; + + mixLinearLoop(N, C, m, sounds) = si.vecOp((weights, sounds), *) :> si.bus(C) + with { + weights = weightsLinearLoop(N, m) <: ro.interleave(N, C); + }; + + mixPowerClamp(N, C, m, sounds) = si.vecOp((weights, sounds), *) :> si.bus(C) + with { + weights = weightsPowerClamp(N, m) <: ro.interleave(N, C); + }; + + mixPowerLoop(N, C, m, sounds) = si.vecOp((weights, sounds), *) :> si.bus(C) + with { + weights = weightsPowerLoop(N, m) <: ro.interleave(N, C); + }; +}; + + +//---------------`(ef.)mixLinearClamp`------------------------------------------------- +// Linear mixer for `N` buses, each with `C` channels. The output will be a sum of 2 buses +// determined by the mixing index `mix`. 0 produces the first bus, 1 produces the +// second, and so on. `mix` is clamped automatically. For example, `mixLinearClamp(4, 1, 1)` +// will weight its 4 inputs by `(0, 1, 0, 0)`. Similarly, `mixLinearClamp(4, 1, 1.1)` +// will weight its 4 inputs by `(0,.9,.1,0)`. +// +// #### Usage +// +// ``` +// si.bus(N*C) : mixLinearClamp(N, C, mix) : si.bus(C) +// ``` +// +// Where: +// +// * `N`: the number of input buses +// * `C`: the number of channels in each bus +// * `mix`: the mixing index, continuous in [0;N-1]. +//--------------------------------------------------------------------------------------- +declare mixLinearClamp author "David Braun"; + +mixLinearClamp = mixingEnv.mixLinearClamp; + + +//---------------`(ef.)mixLinearLoop`------------------------------------------------- +// Linear mixer for `N` buses, each with `C` channels. Refer to `mixLinearClamp`. `mix` +// will loop for multiples of `N`. For example, `mixLinearLoop(4, 1, 0)` has the same +// effect as `mixLinearLoop(4, 1, -4)` and `mixLinearLoop(4, 1, 4)`. +// +// #### Usage +// +// ``` +// si.bus(N*C) : mixLinearLoop(N, C, mix) : si.bus(C) +// ``` +// +// Where: +// +// * `N`: the number of input buses +// * `C`: the number of channels in each bus +// * `mix`: the mixing index (N-1) selects the last bus, and 0 or N selects the 0th bus. +//--------------------------------------------------------------------------------------- +declare mixLinearLoop author "David Braun"; + +mixLinearLoop = mixingEnv.mixLinearLoop; + + +//---------------`(ef.)mixPowerClamp`------------------------------------------------- +// Constant-power mixer for `N` buses, each with `C` channels. The output will be a sum of 2 buses +// determined by the mixing index `mix`. 0 produces the first bus, 1 produces the +// second, and so on. `mix` is clamped automatically. `mixPowerClamp(4, 1, 1)` +// will weight its 4 inputs by `(0, 1./sqrt(2), 0, 0)`. Similarly, `mixPowerClamp(4, 1, 1.5)` +// will weight its 4 inputs by `(0,.5,.5,0)`. +// +// #### Usage +// +// ``` +// si.bus(N*C) : mixPowerClamp(N, C, mix) : si.bus(C) +// ``` +// +// Where: +// +// * `N`: the number of input buses +// * `C`: the number of channels in each bus +// * `mix`: the mixing index, continuous in [0;N-1]. +//--------------------------------------------------------------------------------------- +declare mixPowerClamp author "David Braun"; + +mixPowerClamp = mixingEnv.mixPowerClamp; + + +//---------------`(ef.)mixPowerLoop`----------------------------------------------------- +// Constant-power mixer for `N` buses, each with `C` channels. Refer to `mixPowerClamp`. `mix` +// will loop for multiples of `N`. For example, `mixPowerLoop(4, 1, 0)` has the same effect +// as `mixPowerLoop(4, 1, -4)` and `mixPowerLoop(4, 1, 4)`. +// +// #### Usage +// +// ``` +// si.bus(N*C) : mixPowerLoop(N, C, mix) : si.bus(C) +// ``` +// +// Where: +// +// * `N`: the number of input buses +// * `C`: the number of channels in each bus +// * `mix`: the mixing index (N-1) selects the last bus, and 0 or N selects the 0th bus. +//--------------------------------------------------------------------------------------- +declare mixPowerLoop author "David Braun"; + +mixPowerLoop = mixingEnv.mixPowerLoop; + + +//========================================Time Based====================================== +//======================================================================================== + +//----------`(ef.)echo`---------- +// A simple echo effect. +// `echo` is a standard Faust function. +// +// #### Usage +// +// ``` +// _ : echo(maxDuration,duration,feedback) : _ +// ``` +// +// Where: +// +// * `maxDuration`: the max echo duration in seconds +// * `duration`: the echo duration in seconds +// * `feedback`: the feedback coefficient +//---------------------------------------------------- +declare echo author "Romain Michon"; + +echo(maxDuration,duration,feedback) = +~de.delay(maxDel,del)*feedback +with{ + maxDel = ma.SR*maxDuration; + del = ma.SR*duration; +}; + +// TODO demo function for echo + //--------------------`(ef.)reverseEchoN(nChans,delay)`------------------- // Reverse echo effect. // @@ -414,7 +807,7 @@ with { // // Where: // -// * `N`: Number of output channels desired (1 or more) +// * `N`: Number of output channels desired (1 or more), a constant numerical expression // * `delay`: echo delay (integer power of 2) // // #### Demo @@ -425,11 +818,15 @@ with { // // #### Description // -// The effect uses N instances of reverseDelayRamped at different phases. +// The effect uses N instances of `reverseDelayRamped` at different phases. // //------------------------------------------------------------ reverseEchoN(N,delMax) = _<: par(i,N,ef.reverseDelayRamped(delMax,i/N)); +declare reverseEchoN author "Julius O. Smith III"; +declare reverseEchoN license "STK-4.3"; + + //-------------------`(ef.)reverseDelayRamped(delay,phase)`------------------ // Reverse delay with amplitude ramp. // @@ -458,6 +855,9 @@ reverseDelayRamped(delMax,phs) = rampGain * de.delay(delMax,del) with { del = int(startPulse : + ~ +(2)) & (delMax-1); }; +declare reverseDelayRamped author "Julius O. Smith III"; +declare reverseDelayRamped license "STK-4.3"; + //-------------------`(ef.)uniformPanToStereo(nChans)`------------------ // Pan nChans channels to the stereo field, spread uniformly left to right. // @@ -469,7 +869,7 @@ reverseDelayRamped(delMax,phs) = rampGain * de.delay(delMax,del) with { // // Where: // -// * `N`: Number of input channels to pan down to stereo +// * `N`: Number of input channels to pan down to stereo, a constant numerical expression // // #### Demo // @@ -479,74 +879,83 @@ reverseDelayRamped(delMax,phs) = rampGain * de.delay(delMax,del) with { // //------------------------------------------------------------ uniformPanToStereo(N) = si.bus(N) <: par(i,2*N,_) : - (par(i,N,*(i/(N-1))) :> _), - (par(i,N,*(1-i/(N-1))) :> _); + (par(i,N,*(i/(N-1))) :> _), + (par(i,N,*(1-i/(N-1))) :> _); -// end jos section -/************************************************************************ -************************************************************************ -FAUST library file, GRAME section +declare uniformPanToStereo author "Julius O. Smith III"; +declare uniformPanToStereo license "STK-4.3"; -Except where noted otherwise, Copyright (C) 2003-2017 by GRAME, -Centre National de Creation Musicale. ----------------------------------------------------------------------- -GRAME LICENSE - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as -published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with the GNU C Library; if not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -EXCEPTION TO THE LGPL LICENSE : As a special exception, you may create a -larger FAUST program which directly or indirectly imports this library -file and still distribute the compiled code generated by the FAUST -compiler, or a modified version of this compiled code, under your own -copyright and license. This EXCEPTION TO THE LGPL LICENSE explicitly -grants you the right to freely choose the license for the resulting -compiled code. In particular the resulting compiled code has no obligation -to be LGPL or GPL. For example you are free to choose a commercial or -closed source license or any other license if you decide so. -************************************************************************ -************************************************************************/ - -//========================================Time Based====================================== -//======================================================================================== - -//----------`(ef.)echo`---------- -// A simple echo effect. -// `echo` is a standard Faust function. +//---------------------`(ef.)tapeStop`----------------------------------------- +// A tape-stop effect, like putting a finger on a vinyl record player. // -// #### Usage +// #### Usage: // // ``` -// _ : echo(maxDuration,duration,feedback) : _ +// _,_ : tapeStop(2, LAGRANGE_ORDER, MAX_TIME_SAMP, crossfade, gainAlpha, stopAlpha, stopTime, stop) : _,_ +// _ : tapeStop(1, LAGRANGE_ORDER, MAX_TIME_SAMP, crossfade, gainAlpha, stopAlpha, stopTime, stop) : _ // ``` // // Where: // -// * `maxDuration`: the max echo duration in seconds -// * `duration`: the echo duration in seconds -// * `feedback`: the feedback coefficient -//---------------------------------------------------- -declare echo author "Romain Michon"; +// * `C`: The number of input and output channels. +// * `LAGRANGE_ORDER`: The order of the Lagrange interpolation on the delay line. [2-3] recommended. +// * `MAX_TIME_SAMP`: Maximum stop time in samples +// * `crossfade`: A crossfade in samples to apply when resuming normal playback. Crossfade is not applied during the enabling of the tape-stop. +// * `gainAlpha`: During the tape-stop, lower alpha stays louder longer. Safe values are in the range [.01,2]. +// * `stopAlpha`: `stopAlpha==1` represents a linear deceleration (constant force). `stopAlpha<1` represents an initially weaker, then stronger force. `stopAlpha>1` represents an initially stronger, then weaker force. Safe values are in the range [.01,2]. +// * `stopTime`: Desired duration of the stop time, in samples. +// * `stop`: When `stop` becomes positive, the tape-stop effect will start. When `stop` becomes zero, normal audio will resume via crossfade. +//----------------------------------------------------------------------------- +tapeStop(C, LAGRANGE_ORDER, MAX_TIME_SAMP, crossfade, gainAlpha, stopAlpha, stopTime, stop) = +(tapeStopTick(C) ~ _) : !,si.bus(C) +with { + tapeStopTick(C, _delaySamples) = delaySamples, circuitFinal + with { + // Where `stopCounter` goes from 0 to stopTime (or higher) + // When `stopCounter` is 0, curve's output is 1. + // When `stopCounter` is stopTime, curve's output is 0. + curve(alpha) = 1-stopCounter/stopTime : max(0) : pow(_, alpha) + with { + // when stop is pulsed, count samples starting at 0 + stopCounter = *(ba.if(stop&(1-stop'),0,1))+1~_ : -(1); + }; + minDelay = (LAGRANGE_ORDER-1)/2; + delayFunc(curDel) = par(i, C, de.fdelayltv(LAGRANGE_ORDER, MAX_TIME_SAMP, max(curDel, minDelay))); -echo(maxDuration,duration,feedback) = +~de.delay(maxDel,del)*feedback -with{ - maxDel = ma.SR*maxDuration; - del = ma.SR*duration; + delaySamples = ba.if(stop&(1-stop'), minDelay, _delaySamples) + delayDelta + with { + /* + Velocity describes the velocity of the read-index in units of samples per sample. + If the velocity is 1, then the read-index is moving as fast as the write-index + is moving, and there is no delay. If the velocity is 0, then the read-index is "stuck" + on a particular location. During a tape-stop, our technique is to animate velocity + from 1 to 0 according to a curve based on stopAlpha. We discretize the accumulated + delay with delayDelta. Note that when velocity is zero, then delayDelta is 1. At this + moment the delay line wrote 1 new sample (as always), but our delayDelta INCREASED by one. + This means it's playing same sample twice in a row, and the record player is motionless. + When `stop` triggers by becoming 1, then delaySamples is reset to `minDelay`. At this moment + we should have already been listening to the circuitNormal which is using `minDelay`. + Therefore, there isn't a click. + */ + velocity = curve(stopAlpha); + delayDelta = 1-velocity; + }; + + circuitNormal = delayFunc(0); // Don't use si.bus(C) because of minDelay + circuitSlowdown = delayFunc(delaySamples) : par(i, C, _*g) + with { + g = curve(gainAlpha); + }; + circuitFinal = ba.selectmulti(actualCrossfade, (circuitNormal, circuitSlowdown), stop) + with { + actualCrossfade = ba.if(stop,0,crossfade); // only crossfade when resuming normal playback + }; + }; }; -// TODO demo function for echo +declare tapeStop author "David Braun"; +declare tapeStop copyright "Copyright (C) 2024 by David Braun "; +declare tapeStop license "MIT-style STK-4.3 license"; //=======================================Pitch Shifting=================================== //======================================================================================== @@ -568,13 +977,86 @@ with{ // * `s`: shift (semitones) //----------------------------------------- transpose(w, x, s, sig) = de.fdelay(maxDelay,d,sig)*ma.fmin(d/x,1) + - de.fdelay(maxDelay,d+w,sig)*(1-ma.fmin(d/x,1)) + de.fdelay(maxDelay,d+w,sig)*(1-ma.fmin(d/x,1)) with { - maxDelay = 65536; - i = 1 - pow(2, s/12); - d = i : (+ : +(w) : fmod(_,w)) ~ _; + maxDelay = 65536; + i = 1 - pow(2, s/12); + d = i : (+ : +(w) : fmod(_,w)) ~ _; }; +//=======================================Saturators======================================= +//======================================================================================== + +nonlinearityEnv = environment +{ + // Turn a function f(x) into a odd function g(x) such that + // g(x)==f(x) for x>=0, AND g(x)==-g(-x). + makeOdd(f, x) = x : optionalNegate : f : optionalNegate + with { + optionalNegate(y) = ba.if(x<0, -y, y); + }; + + // Quadratic Soft-Clip + // coded by David Braun + // Reference: + // M. Schetzen: The Volterra and Wiener Theories of Nonlinear Systems. Robert Krieger Publishing, 1980. + softclipQuadratic(x) = makeOdd(f, x) + with { + f(x) = ba.if(x <= 1./3., 2*x, ba.if(x <= 2./3.,y,1)) + with { + y = (3-(2-3*x)^2)/3; + }; + }; + + // Wavefolder/Wavefolding + // coded by David Braun + // Reference: Chapter 10: Nonlinear Processing. Figure 10.7 + // U. Zölzer: Digital Audio Signal Processing. John Wiley & Sons Ltd, 2022. + wavefold(width, x) = makeOdd(f, x) + with { + f(x) = ba.if(x>(1-2*a), tri, x) : *(g) + with { + // a is the adjusted width. + a = width : aa.clip(0, 1) : *(.4); + g = 1/(1-2*a); // peak-level normalization + + // triangle-like function + tri = 1 - 2.5*a + a*abs(ma.frac((x-(1-2*a))/(2*a))-.5); + }; + }; +}; + +//---------------`(ef.)softclipQuadratic`------------------------------------------------- +// Quadratic softclip nonlinearity. +// +// #### Usage +// +// ``` +// _ : softclipQuadratic : _; +// ``` +//--------------------------------------------------------------------------------------- +declare softclipQuadratic author "David Braun"; + +softclipQuadratic = nonlinearityEnv.softclipQuadratic; + +//---------------`(ef.)wavefold`------------------------------------------------- +// Wavefolding nonlinearity. +// +// #### Usage +// +// ``` +// _ : wavefold(width) : _; +// ``` +// +// Where: +// +// * `width`: The width of the folded section [0..1] (float). +//--------------------------------------------------------------------------------------- +declare wavefold author "David Braun"; + +wavefold = nonlinearityEnv.wavefold; + + //////////////////////////////////Deprecated Functions//////////////////////////////////// // This section implements functions that used to be in music.lib but that are now // considered as "deprecated". diff --git a/src/static/examples/LIBRARIES/noises.lib b/src/static/examples/LIBRARIES/noises.lib index f732eaef..88118fcb 100644 --- a/src/static/examples/LIBRARIES/noises.lib +++ b/src/static/examples/LIBRARIES/noises.lib @@ -12,7 +12,7 @@ os = library("oscillators.lib"); no = library("noises.lib"); // for compatible copy/paste out of this file declare name "Faust Noise Generator Library"; -declare version "0.4"; +declare version "1.4.1"; //=============================Functions Reference======================================== //======================================================================================== @@ -150,7 +150,7 @@ noises(N,i) = noise_env(12345).noises(N,i); // ``` // //------------------------------------------------------------ -randomseed = ffunction(int arc4random(), , ""), 12345 : select2(1'); +randomseed = ffunction(int arc4random(), , ""), 12345 : select2(1'); //-----------------------`(no.)rnoise`----------------------- diff --git a/src/static/examples/LIBRARIES/oscillators.lib b/src/static/examples/LIBRARIES/oscillators.lib index 84693aa0..53b63853 100644 --- a/src/static/examples/LIBRARIES/oscillators.lib +++ b/src/static/examples/LIBRARIES/oscillators.lib @@ -59,14 +59,44 @@ fi = library("filters.lib"); si = library("signals.lib"); declare name "Faust Oscillator Library"; -declare version "0.3"; +declare version "1.5.1"; // This library contains platform specific constants pl = library("platform.lib"); +//======================Oscillators based on mathematical functions=============== +// +// Note that there is a numerical problem with several phasor functions built using the internal +// `phasor_imp`. The reason is that the incremental step is smaller than `ma.EPSILON`, which happens with very small frequencies, +// so it will have no effect when summed to 1, but it will be enough to make the fractional function wrap +// around when summed to 0. An example of this problem can be observed when running the following code: +// +// `process = os.phasor(1.0, -.001);` +// +// The output of this program is the sequence 1, 0, 1, 0, 1... This happens because the negative incremental +// step is greater than `-ma.EPSILON`, which will have no effect when summed to 1, but it will be significant +// enough to make the fractional function wrap around when summed to 0. +// +// The incremental step can be clipped to guarantee that the phasor will +// always run correctly for its full cycle, otherwise, for increments smaller than `ma.EPSILON`, +// phasor would initially run but it'd eventually get stuck once the output gets big enough. +// +// All functions using `phasor_imp` are affected by this problem, but a safer +// version is implemented, and can be used alternatively by setting `SAFE=1` in the environment using +// [explicit sustitution](https://faustdoc.grame.fr/manual/syntax/#explicit-substitution) syntax. +// +// For example: `process = os[SAFE=1;].phasor(1.0, -.001);` will use the safer implementation of `phasor_imp`. +//================================================================================= + //=========================Wave-Table-Based Oscillators=================================== +// Oscillators using tables. The table size is set by the +// [pl.tablesize](https://github.com/grame-cncm/faustlibraries/blob/master/platform.lib) constant. //======================================================================================== +// Global parameter to use the safer version of `phasor_imp`, but which +// could be used in other functions as well. + +SAFE = 0; // 0: use the faster version, 1: use the safer version //-----------------------`(os.)sinwaveform`------------------------ // Sine waveform ready to use with a `rdtable`. @@ -101,14 +131,54 @@ sinwaveform(tablesize) = coswaveform(tablesize) = cos(float(ba.period(tablesize)) * (2.0 * ma.PI) / float(tablesize)); +// Possibly faster version using integer arithmetic +phasor_env(freq, N) = environment { + + //------- GLOBAL PARAMS + nbits = 31; + tablesize = 1<>(accuracy) : /(tablesize); + + //------- MINIMAL CASE + hsp(0,0) = lambda(+(inc(freq/ma.SR)')); + + //------- GENERAL CASE + hsp(reset,phase) = lambda(select2(hard_reset,+(inc(freq/ma.SR)),inc(phase))) + with { + hard_reset = (1-1')|reset; + }; +}; +declare phasor_env author "Pierre Mascarade Relano, Maxime Sirbu, Stéphane Letz"; // Generic phasor with `reset` and `phase` parameters to be specialised in concrete use-cases. -// The `reset` must be 1 on first sample for the `phase` to be properly initialized. -phasor_imp(freq, reset, phase) = (select2(reset, +(freq/ma.SR), phase) : ma.decimal) ~ _; +phasor_imp(freq, reset, phase) = (select2(hard_reset, +(incr(SAFE)), phase) : ma.decimal) ~ _ +with { + incr_aux = freq/ma.SR; + + // Faster but less accurate version + incr(0) = incr_aux; + + // To make sure that the incremental step is greater or equal to EPSILON or + // less than or equal to -EPSILON to avoid numerical problems. + // A frequency of 0Hz can still be used to freeze the phasor. + incr(1)= (freq != 0) * ba.if(freq < 0, min(-1.0 * ma.EPSILON, incr_aux), max(ma.EPSILON, incr_aux)); + + // To correctly start at `phase` at the first sample + hard_reset = (1-1')|reset; +}; + +// Possibly faster version using integer arithmetic +// phasor_imp(freq, reset, phase) = phasor_env(freq, 16).hsp(reset, phase); // Version to be used with tables phasor_table(tablesize, freq, reset, phase) = phasor_imp(freq, reset, phase) : *(float(tablesize)); + //-----------------------`(os.)phasor`------------------------ // A simple phasor to be used with a `rdtable`. // `phasor` is a standard Faust function. @@ -123,6 +193,9 @@ phasor_table(tablesize, freq, reset, phase) = phasor_imp(freq, reset, phase) : * // // * `tablesize`: the table size // * `freq`: the frequency in Hz +// +// Note that `tablesize` is just a multiplier for the output of a unit-amp phasor +// so `phasor(1.0, freq)` can be used to generate a phasor output in the range [0, 1[. //------------------------------------------------------------ phasor(tablesize, freq) = phasor_table(tablesize, freq, 0, 0); @@ -308,6 +381,38 @@ with { osc = oscsin; +//-----------------------`(os.)m_oscsin`------------------------ +// Sine wave oscillator based on the `sin` mathematical function. +// +// #### Usage +// +// ``` +// m_oscsin(freq) : _ +// ``` +// +// Where: +// +// * `freq`: the frequency in Hz +//------------------------------------------------------------ +m_oscsin(freq) = lf_sawpos(freq) : *(2*ma.PI) : sin; + + +//-----------------------`(os.)m_osccos`------------------------ +// Sine wave oscillator based on the `cos` mathematical function. +// +// #### Usage +// +// ``` +// m_osccos(freq) : _ +// ``` +// +// Where: +// +// * `freq`: the frequency in Hz +//------------------------------------------------------------ +m_osccos(freq) = lf_sawpos(freq) : *(2*ma.PI) : cos; + + // end GRAME section //######################################################################################## /************************************************************************ @@ -523,8 +628,7 @@ lf_sawpos(freq) = phasor_imp(freq, 0, 0); declare lf_sawpos_phase author "Bart Brouns, revised by Stéphane Letz"; declare lf_sawpos_phase licence "STK-4.3"; -// Using an initial '1' to reset to `phase` -lf_sawpos_phase(freq,phase) = phasor_imp(freq, (1-1'), phase); +lf_sawpos_phase(freq,phase) = phasor_imp(freq, 0, phase); //-----------------`(os.)lf_sawpos_reset`-------------------- @@ -1167,12 +1271,12 @@ with { }; //-----------------`(os.)quadosc`-------------------- -// Sinusoidal oscillator based on QuadOsc by Martin Vicanek. +// Quadrature (cosine and sine) oscillator based on QuadOsc by Martin Vicanek. // // #### Usage // // ``` -// quadosc(freq) : _ +// quadosc(freq) : _,_ // ``` // // where @@ -1197,6 +1301,138 @@ with { }; }; +//-----------------------------`(os.)sidebands`-------------------------------------- +// Adds harmonics to quad oscillator. +// +// #### Usage +// +// ``` +// cos(x),sin(x) : sidebands(vs) : _,_ +// ``` +// +// Where: +// +// * `vs` : list of amplitudes +// +// #### Example test program +// +// ``` +// cos(x),sin(x) : sidebands((10,20,30)) +// ``` +// +// outputs: +// +// ``` +// 10*cos(x) + 20*cos(2*x) + 30*cos(3*x), +// 10*sin(x) + 20*sin(2*x) + 30*sin(3*x); +// ``` +// +// The following: +// +// ``` +// process = os.quadosc(F) : sidebands((10,20,30)) +// ``` +// +// is (modulo floating point issues) the same as: +// +// ``` +// c = os.quadosc : _,!; +// s = os.quadosc : !,_; +// process = +// 10*c(F) + 20*c(2*F) + 30*c(F), +// 10*s(F) + 20*s(2*F) + 30*s(F); +// ``` +// +// but much more efficient. +// +// #### Implementation Notes +// +// This is based on the trivial trigonometric identities: +// +// ``` +// cos((n + 1) x) = 2 cos(x) cos(n x) - cos((n - 1) x) +// sin((n + 1) x) = 2 cos(x) sin(n x) - sin((n - 1) x) +// ``` +// +// Note that the calculation of the cosine/sine parts do not depend +// on each other, so if you only need the sine part you can do: +// +// ``` +// process = os.quadosc(F) : sidebands(vs) : !,_; +// ``` +// +// and the compiler will discard the half of the calculations. +//----------------------------------------------------------------------------- +sidebands(vs, c0,s0) + = c0*vn(0),s0*vn(0), 1,c0, 0,s0 + : seq(n, outputs(vs)-1, add(vn(n+1))) + : _,_, !,!, !,! +with { + // ba.take(n+1, vs) + vn(n) = vs : route(outputs(vs),1, n+1,1); + + add(vn, co,so, cn_2,cn_1, sn_2,sn_1) = + co+cn*vn, so+sn*vn, cn_1,cn, sn_1,sn + with { + cn = 2*c0*cn_1 - cn_2; + sn = 2*c0*sn_1 - sn_2; + }; +}; + +//-----------------------------`(os.)sidebands_list`-------------------------------------- +// Creates the list of complex harmonics from quad oscillator. +// +// Similar to `sidebands` but doesn't sum the harmonics, so it is more +// generic but less convenient for immediate usage. +// +// #### Usage +// +// ``` +// cos(x),sin(x) : sidebands_list(N) : si.bus(2*N) +// ``` +// +// Where: +// +// * `N` : number of harmonics, compile time constant > 1 +// +// #### Example test program +// +// ``` +// cos(x),sin(x) : sidebands_list(3) +// ``` +// +// outputs: +// +// ``` +// cos(x),sin(x), cos(2*x),sin(2*x), cos(3*x),sin(3*x); +// ``` +// +// The following: +// +// ``` +// process = os.quadosc(F) : sidebands_list(3) +// ``` +// +// is (modulo floating point issues) the same as: +// +// ``` +// process = os.quadosc(F), os.quadosc(2*F), os.quadosc(3*F); +// ``` +// +// but much more efficient. +//----------------------------------------------------------------------------- +sidebands_list(N, c0,s0) + = c0,s0, 1,c0, 0,s0 + : seq(n, N-1, si.bus(2*(n+1)), add) + : si.bus(2*N), !,!, !,! +with { + add(cn_2,cn_1, sn_2,sn_1) = + cn,sn, cn_1,cn, sn_1,sn + with { + cn = 2*c0*cn_1 - cn_2; + sn = 2*c0*sn_1 - sn_2; + }; +}; //================ Waveguide-Resonator-Based Oscillators ================ // Sinusoidal oscillator based on the waveguide resonator `wgr`. @@ -1313,6 +1549,8 @@ released under LGPL, STK-4.3, MIT, BSD, or a similar FOSS license. // // The "res oscillators" have a resonant frequency. // "res" is the frequency of resonance as a factor of the fundamental pitch. +// +// For the `fund` waveform, use a low-frequency oscillator without anti-aliasing such as `os.lf_saw`. //===================================================================== //----------`(os.)CZsaw`---------- diff --git a/src/static/examples/LIBRARIES/phaflangers.lib b/src/static/examples/LIBRARIES/phaflangers.lib index f3da4acc..c9d3787e 100644 --- a/src/static/examples/LIBRARIES/phaflangers.lib +++ b/src/static/examples/LIBRARIES/phaflangers.lib @@ -12,7 +12,7 @@ os = library("oscillators.lib"); pf = library("phaflangers.lib"); declare name "Faust Phaser and Flanger Library"; -declare version "0.1"; +declare version "1.1.0"; //######################################################################################## /************************************************************************ diff --git a/src/static/examples/LIBRARIES/physmodels.lib b/src/static/examples/LIBRARIES/physmodels.lib index 7e8d49b6..7dcb91e6 100644 --- a/src/static/examples/LIBRARIES/physmodels.lib +++ b/src/static/examples/LIBRARIES/physmodels.lib @@ -30,7 +30,7 @@ // the previous category (e.g., nonlinear filters, etc.). // // This library is part of the Faust Physical Modeling ToolKit. -// More information on how to use this library can be found on [this page](https://ccrma.stanford.edu/~rmichon/pmFaust). Tutorials on how to make +// More information on how to use this library can be found on this [page](https://ccrma.stanford.edu/~rmichon/pmFaust) or this [video](https://faust.grame.fr/community/events/#introduction-to-the-faust-physical-modeling-toolkit-romain-michon). Tutorials on how to make // physical models of musical instruments using Faust can be found // [here](https://ccrma.stanford.edu/~rmichon/faustTutorials/#making-physical-models-of-musical-instruments-with-faust) as well. // @@ -42,7 +42,7 @@ import("stdfaust.lib"); declare name "Faust Physical Models Library"; -declare version "0.1"; +declare version "1.1.0"; /* TODO: diff --git a/src/static/examples/LIBRARIES/platform.lib b/src/static/examples/LIBRARIES/platform.lib index af91693d..2e187d21 100644 --- a/src/static/examples/LIBRARIES/platform.lib +++ b/src/static/examples/LIBRARIES/platform.lib @@ -40,11 +40,14 @@ closed source license or any other license if you decide so. ************************************************************************/ declare name "Generic Platform Library"; -declare version "0.3"; +declare version "1.3.0"; //---------------------------------`(pl.)SR`----------------------------------- // Current sampling rate (between 1 and 192000Hz). Constant during -// program execution. +// program execution. Setting this value to a constant will allow the +// compiler to optimize the code by computing constant expressions at +// compile time, and can be valuable for performance, especially on +// embedded systems. //----------------------------------------------------------------------------- SR = min(192000.0, max(1.0, fconstant(int fSamplingFreq, ))); @@ -54,6 +57,8 @@ SR = min(192000.0, max(1.0, fconstant(int fSamplingFreq, ))); BS = min(16384.0, max(1.0, fvariable(int count, ))); //---------------------------------`(pl.)tablesize`---------------------------- -// Oscillator table size +// Oscillator table size. This value is used to define the size of the +// table used by the oscillators. It is usually a power of 2 and can be lowered +// to save memory. The default value is 65536. //----------------------------------------------------------------------------- tablesize = 1 << 16; diff --git a/src/static/examples/LIBRARIES/quantizers.lib b/src/static/examples/LIBRARIES/quantizers.lib index f1cdedae..0300b12f 100644 --- a/src/static/examples/LIBRARIES/quantizers.lib +++ b/src/static/examples/LIBRARIES/quantizers.lib @@ -9,7 +9,7 @@ ba = library("basics.lib"); it = library("interpolators.lib"); declare name "Faust Frequency Quantization Library"; -declare version "0.1"; +declare version "1.1.0"; //=============================Functions Reference======================================== //======================================================================================== diff --git a/src/static/examples/LIBRARIES/reducemaps.lib b/src/static/examples/LIBRARIES/reducemaps.lib index 813650b8..3de4d630 100644 --- a/src/static/examples/LIBRARIES/reducemaps.lib +++ b/src/static/examples/LIBRARIES/reducemaps.lib @@ -1,14 +1,23 @@ -//#################################### reducemaps.lib ######################################## -// A library to handle reduce/map kind of operation in Faust. Its official prefix is `rm`. +//############################# reducemaps.lib ############################### +// A library providing reduce/map operations in Faust. Its official prefix is +// `rm`. The basic idea behind _reduce_ operations is to combine several values +// into a single one by repeatedly applying a binary operation. A typical +// example is finding the maximum of a set of values by repeatedly applying the +// binary operation `max`. +// +// In this reducemaps library, you'll find two types of _reduce_, depending on +// whether you want to reduce n consecutive samples of the same signal or a set +// of n parallel signals. // // #### References // * -//############################################################################################## +//############################################################################# /************************************************************************ ************************************************************************ FAUST library file -Copyright (C) 2010-2011 GRAME, Centre National de Creation Musicale +Copyright (C) 2023 Yann Orlarey +Copyright (C) 2010-2023 GRAME, Centre National de Creation Musicale --------------------------------------------------------------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -40,38 +49,135 @@ closed source license or any other license if you decide so. ba = library("basics.lib"); declare name "Reduce Library"; -declare author "Yann Orlarey (orlarey at grame.fr)"; -declare copyright "Grame"; -declare version "0.1"; +declare author "Yann Orlarey"; +declare copyright "Grame and Yann Orlarey"; +declare version "1.2.0"; declare license "LGPL with exception"; -//--------------------------------------------------------------- -// Provides various operations on block of samples -// using a high order 'reduce(op, n)' fold-like function : + + +//----------------------------`(rm.)parReduce`-------------------------------- +// `parReduce(op,N)` combines a set of `N` parallel signals into a single one +// using a binary operation `op`. +// +// With `parReduce`, this reduction process simultaneously occurs on each half +// of the incoming signals. In other words, `parReduce(max,256)` is equivalent +// to `parReduce(max,128),parReduce(max,128) : max`. +// +// To be used with `parReduce`, binary operation `op` must be associative. +// Additionally, the concept of a binary operation extends to operations +// that have `2*n` inputs and `n` outputs. For example, complex signals can be +// simulated using two signals for the real and imaginary parts. In +// such case, a binary operation would have 4 inputs and 2 outputs. +// +// Please note also that `parReduce` is faster than `topReduce` or `botReduce` +// for large number of signals. It is therefore the recommended operation +// whenever `op` is associative. +// +// #### Usage +// +// ``` +// _,...,_ : parReduce(op, N) : _ +// ``` +// +// Where: +// +// * `op`: is a binary operation +// * `N`: is the number of incomming signals (`N>0`). We use a capital letter +// here to indicate that the number of incomming signals must be constant and +// known at compile time. +//----------------------------------------------------------------------------- + +parReduce(op,1) = par(i,outputs(op),_); +parReduce(op,2) = op; +parReduce(op,N) = parReduce(op,int(N/2)), parReduce(op,N-int(N/2)) : op; + + + + +//----------------------------`(rm.)topReduce`-------------------------------- +// `topReduce(op,N)` involves combining a set of `N` parallel signals into a +// single one using a binary operation `op`. With `topReduce`, the reduction +// process starts from the top two incoming signals, down to the bottom. In +// other words, `topReduce(max,256)` is equivalent to `topReduce(max,255),_ : max`. +// +// Contrary to `parReduce`, the binary operation `op` doesn't have to be +// associative here. Like with `parReduce` the concept of a binary operation can be +// extended to operations that have 2*n inputs and n outputs. For example, +// complex signals can be simulated using two signals representing the real and +// imaginary parts. In such cases, a binary operation would have 4 inputs and 2 +// outputs. +// +// #### Usage +// +// ``` +// _,...,_ : topReduce(op, N) : _ +// ``` +// +// Where: +// +// * `op`: is a binary operation +// * `N`: is the number of incomming signals (`N>0`). We use a capital letter +// here to indicate that the number of incomming signals must be constant and +// known at compile time. +//----------------------------------------------------------------------------- + +topReduce(op,1) = par(i,outputs(op),_); +topReduce(op,2) = op; +topReduce(op,N) = topReduce(op,N-1), par(i,outputs(op),_) : op; + + + +//----------------------------`(rm.)botReduce`-------------------------------- +// `botReduce(op,N)` combines a set of `N` parallel signals into a single one +// using a binary operation `op`. With `botReduce`, the reduction process starts +// from the bottom two incoming signals, up to the top. In other words, +// `botReduce(max,256)` is equivalent to `_,botReduce(max,255): max`. +// +// Contrary to `parReduce`, the binary operation `op` doesn't have to be +// associative here. Like with `parReduce` the concept of a binary operation can be +// extended to operations that have 2*n inputs and n outputs. For example, +// complex signals can be simulated using two signals representing the real and +// imaginary parts. In such cases, a binary operation would have 4 inputs and 2 +// outputs. +// +// #### Usage // -// sumn(n) : the sum of a block of n input samples -// maxn(n) : the max of a block of n input samples -// minn(n) : the min of a block of n input samples -// mean(n) : the mean of a block of n input samples -// RMS(n) : the RMS of a block of n input samples -//--------------------------------------------------------------- +// ``` +// _,...,_ : botReduce(op, N) : _ +// ``` +// +// Where: +// +// * op: is a binary operation +// * N: is the number of incomming signals (`N>0`). We use a capital letter +// here to indicate that the number of incomming signals must be constant and +// known at compile time. +//----------------------------------------------------------------------------- + +botReduce(op,1) = par(i,outputs(op),_); +botReduce(op,2) = op; +botReduce(op,n) = par(i,outputs(op),_), botReduce(op,n-1) : op; -//--------------------`(rm.)reduce`------------------------------ -// Fold-like high order function. Apply a binary operation `op` -// on a block of consecutive samples of a signal `x`. -// For example: `reduce(max,128)` will compute the maximun of each -// block of 128 samples. Please note that the resulting -// value, while produced continuously, will be constant for -// the duration of a block. A new value is only produced -// at the end of a block. Note also that blocks should be of at -// least one sample (n>0). +//--------------------------------`(rm.)reduce`-------------------------------- +// Reduce a block of `n` consecutive samples of the incomming signal using a +// binary operation `op`. For example: `reduce(max,128)` will compute the +// maximun value of each block of 128 samples. Please note that the resulting +// value, while computed continuously, will be constant for the duration of a +// block. A new value is only produced at the end of a block. Note also that +// blocks should be of at least one sample (n>0). // // #### Usage // // ``` -// reduce(op, n, x) +// _ : reduce(op, n) : _ // ``` +// +// Where: +// +// * `op`: is a binary operation +// * `n`: is the number of consecutive samples in a block. //----------------------------------------------------------------------------- reduce(op, n, x) = compute ~ (_,_,_) : (!,!,_) @@ -92,8 +198,14 @@ reduce(op, n, x) = compute ~ (_,_,_) : (!,!,_) // #### Usage // // ``` -// reducemap(op, foo, n, x) +// _ : reducemap(op, foo, n) : _ // ``` +// +// Where: +// +// * `op`: is a binary operation +// * `foo`: is a function applied to the result of the reduction +// * `n`: is the number of consecutive samples in a block. //----------------------------------------------------------------------------- reducemap(op, foo, n, x) = compute ~ (_,_,_) : (!,!,_) @@ -104,7 +216,8 @@ reducemap(op, foo, n, x) = compute ~ (_,_,_) : (!,!,_) ba.if(count allpass_chain <: _,*(-1) with { // // * `N`: 2, 4, 8, ... (power of 2) // * `MAXDELAY`: power of 2 at least as large as longest delay-line length -// * `delays`: N delay lines, N a power of 2, lengths perferably coprime +// * `delays`: N delay lines, N a power of 2, lengths preferably coprime // * `BBSO`: odd positive integer = order of bandsplit desired at freqs // * `freqs`: NB-1 crossover frequencies separating desired frequency bands // * `durs`: NB decay times (t60) desired for the various bands @@ -363,6 +367,257 @@ closed source license or any other license if you decide so. ************************************************************************ ************************************************************************/ +//-------------------`(re.)vital_rev`------------------------------------------ +// A port of the reverb from the Vital synthesizer. All input parameters +// have been normalized to a continuous [0,1] range, making them easy to modulate. +// The scaling of the parameters happens inside the function. +// +// #### Usage +// +// ``` +// _,_ : vital_rev(prelow, prehigh, lowcutoff, highcutoff, lowgain, highgain, chorus_amt, chorus_freq, predelay, time, size, mix) : _,_ +// ``` +// +// Where: +// +// * `prelow`: In the pre-filter, this is the cutoff frequency of a high-pass filter (hence a low value). +// * `prehigh`: In the pre-filter, this is the cutoff frequency of a low-pass filter (hence a high value). +// * `lowcutoff`: In the feedback filter stage, this is the cutoff frequency of a low-shelf filter. +// * `highcutoff`: In the feedback filter stage, this is the cutoff frequency of a high-shelf filter. +// * `lowgain`: In the feedback filter stage, this is the gain of a low-shelf filter. +// * `highgain`: In the feedback filter stage, this is the gain of a high-shelf filter. +// * `chorus_amt`: The amount of chorus modulation in the main delay lines. +// * `chorus_freq`: The LFO rate of chorus modulation in the main delay lines. +// * `predelay`: The amount of pre-delay time. +// * `time`: The decay time of the reverb. +// * `size`: The size of the room. +// * `mix`: A wetness value to use in a final dry/wet mixer. +//----------------------------------------------------------------------------- +vital_rev(_prelow, _prehigh, _lowcutoff, _highcutoff, _lowgain, _highgain, _chorus_amt, _chorus_freq, _predelay, _time, _size, _mix) = ef.dryWetMixerConstantPower(wetAmount, reverb) : gainMakeup +with { + /* Copyright 2013-2019 Matt Tytel + * + * vital 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 3 of the License, or + * (at your option) any later version. + * + * vital 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 vital. If not, see . + */ + + /* + Adapted from https://github.com/mtytel/vital/blob/main/src/synthesis/effects/reverb.cpp + C++ author: Matt Tytel + Faust/Python author: David Braun + This is not an official product related to Vital. + + David's analysis of the code: + This technique is an example of a Feedback Delay Network (FDN) (https://ccrma.stanford.edu/~jos/pasp/FDN_Reverberation.html). + Specifically, the feedback matrix is a 16x16 Hadamard matrix that has been efficiently implemented. + + This matrix is the sum of three matrices: + * an identity matrix + * other_feedback + * adjacent_feedback + + Although other_feedback and adjacent_feedback are not orthogonal, + when all three matrices are summed together, they are orthogonal and form a Hadamard matrix (ignoring a gain factor). + The orthogonality makes it a valid FDN matrix. + + Note that other_feedback and adjacent_feedback are both 16x16 matrices. + Each is cleverly factorized into the product of a 16x4 matrix and a 4x16 matrix, + resulting in a 16x16 matrix. + + Let's use numpy to explain the matrices and eventually show that the final result is Hadamard: + + ```python + import numpy as np + from scipy.linalg import block_diag + + # Make identity matrix + identity = np.eye(16) + + # Make adjacent_matrix matrix + x = np.ones((4,)) + A = block_diag(x,x,x,x) + assert A.shape == (4,16) + adjacent_matrix = (A.T @ A)*-.5 + assert adjacent_matrix.shape == (16,16) + + # Make other_feedback + A = np.eye(4) + A = np.concatenate([A,A,A,A], axis=1) + assert A.shape == (4,16) + other_feedback = (A.T @ A)*-.5 + np.full((16,16), 1/4) + assert other_feedback.shape == (16,16) + + final_matrix = identity + adjacent_matrix + other_feedback + + # assert that final_matrix is orthogonal + assert ((final_matrix @ final_matrix.T) == identity).all() + + # assert that (final_matrix*4) is a Hadamard matrix (see Wikipedia) + N = 16 + assert np.round(np.linalg.det(final_matrix*4)) == N**(N/2) + ``` + + Other notes: + Vital's reverb is similar to dm.zita_rev1. + In this Faust port of Vital, I placed the allpasses, and matrix in the + "forward" stage. I placed the filters, decay and delay in the "feedback" stage. + Similarly, in Zita Rev, the forward stage has the allpasses and matrix, while the + feedback stage has the filters and delay. + */ + + DELAY_QUALITY = 3; // [1-3] where 3 is best, and 1 is linear interpolation + + kBaseSampleRate = 44100; // it's ok if ma.SR is not 44100, but don't change this + kT60Amplitude = 0.001; + kAllpassFeedback = 0.6; + + kMaxChorusDrift = 2500.0; // samples + kMinDecayTime = 0.1; // seconds + kMaxDecayTime = 100.0; // seconds + kMaxChorusFrequency = 16.0; // Hz + + kPreDelayMaxSec = 0.3; // seconds + + kNetworkContainers = 4; // the number of rdtables used for allpassDelay + kContainerSize = 4; // how long the allpassDelay waveforms below are + + kMinSizePower = -3; + kMaxSizePower = 1; + + clampremap(from1, from2, to1, to2) = aa.clip(from1, from2) : it.remap(from1, from2, to1, to2); + + low_pre_cutoff_frequency = _prelow : clampremap(0, 1, 16, 135) : ba.midikey2hz; + high_pre_cutoff_frequency = _prehigh : clampremap(0, 1, 16, 135) : ba.midikey2hz; + + low_cutoff_frequency = _lowcutoff : clampremap(0, 1, 16, 135) : ba.midikey2hz; + high_cutoff_frequency = _highcutoff : clampremap(0, 1, 16, 135) : ba.midikey2hz; + low_gain = _lowgain : clampremap(0, 1, -24, 0); + high_gain = _highgain : clampremap(0, 1, -24, 0); + + chorus_amount = _chorus_amt : aa.clip(0,1) : quadScale : _*kMaxChorusDrift*sample_rate_ratio*size_mult; + chorus_frequency = _chorus_freq : exp(it.remap(0, 1, -8, 3)) : min(kMaxChorusFrequency); + + pre_delay_samples = _predelay : clampremap(0, 1, 0, kPreDelayMaxSec) : _*ma.SR; + decay_samples = _time : exp(it.remap(0, 1, -6, 6)) : aa.clip(kMinDecayTime, kMaxDecayTime) : _*kBaseSampleRate; + size = _size : aa.clip(0, 1); + + wetAmount = _mix : aa.clip(0, 1); + + quadScale(x) = x*x; + + kNetworkSize = kNetworkContainers * kContainerSize; + + containerBus = si.bus(kContainerSize); + networkBus = si.bus(kNetworkSize); + + size_mult = pow(2, it.interpolate_linear(size, kMinSizePower, kMaxSizePower)); + + sample_rate_ratio = ma.SR/kBaseSampleRate; + + kAllpassMaxDelay = 1001; // manually inspect rdtables below and take max value + // allpassDelay(i) where `i` corresponds to 0 to (kNetworkContainers-1) + allpassDelay(0) = rdtable(waveform{1001, 799, 933, 876}); + allpassDelay(1) = rdtable(waveform{895, 807, 907, 853}); + allpassDelay(2) = rdtable(waveform{957, 1019, 711, 567}); + allpassDelay(3) = rdtable(waveform{833, 779, 663, 997}); + + kFeedbackMaxDelay = (11329 + kMaxChorusDrift)*sample_rate_ratio*pow(2, kMaxSizePower); // pow(2, kMaxSizePower) is the max size_mult + // feedbackDelayHelp(i) where `i` corresponds to 0 to (kNetworkContainers-1) + feedbackDelayHelp(0) = rdtable(waveform{6753.2, 9278.4, 7704.5, 11328.5}); + feedbackDelayHelp(1) = rdtable(waveform{9701.12, 5512.5, 8480.45, 5638.65}); + feedbackDelayHelp(2) = rdtable(waveform{3120.73, 3429.5, 3626.37, 7713.52}); + feedbackDelayHelp(3) = rdtable(waveform{4521.54, 6518.97, 5265.56, 5630.25}); + feedbackDelay(i) = feedbackDelayHelp(i) : _ * size_mult * sample_rate_ratio; + + getDecay(i, j) = pow(kT60Amplitude, feedbackDelay(i, j) / (decay_samples*sample_rate_ratio)); + + pre_delay = sp.stereoize(de.fdelayltv(N, kPreDelayMaxSec*ma.SR, safe_delay_samples)) + with { + safe_delay_samples = pre_delay_samples : max((N-1)/2); + N = DELAY_QUALITY; + }; + + pre_filter = sp.stereoize(fi.highpass(1, low_pre_cutoff_frequency) : fi.lowpass(1, high_pre_cutoff_frequency) : _/kNetworkContainers); + + // mathematical hard-syncing phasor (see `phasor_imp` in `faustlibraries/oscillators.lib`) + m_lfo_sine(freq, phase) = ((select2(hard_reset, +(freq/ma.SR), phase) : ma.decimal) ~ _) : sin(_*2*ma.PI) + with { + hard_reset = (1-1'); // To correctly start at `phase` at the first sample + }; + + phase_offset(i) = i / kNetworkSize; + real_part(phase_offset) = m_lfo_sine(chorus_frequency, phase_offset + .25); // "real" cosine part + imag_part(phase_offset) = m_lfo_sine(chorus_frequency, phase_offset); // "imaginary" sine part + + lfo1(i) = phase_offset(i) : real_part; + lfo2(i) = phase_offset(i) : imag_part; + + mydelay(delay_samples) = de.fdelayltv(N, kFeedbackMaxDelay, safe_delay_samples) + with { + safe_delay_samples = delay_samples : max((N-1)/2); + N = DELAY_QUALITY; + }; + + delay = par(i, kContainerSize, mydelay(feedbackDelay(0, i) + lfo1(i)*chorus_amount)), + par(i, kContainerSize, mydelay(feedbackDelay(1, i) - lfo1(i)*chorus_amount)), + par(i, kContainerSize, mydelay(feedbackDelay(2, i) + lfo2(i)*chorus_amount)), + par(i, kContainerSize, mydelay(feedbackDelay(3, i) - lfo2(i)*chorus_amount)); + + allpass(j) = par(i, kContainerSize, fi.allpass_comb(kAllpassMaxDelay, allpassDelay(j, i), kAllpassFeedback)); + allpasses = par(i, kNetworkContainers, allpass(i)); + + filters = par(i, kNetworkSize, + (fi.lowshelf(1, low_gain, low_cutoff_frequency) : fi.highshelf(1, high_gain, high_cutoff_frequency)) + ); + + other_feedback = total_rows <: (containerBus :> _/kContainerSize <: containerBus), par(i, kContainerSize, _*-.5) :> containerBus <: networkBus + with { + total_rows = networkBus :> containerBus; + }; + + adjacent_feedback = par(i, kNetworkContainers, containerBus :>_) : par(i, kNetworkContainers, _*s) <: par(i, kNetworkContainers, _<: containerBus) + with { + s = -.5*kNetworkContainers/kContainerSize; + }; + + decay = par(i, kNetworkContainers, par(j, kContainerSize, _*getDecay(i, j))); + + matrix = networkBus <: networkBus, other_feedback, adjacent_feedback :> networkBus; + + reverb = + // PRE + pre_delay : pre_filter <: + + // BODY + (networkBus, networkBus :> allpasses : matrix) + ~ + // FEEDBACK + (filters : decay : delay) + + // POST + // todo: It's odd that we have to swap the channels with ro.crossnn. + // This might be covering up some other mistake. + :> par(i, 2, _*2/kNetworkContainers) : ro.crossnn(1); + + // dryWetMixerConstantPower causes an "insertion loss" when wet is not 50%. + // So a choice of 0% wet would actually have less volume than not using the reverb at all. + // We can makeup for this insertion loss by undoing the sqrt(2) division inside dryWetMixerConstantPower. + gainMakeup = _*sqrt(2), _*sqrt(2); +}; + +declare vital_rev author "David Braun"; +declare vital_rev license "GPL-3.0"; + //===============================Freeverb=================================== //========================================================================== @@ -543,8 +798,8 @@ jp_gh_rev = environment { : ((si.bus(4) :> si.bus(2) : block : rotator(angle) - : (de.fdelay1a(8192, prime_delays(size*scale1):smooth_init(0.9999,prime_delays(size*scale1)) -1), - de.fdelay1a(8192, prime_delays(size*scale2):smooth_init(0.9999,prime_delays(size*scale2)) -1))) + : (de.fdelay1a(8192, ma.primes(size*scale1):smooth_init(0.9999,ma.primes(size*scale1)) -1), + de.fdelay1a(8192, ma.primes(size*scale2):smooth_init(0.9999,ma.primes(size*scale2)) -1))) ~ par(i,2,*(-s_norm))) : par(i,2,mem:*(c_norm))) , par(i,2,*(s_norm))) @@ -565,10 +820,9 @@ jp_gh_rev = environment { diffuser_nested(1, angle, g, scale, size) = diffuser_aux(angle,g,scale,scale+10,size,si.bus(2)); diffuser_nested(N, angle, g, scale, size) = diffuser_aux(angle,g,scale,scale+10,size,diffuser_nested(N-1,angle,g,scale+13,size)); - prime_delays(x) = (waveform {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667}, int(x)) : rdtable; - smooth_init(s,default) = *(1.0 - s) : + ~ (+(default*init(1)):*(s)) with { init(value) = value - value'; }; + invSqrt2 = 1/sqrt(2); jpverb(t60, damp, size, early_diff, mod_depth, mod_freq, low, mid, high, low_cutoff, high_cutoff) = ((si.bus(4) :> (de.fdelay4(512, depth + depth*os.oscrs(mod_freq) + 5),de.fdelay4(512, depth + depth*os.oscrc(mod_freq) + 5)) : par(i,2,si.smooth(damp)) @@ -576,14 +830,14 @@ jp_gh_rev = environment { : diffuser(ma.PI/4,early_diff,215,85,size) : diffuser(ma.PI/4,early_diff,115,190,size) : diffuser(ma.PI/4,early_diff,175,145,size) - )~(seq(i,5,diffuser(ma.PI/4,0.707,10+30*i,110+30*i,size)) + )~(seq(i,5,diffuser(ma.PI/4,invSqrt2,10+30*i,110+30*i,size)) : par(i,2,de.fdelay4(512, depth + (-1^i)*depth*os.oscrc(mod_freq)+5) - : de.fdelay1a(8192,(prime_delays(size*(54+150*i)) - : smooth_init(0.995,prime_delays(size*(54+150*i)))) -1)) - : seq(i,5,diffuser(ma.PI/4,0.707,125+30*i,25+30*i,size)) + : de.fdelay1a(8192,(ma.primes(size*(54+150*i)) + : smooth_init(0.995,ma.primes(size*(54+150*i)))) -1)) + : seq(i,5,diffuser(ma.PI/4,invSqrt2,125+30*i,25+30*i,size)) : par(i,2,de.fdelay4(8192, depth + (-1^i)*depth*os.oscrs(mod_freq)+5) - : de.fdelay1a(8192,(prime_delays(size*(134-100*i)) - : smooth_init(0.995,prime_delays(size*(134-100*i)))) -1)) + : de.fdelay1a(8192,(ma.primes(size*(134-100*i)) + : smooth_init(0.995,ma.primes(size*(134-100*i)))) -1)) : par(i,2,fi.filterbank(5,(low_cutoff,high_cutoff)):(_*(high),_*(mid),_*(low)) :> _) : par(i,2,*(fb)))) with { @@ -625,16 +879,16 @@ jp_gh_rev = environment { // Where: // // * `t60`: approximate reverberation time in seconds ([0.1..60] sec) (T60 - the time for the reverb to decay by 60db when damp == 0 ). Does not effect early reflections -// * `damp`: controls damping of high-frequencies as the reverb decays. 0 is no damping, 1 is very strong damping. Values should be between ([0..1]) -// * `size`: scales size of delay-lines within the reverberator, producing the impression of a larger or smaller space. Values below 1 can sound metallic. Values should be between [0.5..5] -// * `early_diff`: controls shape of early reflections. Values of 0.707 or more produce smooth exponential decay. Lower values produce a slower build-up of echoes. Values should be between ([0..1]) -// * `mod_depth`: depth ([0..1]) of delay-line modulation. Use in combination with mod_freq to set amount of chorusing within the structure -// * `modFreq`: frequency ([0..10] Hz) of delay-line modulation. Use in combination with modDepth to set amount of chorusing within the structure +// * `damp`: controls damping of high-frequencies as the reverb decays. 0 is no damping, 1 is very strong damping. Values should be in the range ([0..1]) +// * `size`: scales size of delay-lines within the reverberator, producing the impression of a larger or smaller space. Values below 1 can sound metallic. Values should be in the range [0.5..5] +// * `early_diff`: controls shape of early reflections. Values of 0.707 or more produce smooth exponential decay. Lower values produce a slower build-up of echoes. Values should be in the range ([0..1]) +// * `mod_depth`: depth ([0..1]) of delay-line modulation. Use in combination with `mod_freq` to set amount of chorusing within the structure +// * `mod_freq`: frequency ([0..10] Hz) of delay-line modulation. Use in combination with `mod_depth` to set amount of chorusing within the structure // * `low`: multiplier ([0..1]) for the reverberation time within the low band // * `mid`: multiplier ([0..1]) for the reverberation time within the mid band // * `high`: multiplier ([0..1]) for the reverberation time within the high band -// * `lowcut`: frequency (100..6000 Hz) at which the crossover between the low and mid bands of the reverb occurs -// * `highcut`: frequency (1000..10000 Hz) at which the crossover between the mid and high bands of the reverb occurs +// * `low_cutoff`: frequency (100..6000 Hz) at which the crossover between the low and mid bands of the reverb occurs +// * `high_cutoff`: frequency (1000..10000 Hz) at which the crossover between the mid and high bands of the reverb occurs // // #### Reference // @@ -666,12 +920,11 @@ jpverb(t60, damp, size, early_diff, // // * `dt`: approximate reverberation time in seconds ([0.1..60 sec]) // * `damp`: controls damping of high-frequencies as the reverb decays. 0 is no damping, 1 is very strong damping. Values should be between ([0..1]) -// * `size`: scales size of delay-lines within the diffusion unit, producing the impression of a larger or smaller space. Values below 1 can sound metallic. Values should be between ([0.5..5]) -// * `size`: control of relative "room size" roughly between ([0.5..3]) +// * `size`: control of relative "room size" roughly in the range ([0.5..3]) // * `early_diff`: controls pattern of echoes produced by the diffuser. At very low values, the diffuser acts like a delay-line whose length is controlled by the 'size' parameter. Medium values produce a slow build-up of echoes, giving the sound a reversed-like quality. Values of 0.707 or greater than produce smooth exponentially decaying echoes. Values should be in the range ([0..1]) // * `feedback`: amount of feedback through the system. Sets the number of repeating echoes. A setting of 1.0 produces infinite sustain. Values should be in the range ([0..1]) -// * `mod_depth`: depth ([0..1]) of delay-line modulation. Use in combination with mod_freq to produce chorus and pitch-variations in the echoes -// * `mod_freq`: frequency ([0..10] Hz) of delay-line modulation. Use in combination with mod_depth to produce chorus and pitch-variations in the echoes +// * `mod_depth`: depth ([0..1]) of delay-line modulation. Use in combination with `mod_freq` to produce chorus and pitch-variations in the echoes +// * `mod_freq`: frequency ([0..10] Hz) of delay-line modulation. Use in combination with `mod_depth` to produce chorus and pitch-variations in the echoes // // #### Reference // diff --git a/src/static/examples/LIBRARIES/routes.lib b/src/static/examples/LIBRARIES/routes.lib index e1241f3e..9a268d30 100644 --- a/src/static/examples/LIBRARIES/routes.lib +++ b/src/static/examples/LIBRARIES/routes.lib @@ -42,7 +42,7 @@ si = library("signals.lib"); sp = library("spats.lib"); declare name "Faust Signal Routing Library"; -declare version "0.2"; +declare version "1.2.0"; //=============================Functions Reference======================================== //======================================================================================== diff --git a/src/static/examples/LIBRARIES/signals.lib b/src/static/examples/LIBRARIES/signals.lib index c0a4b8ea..74b2c3c5 100644 --- a/src/static/examples/LIBRARIES/signals.lib +++ b/src/static/examples/LIBRARIES/signals.lib @@ -48,7 +48,7 @@ ma = library("maths.lib"); si = library("signals.lib"); declare name "Faust Signal Routing Library"; -declare version "0.3"; +declare version "1.5.0"; //=============================Functions Reference======================================== //======================================================================================== @@ -104,6 +104,45 @@ block(N) = par(i, N, !); //----------------------------------------------------------------------------- interpolate(i,x,y) = x + i*(y-x); +//---------------`(si.)repeat`---------------------------------------------- +// Repeat an effect N time(s) and take the parallel sum of all +// intermediate buses. +// +// #### References +// * +// +// #### Usage +// +// ``` +// si.bus(inputs(FX)) : repeat(N, FX) : si.bus(outputs(FX)) +// ``` +// +// Where: +// +// * `N`: Number of repetitions, minimum of 1, a constant numerical expression +// * `FX`: an arbitrary effect (N inputs and N outputs) that will be repeated +// +// Example 1: +// ``` +// process = repeat(2, dm.zita_light) : _*.5,_*.5; +// ``` +// +// Example 2: +// ``` +// N = 4; +// C = 2; +// fx(i) = i+1, par(j, C, @(i*5000)); +// process = 0, si.bus(C) : repeat(N, fx) : !, par(i, C, _*.2/N); +// ``` +//--------------------------------------------------------------------------- +declare repeat author "Yann Orlarey and Stéphane Letz, revised by David Braun"; + +repeat(1, FX) = FX; +repeat(n, FX) = FX <: si.bus(N), repeat(n-1, FX) :> si.bus(N) +with { + N = outputs(FX); +}; + //------------------------`(si.)smoo`--------------------------------------- // Smoothing function based on `smooth` ideal to smooth UI signals // (sliders, etc.) down. Approximately, this is a 7 Hz one-pole @@ -253,6 +292,57 @@ smooth_imp = case { // Other versions could possibly be faster on embedded devices. smooth = smooth_imp(0); + +//--------------------------------`(si.)smoothq`------------------------------------- +// Smoothing with continuously variable curves from Exponential to Linear, with a constant time. +// +// #### Usage +// +// ``` +// _ : smoothq(time, q) : _; +// ``` +// +// Where: +// +// * `time`: seconds to reach target +// * `q`: curve shape (between 0..1, 0 is Exponential, 1 is Linear) +//----------------------------------------------------------------------------- +declare smoothq author "Andrew John March"; +declare smoothq licence "STK-4.3"; + +smoothq(time, q, tar) = envelope + with { + ratio = pow(q, 5) * 32 : max(0.001); + coef = (ratio / (1 + ratio))^(1 / (ma.SR * time)); + fb(cBase, cTar, cSrc, cDistance, cDir, cY, cOut) = base, tar, src, distance, dir, y, out + with { + trig = cTar != tar; + src = select2(trig, cSrc, cOut); + dir = select2(trig, cDir, tar > src); + base = select2(trig, cBase, select2(dir, + (0.0 - ratio) * (1.0 - coef), + (1.0 + ratio) * (1.0 - coef) + )); + distance = select2(trig, cDistance, abs(tar - src)); + y = select2(dir, + select2(trig, + max( 0, base + cY * coef), + 1 + ), + select2(trig, + min( 1, base + cY * coef), + 0 + ) + ); + out = select2(dir, + tar + y * distance, + src + y * distance + ); + }; + envelope = fb ~ (_,_,_,_,_,_,_) : !,!,!,!,!,!,_; + }; + + //--------------------------------`(si.)cbus`------------------------------------- // N parallel cables for complex signals. // `cbus` is a standard Faust function. diff --git a/src/static/examples/LIBRARIES/soundfiles.lib b/src/static/examples/LIBRARIES/soundfiles.lib index 154672a7..e7ba42ed 100644 --- a/src/static/examples/LIBRARIES/soundfiles.lib +++ b/src/static/examples/LIBRARIES/soundfiles.lib @@ -44,7 +44,7 @@ ro = library("routes.lib"); it = library("interpolators.lib"); declare name "Faust Soundfile Library"; -declare version "0.7"; +declare version "1.7.0"; //======================================================================= // Utility functions added in a 'super' environment (to test the idea...) diff --git a/src/static/examples/LIBRARIES/spats.lib b/src/static/examples/LIBRARIES/spats.lib index 3ca4cebd..74b764f7 100644 --- a/src/static/examples/LIBRARIES/spats.lib +++ b/src/static/examples/LIBRARIES/spats.lib @@ -40,9 +40,10 @@ closed source license or any other license if you decide so. ************************************************************************/ si = library("signals.lib"); +ma = library("maths.lib"); declare name "Faust Spatialization Library"; -declare version "0.0"; +declare version "1.1.0"; //-----------------------`(sp.)panner`------------------------ // A simple linear stereo panner. @@ -63,6 +64,33 @@ panner(g) = _ <: *(1-g), *(g); // TODO: need demo function for panner here +//---------------`(sp.)constantPowerPan`---------------------- +// Apply the constant power pan rule to a stereo signal. +// The channels are not respatialized. Their gains are simply +// adjusted. A pan of 0 preserves the left channel and silences +// the right channel. A pan of 1 has the opposite effect. +// A pan value of 0.5 applies a gain of 0.5 to both channels. +// +// #### Usage +// +// ``` +// _,_ : constantPowerPan(p) : _,_ +// ``` +// +// Where: +// +// * `p`: the panning (0-1) +//------------------------------------------------------------ +declare dryWetMixer author "David Braun"; + +constantPowerPan(p, x, y) = x*gainLeft, y*gainRight +with { + theta = ma.PI*p/2.; + gainLeft = cos(theta)/sqrt(2.); + gainRight = sin(theta)/sqrt(2.); +}; + + //-----------------------`(sp.)spat`------------------------ // GMEM SPAT: n-outputs spatializer. // `spat` is a standard Faust function. @@ -70,21 +98,21 @@ panner(g) = _ <: *(1-g), *(g); // #### Usage // // ``` -// _ : spat(n,r,d) : _,_,... +// _ : spat(N,r,d) : si.bus(N) // ``` // // Where: // -// * `n`: number of outputs +// * `N`: number of outputs (a constant numerical expression) // * `r`: rotation (between 0 et 1) // * `d`: distance of the source (between 0 et 1) //------------------------------------------------------ declare spat author "Laurent Pottier, revised by Romain Michon"; -spat(n,a,d) = _ <: par(i, n, *( scaler(i, n, a, d) : si.smooth(0.9999) )) +spat(N,a,d) = _ <: par(i, N, *(scaler(i, N, a, d) : si.smooth(0.9999))) with { - scaler(i,n,a,d) = (d/2.0+0.5) - * sqrt( max(0.0, 1.0 - abs(fmod(a+0.5+float(n-i)/n, 1.0) - 0.5) * n * d) ); + scaler(i,N,a,d) = (d/2.0+0.5) + * sqrt(max(0.0, 1.0 - abs(fmod(a+0.5+float(N-i)/N, 1.0) - 0.5) * N * d)); }; diff --git a/src/static/examples/LIBRARIES/synths.lib b/src/static/examples/LIBRARIES/synths.lib index 44573864..d721354f 100644 --- a/src/static/examples/LIBRARIES/synths.lib +++ b/src/static/examples/LIBRARIES/synths.lib @@ -45,11 +45,11 @@ os = library("oscillators.lib"); no = library("noises.lib"); declare name "Faust Synthesizer Library"; -declare version "0.1"; +declare version "1.1.0"; -//-----------------------------------`(sy.)popFilterPerc`-------------------------------------- +//-----------------------------------`(sy.)popFilterDrum`-------------------------------------- // A simple percussion instrument based on a "popped" resonant bandpass filter. -// `popFilterPerc` is a standard Faust function. +// `popFilterDrum` is a standard Faust function. // // #### Usage // @@ -59,7 +59,7 @@ declare version "0.1"; // // Where: // -// * `freq`: the resonance frequency of the instrument +// * `freq`: the resonance frequency of the instrument in Hz // * `q`: the q of the res filter (typically, 5 is a good value) // * `gate`: the trigger signal (0 or 1) //---------------------------------------------------------------------------------------- @@ -80,7 +80,7 @@ popFilterDrum(freq,q,gate) = en.ar(0.001,0.001,gate)*no.noise : fi.resonbp(freq, // // Where: // -// * `freq`: frequency of the sawtooth +// * `freq`: frequency of the sawtooth in Hz // * `ctFreq`: cutoff frequency of the filter // * `q`: Q of the filter // * `gate`: the trigger signal (0 or 1) @@ -101,13 +101,12 @@ with { // #### Usage // // ``` -// sawTrombone(att,freq,gain,gate) : _ +// sawTrombone(freq,gain,gate) : _ // ``` // // Where: // -// * `att`: exponential attack duration in s (typically 0.01) -// * `freq`: the frequency +// * `freq`: the frequency in Hz // * `gain`: the gain (0-1) // * `gate`: the gate (0 or 1) //---------------------------------------------------------------------------------------- @@ -133,7 +132,7 @@ with { // // Where: // -// * `freq`: the frequency of the string +// * `freq`: the frequency of the string in Hz // * `res`: string T60 (resonance time) in second // * `gate`: trigger signal (0 or 1) //---------------------------------------------------------------------------------------- @@ -161,7 +160,7 @@ with { // // Where: // -// * `freq`: the resonance frequency of the drum +// * `freq`: the resonance frequency of the drum in Hz // * `freqRatio`: a list of ratio to choose the frequency of the mode in // function of `freq` e.g.(1 1.2 1.5 ...). The first element should always // be one (fundamental). @@ -175,12 +174,12 @@ with { //---------------------------------------------------------------------------------------- declare additiveDrum author "Romain Michon"; -additiveDrum(freq,freqRatio,gain,modeDec,att,rel,gate) = par(i,N,os.osc(modeFreq(i))*gainEnvelope(i)) :> _ +additiveDrum(freq,freqRatio,gain,harmDec,att,rel,gate) = par(i,N,os.osc(modeFreq(i))*gainEnvelope(i)) :> _ with { N = ba.count(freqRatio); modeFreq(i) = freq*ba.take(i+1,freqRatio); modeGain(i) = ba.take(i+1,gain); - gainEnvelope(i) = modeGain(i)*en.ar(att,rel*(1-(modeDec*(i/N))),gate); + gainEnvelope(i) = modeGain(i)*en.ar(att,rel*(1-(harmDec*(i/N))),gate); }; diff --git a/src/static/examples/LIBRARIES/tonestacks.lib b/src/static/examples/LIBRARIES/tonestacks.lib index c8ba6bb3..2efaa19e 100644 --- a/src/static/examples/LIBRARIES/tonestacks.lib +++ b/src/static/examples/LIBRARIES/tonestacks.lib @@ -31,7 +31,7 @@ fi = library("filters.lib"); declare name "Faust Tonestack Emulation Library"; declare author "Guitarix project ()"; declare copyright "Guitarix project"; -declare version "0.28"; +declare version "1.28.0"; declare license "LGPL"; /**************************************************************** diff --git a/src/static/examples/LIBRARIES/tubes.lib b/src/static/examples/LIBRARIES/tubes.lib index 637c1d3c..a5a47d49 100644 --- a/src/static/examples/LIBRARIES/tubes.lib +++ b/src/static/examples/LIBRARIES/tubes.lib @@ -25,6 +25,8 @@ fi = library("filters.lib"); +declare version "1.0.0"; + /******************************************************************************* * 1-dimensional function tables for linear interpolation *******************************************************************************/ diff --git a/src/static/examples/LIBRARIES/vaeffects.lib b/src/static/examples/LIBRARIES/vaeffects.lib index 4e1b8c65..21798ca5 100644 --- a/src/static/examples/LIBRARIES/vaeffects.lib +++ b/src/static/examples/LIBRARIES/vaeffects.lib @@ -12,7 +12,7 @@ fi = library("filters.lib"); ef = library("misceffects.lib"); declare name "Faust Virtual Analog Filter Effect Library"; -declare version "0.2"; +declare version "1.2.1"; //######################################################################################## /************************************************************************ @@ -162,9 +162,10 @@ with { v4 + lp4 , // define s4 lp4 // system output with { + invSqrt2 = 1/sqrt(2); T = 1.0 / ma.SR; cf = normFreq * .5 * ma.SR; - k = 4.0 * (Q - 0.707) / (25.0 - 0.707); + k = 4.0 * (Q - invSqrt2) / (25.0 - invSqrt2); omegaWarp = tan(ma.PI * cf * T); g = omegaWarp / (1.0 + omegaWarp); G = g * g * g * g; // ladder's G in generalised form y = G * xi + S @@ -217,8 +218,9 @@ letrec{ 'y = -(s3*B3*k):-(s2*B2*k):-(s1*B1*k):*(alpha0):-(s1):*(alpha):+(s1):-(s2):*(alpha):+(s2) <:_*-1,((-(s3):*(alpha):+(s3))*2):>_; } with{ + invSqrt2 = 1/sqrt(2); freq = 2*(10^(3*normFreq+1)); - k = 2.0*(Q - 0.707)/(25.0 - 0.707); + k = 2.0*(Q - invSqrt2)/(25.0 - invSqrt2); wd = 2*ma.PI*freq; T = 1/ma.SR; wa = (2/T)*tan(wd*T/2); @@ -328,7 +330,8 @@ letrec{ } with{ freq = 2*(10^(3*normFreq+1)); - k = (17 - (normFreq^10)*9.7)*(Q - 0.707)/(25.0 - 0.707); + invSqrt2 = 1/sqrt(2); + k = (17 - (normFreq^10)*9.7)*(Q - invSqrt2)/(25.0 - invSqrt2); wd = 2*ma.PI*freq; T = 1/ma.SR; wa = (2/T)*tan(wd*T/2); @@ -403,8 +406,9 @@ letrec{ 'y = _-s1:_*alpha:_+s1:_+(s3*B3):_+(s2*B2) :_*alpha0:_-s3:_*alpha:_+s3; } with{ + invSqrt2 = 1/sqrt(2); freq = 2*(10^(3*normFreq+1)); - K = 2.0*(Q - 0.707)/(10.0 - 0.707); + K = 2.0*(Q - invSqrt2)/(10.0 - invSqrt2); wd = 2*ma.PI*freq; T = 1/ma.SR; wa = (2/T)*tan(wd*T/2); @@ -442,8 +446,9 @@ letrec{ 'y = _<:(_-s1:_*alpha:_+s1)*-1,_:>_+(s3*B3):_+(s2*B2):_*alpha0; } with{ + invSqrt2 = 1/sqrt(2); freq = 2*(10^(3*normFreq+1)); - K = 2.0*(Q - 0.707)/(10.0 - 0.707); + K = 2.0*(Q - invSqrt2)/(10.0 - invSqrt2); wd = 2*ma.PI*freq; T = 1/ma.SR; wa = (2/T)*tan(wd*T/2); diff --git a/src/static/examples/LIBRARIES/version.lib b/src/static/examples/LIBRARIES/version.lib index b5f3f45b..4981c746 100644 --- a/src/static/examples/LIBRARIES/version.lib +++ b/src/static/examples/LIBRARIES/version.lib @@ -16,7 +16,7 @@ // //------------------------------------------------------------ version = 2, // MAJOR version when we make incompatible API changes, - 15, // MINOR version when we add functionality in a backwards compatible manner, + 37, // MINOR version when we add functionality in a backwards compatible manner, 0; // PATCH version when we make backwards compatible bug fixes. diff --git a/src/static/examples/LIBRARIES/wdmodels.lib b/src/static/examples/LIBRARIES/wdmodels.lib index 5796fd98..d9266e46 100644 --- a/src/static/examples/LIBRARIES/wdmodels.lib +++ b/src/static/examples/LIBRARIES/wdmodels.lib @@ -244,7 +244,7 @@ ma = library("maths.lib"); si = library("signals.lib"); declare name "Faust Wave Digital Model Library"; -declare version "0.2.1"; +declare version "1.2.1"; //=============================Algebraic One Port Adaptors================================= diff --git a/src/static/examples/LIBRARIES/webaudio.lib b/src/static/examples/LIBRARIES/webaudio.lib index e524991f..87eaab3a 100644 --- a/src/static/examples/LIBRARIES/webaudio.lib +++ b/src/static/examples/LIBRARIES/webaudio.lib @@ -46,7 +46,7 @@ fi = library("filters.lib"); declare name "Faust WebAudio Filters Library"; declare author "GRAME"; declare copyright "GRAME"; -declare version "0.1"; +declare version "1.1.0"; declare license "LGPL with exception"; //--------------------------------------------------- diff --git a/src/static/examples/gameaudio/complex_rain.dsp b/src/static/examples/gameaudio/complex_rain.dsp new file mode 100644 index 00000000..e7d7132f --- /dev/null +++ b/src/static/examples/gameaudio/complex_rain.dsp @@ -0,0 +1,83 @@ +import("stdfaust.lib"); + +//------------------------`rain_on_window`-------------------- +// rain_on_window : produces a sound of raindrops on a glass +// window, based on examples +// from the book "Designing Sound" +// by Andy Farnell +// +// #### Usage +// +// ``` +// rain_on_window : _ +// ``` +// +// #### Examples +// +// ``` +// rain_on_window <: (_, _); +// ``` +// +//------------------------------------------------------------ + +//------------------------`ambient_rain`---------------------- +// ambient_rain(freq) : produces a ambient rain sound, +// based on examples +// from the book "Designing Sound" +// by Andy Farnell +// +// #### Usage +// +// ``` +// ambient_rain(freq) : _ +// ``` +// +// Where: +// +// * `freq`: general frequency of the raindrops, best results +// in the range 5-50 +// +// #### Examples +// +// ``` +// ambient_rain(10) <: (_, _); +// ``` +// +//------------------------------------------------------------ + +path(d, g, f1, f2, f1o, f2o, q, s) = (+(s) : de.delay(300, ds) : *(g) <: + (flt(f2, f2o), flt(f1, f1o), _)) ~ (_) : (si.block(1), _, _) + with { + ds = ba.sec2samp(d / 1000); + flt(f, fo) = fi.resonbp(f, q, 1) * os.osc(fo); + }; + +glasswindow = (reroutei : (path1, path2) : rerouteo) ~ (_, _) : (si.block(2), _) + with { + path1 = path(3.7, 0.61, 2007, 1994, 254, 669, 2.3); + path2 = path(4.2, 0.61, 1986, 1969, 443, 551, 2.3); + reroutei(i1, i2, i3) = (i3 + i2, i3 + i1); + rerouteo(p1a, p1b, p2a, p2b) = (p1a, p2a, p1b + p2b); + }; + +drops = out + with { + normcos(s) = cos(2 * ma.PI * s); + noise = no.gnoise(10) : fi.resonbp(50, 1, 2) : fi.lowpass(1, 500); + right = noise * noise : *(10); + left = (noise * 80) + 40 : os.phasor(1): -(0.25) : normcos; + hip = fi.highpass(1, 500); + out = left * right : max(0.35) : -(0.35) : *(0.5) : hip : hip; + }; + +rain_on_window = drops : fi.highpass(1, 9000) : *(15) : glasswindow; + +ambient_rain(f) = drops2(f, 0.013, 0.05, 0.1) + with { + drops2(f, q, t, a) = no.noise : fi.resonbp(f, q, 200) : aa.clip(0, 1) : + max(t) : -(t) : sq : sq : *(a) : fi.highpass(1, 2000); + sq(x) = x * x; + }; + +process = rain_on_window + ambient_rain(10) : sp.spat(2, 0.1, 1); + diff --git a/src/static/examples/gameaudio/thunder.dsp b/src/static/examples/gameaudio/thunder.dsp new file mode 100644 index 00000000..4c80da07 --- /dev/null +++ b/src/static/examples/gameaudio/thunder.dsp @@ -0,0 +1,97 @@ +import("stdfaust.lib"); + +//---------------------------`thunder`------------------------ +// thunder(trig) : produces a rumbling thunder, +// based on examples +// from the book "Designing Sound" +// by Andy Farnell +// +// #### Usage +// +// ``` +// thunder(trig) : _ +// ``` +// +// Where: +// +// * `trig`: the trigger impulse +// +// #### Examples +// +// ``` +// button("rumble") : ba.impulsify : thunder; +// ``` +// +//------------------------------------------------------------ + +N = 6; +TM = 100; + +strike(t, v) = t : e : *(no.noise) <: (fi.resonbp(f1, 3, 1), + fi.resonbp(f2, 3, 1)) :> (_) + with { + vh = ba.sAndH(t, v); + f1 = vh * 1200 + 100; + f2 = f1 * 0.5; + a = 1 - vh + 0.4 : pow(5) : *(200); + e = en.ar(0, a / 1000); + }; + +delay(t, d) = a : edge + with + { + dd = d : ba.sAndH(t); + a = en.ar(dd / 1000, 0, t); + edge(s) = (s' != 0) & (s == 0); + }; + +integ_with_reset(s) = +(s) ~ (b) + with { + b(s) = ba.if(s < TM, s, 0); + }; + +trig_and_delay(t, r) = s, d + with { + d = t * (r / 25) : integ_with_reset; + s = ba.if(d < TM, t, 0); + }; + +strikepattern(t) = out : (_, scale) + with { + rnd = round(abs(no.noise) * (TM-1)); + rnd_out(t) = rnd : ba.sAndH(t); + out = t : ((+) <: (_, rnd_out) : trig_and_delay) ~ (delay); + scale(x) = (TM - x) / TM; + }; + +multistrike(t) = out : *(0.5) + with { + pat = t : strikepattern; + fst(a, b) = a; + snd(a, b) = b; + strksv = pat : snd <: si.bus(N); + sel = pat : fst : ba.selectoutn(N, pat : fst : ba.pulse_countup_loop(N-1, 1)); + out = sel, strksv : ro.interleave(N, 2) : par(i, N, strike) :> (_); + }; + +black_noise(t) = e : *(a) : *(0.2) + with { + lpf = fi.resonlp(80, 1, 1); + a = no.noise : lpf : lpf : fi.resonhp(10, 1, 1) : *(12) : aa.clip(-1, 1) : lpf : lpf; + e = en.ar(3, 10, delay(t, 1000)); + }; + +echos(t) = out + with { + trig = delay(t, 200); + e1 = en.ar(0, 0.6, trig); + e2 = en.ar(0, 1.5, trig); + s1 = e1 * 30 + 3; + out = no.noise : fi.resonlp(s1, 1, 1) : *(80) + : *(no.noise) : aa.clip(-1, 1) : fi.resonbp(333, 4, 1) : *(e2) : *(0.9); + }; + +thunder(trig) = multistrike(trig), black_noise(trig), echos(trig) :> (_); + +process = button("rumble") : ba.impulsify : thunder <: (_, _); + diff --git a/src/static/examples/gameaudio/windchimes.dsp b/src/static/examples/gameaudio/windchimes.dsp new file mode 100644 index 00000000..54ea5b6a --- /dev/null +++ b/src/static/examples/gameaudio/windchimes.dsp @@ -0,0 +1,145 @@ +import("stdfaust.lib"); + +//-------------------------`windchimes`----------------------- +// windchimes(wind) : simulates five windchimes in the wind +// +// #### Usage +// +// ``` +// windchimes(wind) : _ +// ``` +// +// Where: +// +// * `wind`: the wind strength in the range 0-2 +// +// #### Examples +// +// ``` +// windchimes(wind) <: (_, _); +// ``` +// +//------------------------------------------------------------ + +N = 5; + +delay(t, d) = a : edge + with + { + dd = d : ba.sAndH(t); + a = en.ar(dd / 1000, 0, t); + edge(s) = (s' != 0) & (s == 0); + }; + +rnd_trig = out + with { + rnd_ms(t) = no.noise : +(1) : /(2) : *(20) : +(30) : ba.sAndH(t); + kick = 1 - (1 : mem); + out = (+(kick) <: (_, rnd_ms) : delay) ~ (_); + }; + +state(n, p, t) = ba.if(r <= (p / 2), s_up(n), ba.if(r <= p, s_down(n), 0)) + with { + r = no.noise : abs : ba.sAndH(t); + s_down(n) = ba.if(n == 1, N, n - 1); + s_up(n) = ba.if(n == N, 1, n + 1); + }; + +state0(p, t) = ba.if(r <= p, round((r / p) * (N - 1)) + 1, 0) + with { + r = no.noise : abs : ba.sAndH(t); + }; + +model(p, t) = states ~ (mem) + with { + trigbus(j) = t : ba.selectoutn(N + 1, j); + prob = p : ba.sAndH(t) <: si.bus(N + 1); + latched(j) = j : ba.sAndH(t); + states(j) = (prob, trigbus(latched(j))) : ro.interleave((N + 1), 2) : state0, par(i, N, state(i + 1)) : ba.selectn(N + 1, latched(j)); + }; + +energy(w) = En ~ (mem) + with { + Rdec = 0.99997; + ts = 1 / ma.SR; + dn = ts * w; + En(ep) = Rdec * (dn + ep); + }; + +hit_prob(e) = 1.0 / (1 + (99 * exp(-2 * e))); + +burst(e, t) = no.noise : *(env) + with { + es = e : ba.sAndH(t); + env = pow(0.97, 1000 * (1 - en.ar(0.0, 0.02, t))) * a; + a = sqrt(es + 0.1); + }; + +tube(fs, e, t) = burst(e, t) <: fs :> _; + +tube1 = tube( + ( + fi.iir((0.004528016647259483, 0.0, -0.004528016647259483), (-1.9991578581495515, 0.9999856089467211)), + fi.iir((0.028540057030698885, 0.0, -0.028540057030698885), (-1.9939523343007244, 0.9999177681993272)), + fi.iir((0.290932916859811, 0.0, -0.290932916859811), (-1.9784354709624337, 0.999712218280481)), + fi.iir((0.0062308445773086975, 0.0, -0.0062308445773086975), (-1.9462261852132052, 0.9994245193792802)), + fi.iir((0.017763702884906595, 0.0, -0.017763702884906595), (-1.8915978844912849, 0.9988493699365051)) + ) +); + +tube2 = tube( + ( + fi.iir((0.0050634577165950085, 0.0, -0.0050634577165950085), (-1.998950465658379, 0.9999856089467211)), + fi.iir((0.031791650109211915, 0.0, -0.031791650109211915), (-1.9925129392788863, 0.9999177681993272)), + fi.iir((0.3229546018475371, 0.0, -0.3229546018475371), (-1.9734612234415767, 0.999712218280481)), + fi.iir((0.006884051095076797, 0.0, -0.006884051095076797), (-1.9342904838598312, 0.9994245193792802)), + fi.iir((0.01951809943698988, 0.0, -0.01951809943698988), (-1.868596773968664, 0.9988493699365051)) + ) +); + +tube3 = tube( + ( + fi.iir((0.0060538644527733665, 0.0, -0.0060538644527733665), (-1.9985057518687033, 0.9999856089467211)), + fi.iir((0.03780568150590768, 0.0, -0.03780568150590768), (-1.9894383400427211, 0.9999177681993272)), + fi.iir((0.38118631352242155, 0.0, -0.38118631352242155), (-1.9630450505565107, 0.999712218280481)), + fi.iir((0.00810371600245871, 0.0, -0.00810371600245871), (-1.908572035471357, 0.9994245193792802)), + fi.iir((0.02287443857794636, 0.0, -0.02287443857794636), (-1.8175561022180358, 0.9988493699365051)) + ) +); + +tube4 = tube( + ( + fi.iir((0.006829963406716232, 0.0, -0.006829963406716232), (-1.998101807980611, 0.9999856089467211)), + fi.iir((0.042285628336654155, 0.0, -0.042285628336654155), (-1.9867988979110907, 0.9999177681993272)), + fi.iir((0.4242091090450038, 0.0, -0.4242091090450038), (-1.9541994546750083, 0.999712218280481)), + fi.iir((0.008998045088023305, 0.0, -0.008998045088023305), (-1.8867845176260951, 0.9994245193792802)), + fi.iir((0.025301978185301294, 0.0, -0.025301978185301294), (-1.7745042678183585, 0.9988493699365051)) + ) +); + +tube5 = tube( + ( + fi.iir((0.0075400413038973855, 0.0, -0.0075400413038973855), (-1.9976895105377712, 0.9999856089467211)), + fi.iir((0.04670647689695959, 0.0, -0.04670647689695959), (-1.9839007786365699, 0.9999177681993272)), + fi.iir((0.46534722669369927, 0.0, -0.46534722669369927), (-1.9448138307342515, 0.999712218280481)), + fi.iir((0.009847739572905198, 0.0, -0.009847739572905198), (-1.863700481873562, 0.9994245193792802)), + fi.iir((0.027578232028705636, 0.0, -0.027578232028705636), (-1.7290749312918612, 0.9988493699365051)) + ) +); + +windchimes(wind) = sel + with { + en = energy(wind) : hbargraph("v:wind chimes/energy", 0, 1.5); + prob = hit_prob(en) : hbargraph("v:wind chimes/hit probability", 0, 1.0); + state = model(prob, rnd_trig); + hit_trig = state != state'; + tubes = tube1(en, hit_trig); + sel = hit_trig : ba.selectoutn(N + 1, state) : (si.block(1), si.bus(N)): + (tube1(en), tube2(en), tube3(en), tube4(en), tube5(en)) :> *(0.25); + }; + +process = windchimes(wind) <: (_, _) + with { + wind = hslider("v:wind chimes/wind", 0.0, 0, 2, 0.01); + }; + diff --git a/src/static/examples/generator/churchOrgan.dsp b/src/static/examples/generator/churchOrgan.dsp new file mode 100644 index 00000000..41aff3d3 --- /dev/null +++ b/src/static/examples/generator/churchOrgan.dsp @@ -0,0 +1,42 @@ +declare name "churchOrgan"; +declare author "Remi Chapelle"; + +import("stdfaust.lib"); + +f = hslider("[00]freq[unit:Hz]",440,50,1000,0.1); +g = hslider("[01]gain",1,0,1,0.01); +t = button("[10]gate") : si.smoo; +p8 = hslider("[03]gain 8ve partial",1,0,1,0.01); +p5 = hslider("[04]gain 5th partial",1,0,1,0.01); +p3 = hslider("[05]gain 3d partial",1,0,1,0.01); +px = hslider("[06]gain other partials",0.05,0,1,0.01); +p0 = hslider("[02]gain fundamental",1,0,1,0.01); +psub = hslider("[07]gain lower octave",1,0,1,0.01); +nog = hslider("[08]noise gain",0.01,0,1,0.001); +pg = hslider("[09]gain preset",1,0,1,0.01); +r = dm.zita_light; //reverb + +//Instrument + +orgue = + os.osc(f) *p0 + + os.osc(f*2) *p8 + + os.osc(f*0.5) *psub*0.5 + + os.osc(f*1.5) *p5*0.3 + + os.osc(f*3) *p5*0.9 + + os.osc(f*4) *p8*0.8 + + os.osc(f*5) *p3*0.7 + + os.osc(f*6) *p5*0.6 + + os.osc(f*7) *px*0.5 + + os.osc(f*8) *p8*0.6 + + os.osc(f*9) *px*0.3 + + os.osc(f*10) *p3*0.2 + + os.osc(f*11) *px*0.15 + + os.osc(f*12) *p5*0.1 + + os.osc(f*13) *px*0.8 + + os.osc(f*14) *px*0.6 + + os.osc(f*15) *px*0.5 + + os.osc(f*16) *p8*0.4 + + no.noise*nog; + +process = orgue*g*t <: r; diff --git a/src/static/examples/physicalModeling/faust-stk/NLFeks.dsp b/src/static/examples/physicalModeling/faust-stk/NLFeks.dsp deleted file mode 100644 index be0dd05a..00000000 --- a/src/static/examples/physicalModeling/faust-stk/NLFeks.dsp +++ /dev/null @@ -1,91 +0,0 @@ -declare name "NLFeks"; -declare author "Julius Smith and Romain Michon"; -declare version "1.0"; -declare license "STK-4.3"; -declare copyright "Julius Smith"; -declare reference "http://ccrma.stanford.edu/~jos/pasp/vegf.html"; -// -> Virtual\_Electric\_Guitars\_Faust.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -// standard MIDI voice parameters: -// NOTE: The labels MUST be "freq", "gain", and "gate" for faust2pd -freq = nentry("freq", 440, 20, 7040, 1); // Hz -gain = nentry("gain", 1, 0, 10, 0.01); // 0 to 1 -gate = button("gate"); // 0 or 1 - -// Additional parameters (MIDI "controllers"): - -// Pick angle in [0,0.9]: -pickangle = 0.9 * hslider("pick_angle",0,0,0.9,0.1); - -// Normalized pick-position in [0,0.5]: -beta = hslider("pick_position [midi: ctrl 0x81]", 0.13, 0.02, 0.5, 0.01); - // MIDI Control 0x81 often "highpass filter frequency" - -// String decay time in seconds: -t60 = hslider("decaytime_T60", 4, 0, 10, 0.01); // -60db decay time (sec) - -// Normalized brightness in [0,1]: -B = hslider("brightness [midi:ctrl 0x74]", 0.5, 0, 1, 0.01);// 0-1 - // MIDI Controller 0x74 is often "brightness" - // (or VCF lowpass cutoff freq) - -// Dynamic level specified as dB level desired at Nyquist limit: -L = hslider("dynamic_level", -10, -60, 0, 1) : ba.db2linear; -// Note: A lively clavier is obtained by tying L to gain (MIDI velocity). - -//Nonlinear filter parameters -typeModulation = nentry("v:Nonlinear Filter/typeMod",0,0,4,1); -nonLinearity = hslider("Nonlinearity",0,0,1,0.01) : si.smoo; -frequencyMod = hslider("freqMod",220,20,1000,0.1) : si.smoo; - -//==================== SIGNAL PROCESSING ================ - -//----------------------- noiseburst ------------------------- -// White noise burst (adapted from Faust's karplus.dsp example) -// Requires music.lib (for noise) -noiseburst(gate,P) = no.noise : *(gate : trigger(P)) -with { - diffgtz(x) = (x-x') > 0; - decay(n,x) = x - (x>0)/n; - release(n) = + ~ decay(n); - trigger(n) = diffgtz : release(n) : > (0.0); -}; - -nlfOrder = 6; -P = ma.SR/freq ; // fundamental period in samples -Pmax = 4096; // maximum P (for delay-line allocation) - -ppdel = beta*P; // pick position delay -pickposfilter = fi.ffcombfilter(Pmax,ppdel,-1); - -excitation = noiseburst(gate,P) : *(gain); // defined in route.lib - -rho = pow(0.001,1.0/(freq*t60)); // multiplies loop-gain - -// Original EKS damping filter: -b1 = 0.5*B; b0 = 1.0-b1; // S and 1-S -dampingfilter1(x) = rho * ((b0 * x) + (b1 * x')); - -// Linear phase FIR3 damping filter: -h0 = (1.0 + B)/2; h1 = (1.0 - B)/4; -dampingfilter2(x) = rho * (h0 * x' + h1*(x+x'')); - -loopfilter = dampingfilter2; // or dampingfilter1 - -filtered_excitation = excitation : si.smooth(pickangle) - : pickposfilter;// : levelfilter(L,freq); - -//nonlinear allpass filter (nonLinearModulator is declared in instruments.lib) -NLFM = nonLinearModulator(nonLinearity,1,freq,typeModulation,frequencyMod,nlfOrder); - -//declared in instruments.lib -stereo = stereoizer(P); - -stringloop = (+ : de.fdelay4(Pmax, P-2)) ~ (loopfilter : NLFM); - -process = filtered_excitation : stringloop : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/NLFfm.dsp b/src/static/examples/physicalModeling/faust-stk/NLFfm.dsp deleted file mode 100644 index 63d8447a..00000000 --- a/src/static/examples/physicalModeling/faust-stk/NLFfm.dsp +++ /dev/null @@ -1,70 +0,0 @@ -declare name "NLFfm"; -declare description "FM synthesizer implemented with a nonlinear passive allpass filter"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[2][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[2][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[2][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[2][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[3][unit:Hz]",5,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[3][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[3][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[3][unit:s][tooltip:Vibrato release duration]",0.01,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[4][unit:s][tooltip:Envelope attack duration]",0.05,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[4][unit:s][tooltip:Envelope decay duration]",0.05,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[4][unit:s][tooltip:Envelope release duration]",0.05,0,2,0.01); - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 3; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Algorithm implementation ---------------------------- - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//vibrato gain is controlled by envVibrato (declared in instruments.lib) -vibrato = os.osc(vibratoFreq)*vibratoGain*envVibrato(0.1*2*vibratoAttack,0.9*2*vibratoAttack,100,vibratoRelease,gate); - -//output gain is controlled by an adsr envelope -envelope = en.adsr(envelopeAttack,envelopeDecay,0.9,envelopeRelease,gate)*gain; -breath = envelope + envelope*vibrato; - -process = os.osc(freq)*breath : NLFM : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/blowBottle.dsp b/src/static/examples/physicalModeling/faust-stk/blowBottle.dsp deleted file mode 100644 index e4d9e867..00000000 --- a/src/static/examples/physicalModeling/faust-stk/blowBottle.dsp +++ /dev/null @@ -1,102 +0,0 @@ -declare name "blowBottle"; -declare description "Blown Bottle Instrument"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This object implements a helmholtz resonator (biquad filter) with a polynomial jet excitation (a la Cook)."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -noiseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise_Gain -[2][tooltip:Breath noise gain (value between 0 and 1)]",0.5,0,1,0.01)*2; -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (value bewteen 0 and 1)]",1,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",5,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.01,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.01,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.01,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.5,0,2,0.01); - - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, -typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//botlle radius -bottleRadius = 0.999; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -bandPassFilter = bandPass(freq,bottleRadius); - -//----------------------- Algorithm implementation ---------------------------- - -//global envelope is of type attack - decay - sustain - release -envelopeG = gain*en.adsr(gain*envelopeAttack,envelopeDecay,1,envelopeRelease,gate); - -//pressure envelope is also ADSR -envelope = pressure*en.adsr(gain*0.02,0.01,1,gain*0.2,gate); - -//vibrato -vibrato = os.osc(vibratoFreq)*vibratoGain*envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate)*os.osc(vibratoFreq); - -//breat pressure -breathPressure = envelope + vibrato; - -//breath noise -randPressure = noiseGain*no.noise*breathPressure ; - -process = - //differential pressure - (-(breathPressure) <: - ((+(1))*randPressure : +(breathPressure)) - *(jetTable),_ : bandPassFilter,_)~NLFM : !,_ : - //signal scaling - fi.dcblocker*envelopeG*0.5 : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/bowed.dsp b/src/static/examples/physicalModeling/faust-stk/bowed.dsp deleted file mode 100644 index ba46ce6e..00000000 --- a/src/static/examples/physicalModeling/faust-stk/bowed.dsp +++ /dev/null @@ -1,114 +0,0 @@ -declare name "bowed"; -declare description "Nonlinear WaveGuide Bowed Instrument"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A bowed string model, a la Smith (1986), after McIntyre, Schumacher, Woodhouse (1983)."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Bowed_Strings.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position along the string (value between 0 and 1)]",0.7,0.01,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the string (value between 0 and 1)]",0.75,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.01,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.01,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.01,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.05,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.1,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//Parameters for the bow table -tableOffset = 0; -tableSlope = 5 - (4*bowPressure); - -//the bow table is declared in instruments.lib -bowTable = bow(tableOffset,tableSlope); - -//a attack - decay - sustain - release envelope is used -envelope = en.adsr(gain*envelopeAttack,envelopeDecay,1, (1-gain)*envelopeRelease,gate); -maxVelocity = 0.03 + (0.2 * gain); - -//Delay lines declaration and vibrato, the length of the two delay lines are evolving propotionally -betaRatio = 0.027236 + (0.2*bowPosition); -fdelneck = (ma.SR/freq-4)*(1 - betaRatio); -vibratoEnvelope = envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate); -vibrato = fdelneck + ((ma.SR/freq - 4)*vibratoGain*vibratoEnvelope*os.osc(vibratoFreq)); -neckDelay = de.fdelay(4096,vibrato); -fdelbridge = (ma.SR/freq - 4)*betaRatio; -bridgeDelay = de.delay(4096,fdelbridge); - -//Body Filter: a biquad filter with a normalized pick gain (declared in instruments.lib) -bodyFilter = bandPass(500,0.85); - -//String Filter: a lowpass filter (declared in instruments.lib) -stringFilter = *(0.95) : -onePole(b0,a1) - with{ - pole = 0.6 - (0.1*22050/ma.SR); - gain = 0.95; - b0 = 1-pole; - a1 = -pole; - }; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//----------------------- Algorithm implementation ---------------------------- - -bowVelocity = envelope*maxVelocity; -instrumentBody(feedBckBridge) = (*(-1) <: +(feedBckBridge),_ : (bowVelocity-_ <: *(bowTable) <: _,_),_ : - _, + : +(feedBckBridge),_) ~ (neckDelay) : !,_; - -process = (stringFilter : instrumentBody) ~ (bridgeDelay : NLFM) : bodyFilter(*(0.2)) : - _*gain*8 : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/brass.dsp b/src/static/examples/physicalModeling/faust-stk/brass.dsp deleted file mode 100644 index 357c0a1c..00000000 --- a/src/static/examples/physicalModeling/faust-stk/brass.dsp +++ /dev/null @@ -1,103 +0,0 @@ -declare name "brass"; -declare description "WaveGuide Brass instrument from STK"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A simple brass instrument waveguide model, a la Cook (TBone, HosePlayer)."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Brasses.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:A value between 0 and 1]",1,0.01,1,0.01); -lipTension = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Lip_Tension -[2][tooltip:A value between 0 and 1]",0.780,0.01,1,0.001); -slideLength = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Slide_Length -[2][tooltip:A value between 0 and 1]",0.041,0.01,1,0.001); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.05,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.1,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.005,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.001,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.07,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//lips are simulated by a biquad filter whose output is squared and hard-clipped, bandPassH and saturationPos are declared in instruments.lib -lipFilterFrequency = freq*pow(4,(2*lipTension)-1); -lipFilter = *(0.03) : bandPassH(lipFilterFrequency,0.997) <: * : saturationPos; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//delay times in number of samples -slideTarget = ((ma.SR/freq)*2 + 3)*(0.5 + slideLength); -boreDelay = de.fdelay(4096,slideTarget); - -//----------------------- Algorithm implementation ---------------------------- - -//vibrato -vibrato = vibratoGain*os.osc(vibratoFreq)*envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate); - -//envelope (Attack / Decay / Sustain / Release), breath pressure and vibrato -breathPressure = pressure*en.adsr(envelopeAttack,envelopeDecay,1,envelopeRelease,gate) + vibrato; -mouthPressure = 0.3*breathPressure; - -//scale the delay feedback -borePressure = *(0.85); - -//differencial presure -deltaPressure = mouthPressure - _; - -process = (borePressure <: deltaPressure,_ : - (lipFilter <: *(mouthPressure),(1-_)),_ : _, * :> + : - fi.dcblocker) ~ (boreDelay : NLFM) : - *(gain)*4 : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/clarinet.dsp b/src/static/examples/physicalModeling/faust-stk/clarinet.dsp deleted file mode 100644 index 4adb679b..00000000 --- a/src/static/examples/physicalModeling/faust-stk/clarinet.dsp +++ /dev/null @@ -1,110 +0,0 @@ -declare name "clarinet"; -declare description "Nonlinear WaveGuide Clarinet"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A simple clarinet physical model, as discussed by Smith (1986), McIntyre, Schumacher, Woodhouse (1983), and others."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Woodwinds.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -reedStiffness = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Reed_Stiffness -[2][tooltip:Reed stiffness (value between 0 and 1)]",0.5,0,1,0.01); -noiseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise_Gain -[2][tooltip:Breath noise gain (value between 0 and 1)]",0,0,1,0.01); -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (value bewteen 0 and 1)]",1,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",5,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.01,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.01,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.05,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.1,0,2,0.01); - -//==================== SIGNAL PROCESSING ====================== - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//reed table parameters -reedTableOffset = 0.7; -reedTableSlope = -0.44 + (0.26*reedStiffness); - -//the reed function is declared in instruments.lib -reedTable = reed(reedTableOffset,reedTableSlope); - -//delay line with a length adapted in function of the order of nonlinear filter -delayLength = ma.SR/freq*0.5 - 1.5 - (nlfOrder*nonLinearity)*(typeModulation < 2); -delayLine = de.fdelay(4096,delayLength); - -//one zero filter used as a allpass: pole is set to -1 -filter = oneZero0(0.5,0.5); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//----------------------- Algorithm implementation ---------------------------- - -//Breath pressure + vibrato + breath noise + envelope (Attack / Decay / Sustain / Release) -envelope = en.adsr(envelopeAttack,envelopeDecay,1,envelopeRelease,gate)*pressure*0.9; - -vibrato = os.osc(vibratoFreq)*vibratoGain* - envVibrato(0.1*2*vibratoAttack,0.9*2*vibratoAttack,100,vibratoRelease,gate); -breath = envelope + envelope*no.noise*noiseGain; -breathPressure = breath + breath*vibrato; - -process = - //Commuted Loss Filtering - (_,(breathPressure <: _,_) : (filter*-0.95 - _ <: - - //Non-Linear Scattering - *(reedTable)) + _) ~ - - //Delay with Feedback - (delayLine : NLFM) : - - //scaling and stereo - *(gain)*1.5 : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/flute.dsp b/src/static/examples/physicalModeling/faust-stk/flute.dsp deleted file mode 100644 index e01a8623..00000000 --- a/src/static/examples/physicalModeling/faust-stk/flute.dsp +++ /dev/null @@ -1,116 +0,0 @@ -declare name "flute"; -declare description "Nonlinear WaveGuide Flute"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A simple flute based on Smith algorithm: https://ccrma.stanford.edu/~jos/pasp/Flutes_Recorders_Pipe_Organs.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]") : int; - -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (value bewteen 0 and 1)]",0.9,0,1.5,0.01) : si.smoo; -breathAmp = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise Gain -[2][tooltip:Breath noise gain (value between 0 and 1)]",0.1,0,1,0.01)/10; - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",5,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.1,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.2,0,2,0.01); - -pressureEnvelope = checkbox("h:Envelopes_and_Vibrato/v:Pressure_Envelope_Parameters/Pressure_Env -[5][unit:s][tooltip:Activate Pressure envelope]") : int; -env1Attack = hslider("h:Envelopes_and_Vibrato/v:Pressure_Envelope_Parameters/Press_Env_Attack -[5][unit:s][tooltip:Pressure envelope attack duration]",0.05,0,2,0.01); -env1Decay = hslider("h:Envelopes_and_Vibrato/v:Pressure_Envelope_Parameters/Press_Env_Decay -[5][unit:s][tooltip:Pressure envelope decay duration]",0.2,0,2,0.01); -env1Release = hslider("h:Envelopes_and_Vibrato/v:Pressure_Envelope_Parameters/Press_Env_Release -[5][unit:s][tooltip:Pressure envelope release duration]",1,0,2,0.01); - -env2Attack = hslider("h:Envelopes_and_Vibrato/v:Global_Envelope_Parameters/Glob_Env_Attack -[6][unit:s][tooltip:Global envelope attack duration]",0.1,0,2,0.01); -env2Release = hslider("h:Envelopes_and_Vibrato/v:Global_Envelope_Parameters/Glob_Env_Release -[6][unit:s][tooltip:Global envelope release duration]",0.1,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,0.1,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//Loops feedbacks gains -feedBack1 = 0.4; -feedBack2 = 0.4; - -//Delay Lines -embouchureDelayLength = (ma.SR/freq)/2-2; -boreDelayLength = ma.SR/freq-2; -embouchureDelay = de.fdelay(4096,embouchureDelayLength); -boreDelay = de.fdelay(4096,boreDelayLength); - -//Polynomial -poly = _ <: _ - _*_*_; - -//jet filter is a lowpass filter (declared in miscfilter.lib) -reflexionFilter = fi.lowpass(1,2000); - -//stereoizer is declared in instruments.lib and implement a stereo spatialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//----------------------- Algorithm implementation ---------------------------- - -//Pressure envelope -env1 = en.adsr(env1Attack,env1Decay,0.9,env1Release,(gate | pressureEnvelope))*pressure*1.1; - -//Global envelope -env2 = en.asr(env2Attack,1,env2Release,gate)*0.5; - -//Vibrato Envelope -vibratoEnvelope = envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate)*vibratoGain; - -vibrato = os.osc(vibratoFreq)*vibratoEnvelope; - -breath = no.noise*env1; - -flow = env1 + breath*breathAmp + vibrato; - -//instrReverb is declared in instruments.lib -process = (_ <: (flow + *(feedBack1) : embouchureDelay : poly) + *(feedBack2) : reflexionFilter)~(boreDelay : NLFM) : *(env2)*gain : -stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/fluteStk.dsp b/src/static/examples/physicalModeling/faust-stk/fluteStk.dsp deleted file mode 100644 index 83f432dd..00000000 --- a/src/static/examples/physicalModeling/faust-stk/fluteStk.dsp +++ /dev/null @@ -1,121 +0,0 @@ -declare name "fluteStk"; -declare description "Nonlinear WaveGuide Flute from STK"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "A simple flute physical model, as discussed by Karjalainen, Smith, Waryznyk, etc. The jet model uses a polynomial, a la Cook."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Flutes_Recorders_Pipe_Organs.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -embouchureAjust = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Embouchure_Ajust -[2][tooltip:A value between 0 and 1]",0.5,0,1,0.01); -noiseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise_Gain -[2][tooltip:A value between 0 and 1]",0.03,0,1,0.01); -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (value between 0 and 1)]",1,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.05,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.1,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.03,0,2,0.01); -envelopeDecay = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Decay -[5][unit:s][tooltip:Envelope decay duration]",0.01,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.3,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -jetReflexion = 0.5; -//jetRatio = 0.08 + (0.48*embouchureAjust); //original stk function -jetRatio = 1+(0.5-embouchureAjust); //corrected function -endReflexion = 0.5; - -//Delay lines lengths in number of samples -//jetDelayLength = (SR/freq-2)*jetRatio; //original stk function for jet delay length -jetDelayLength = (ma.SR/(freq*2)-2)*jetRatio; //corrected function for jet delay length -boreDelayLength = ma.SR/(freq*2)-2; //original function for bore delay length -//boreDelayLength = SR/(freq)-2; //corrected function for bore delay length -filterPole = 0.7 - (0.1*22050/ma.SR); - -//One Pole Filter (declared in instruments.lib) -onePoleFilter = _*gain : onePole(b0,a1) - with{ - gain = -1; - pole = 0.7 - (0.1*22050/ma.SR); - b0 = 1 - pole; - a1 = -pole; - }; - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//----------------------- Algorithm implementation ---------------------------- - -//the vibrato amplitude is controlled by an envelope generator (declared in instruments.lib) -vibrato = vibratoGain*envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate)*os.osc(vibratoFreq); - -//Breath pressure is controlled by an Attack / Decay / Sustain / Release envelope -envelopeBreath = pressure*en.adsr(pressure*envelopeAttack,envelopeDecay,0.8,envelopeRelease,gate); -breathPressure = envelopeBreath + envelopeBreath*(noiseGain*no.noise + vibrato) + 10.0^(-15.0); - -//delay lines -jetDelay = de.fdelay(4096,jetDelayLength); -boreDelay = de.fdelay(4096,boreDelayLength); - -//reflexion filter is a one pole and a dcblocker -reflexionFilters = onePoleFilter : fi.dcblocker; - -process = - (reflexionFilters <: - //Differential Pressure - ((breathPressure - _*jetReflexion) : - jetDelay : jetTable) + (_*endReflexion)) ~ (boreDelay : NLFM) : - //output scaling and stereo signal - *(0.3*gain) : stereo : instrReverb; - - diff --git a/src/static/examples/physicalModeling/faust-stk/glassHarmonica.dsp b/src/static/examples/physicalModeling/faust-stk/glassHarmonica.dsp deleted file mode 100644 index f7e874d8..00000000 --- a/src/static/examples/physicalModeling/faust-stk/glassHarmonica.dsp +++ /dev/null @@ -1,131 +0,0 @@ -declare name "glassHarmonica"; -declare description "Nonlinear Banded Waveguide Modeled Glass Harmonica"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument uses banded waveguide. For more information, see Essl, G. and Cook, P. Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments, Proceedings of the 1999 International Computer Music Conference."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -select = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Excitation_Selector -[2][tooltip:0=Bow; 1=Strike]",0,0,1,1); -integrationConstant = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Integration_Constant -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -baseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Base_Gain -[2][tooltip:A value between 0 and 1]",1,0,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the instrument (Value between 0 and 1)]",0.2,0,1,0.01); -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position on the instrument (Value between 0 and 1)]",0,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -//==================== MODAL PARAMETERS ================ - -preset = 3; - -nMode(3) = 6; - -modes(3,0) = 1.0; -basegains(3,0) = pow(0.999,1); -excitation(3,0) = 1*gain*gate/(nMode(3) - 1); - -modes(3,1) = 2.32; -basegains(3,1) = pow(0.999,2); -excitation(3,1) = 1*gain*gate/(nMode(3) - 1); - -modes(3,2) = 4.25; -basegains(3,2) = pow(0.999,3); -excitation(3,2) = 1*gain*gate/(nMode(3) - 1); - -modes(3,3) = 6.63; -basegains(3,3) = pow(0.999,4); -excitation(3,3) = 1*gain*gate/(nMode(3) - 1); - -modes(3,4) = 9.38; -basegains(3,4) = pow(0.999,5); -excitation(3,4) = 1*gain*gate/(nMode(3) - 1); - -modes(3,5) = 9 : float; -basegains(3,5) = 0 : float; -excitation(3,5) = 0 : float; - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, -typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//the number of modes depends on the preset being used -nModes = nMode(preset); - -//bow table parameters -tableOffset = 0; -tableSlope = 10 - (9*bowPressure); - -delayLengthBase = ma.SR/freq; - -//delay lengths in number of samples -delayLength(x) = delayLengthBase/modes(preset,x); - -//delay lines -delayLine(x) = de.delay(4096,delayLength(x)); - -//Filter bank: bandpass filters (declared in instruments.lib) -radius = 1 - ma.PI*32/ma.SR; -bandPassFilter(x) = bandPass(freq*modes(preset,x),radius); - -//Delay lines feedback for bow table lookup control -baseGainApp = 0.8999999999999999 + (0.1*baseGain); -velocityInputApp = integrationConstant; -velocityInput = velocityInputApp + _*baseGainApp,par(i,(nModes-1),(_*baseGainApp)) :> +; - -//Bow velocity is controlled by an ADSR envelope -maxVelocity = 0.03 + 0.1*gain; -bowVelocity = maxVelocity*en.adsr(0.02,0.005,1,0.01,gate); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLengthBase); - -//----------------------- Algorithm implementation ---------------------------- - -//Bow table lookup (bow is decalred in instruments.lib) -bowing = bowVelocity - velocityInput <: *(bow(tableOffset,tableSlope)) : /(nModes); - -//One resonance -resonance(x) = + : + (excitation(preset,x)*select) : delayLine(x) : *(basegains(preset,x)) : bandPassFilter(x); - -process = - //Bowed Excitation - (bowing*((select-1)*-1) <: - //nModes resonances with nModes feedbacks for bow table look-up - par(i,nModes,(resonance(i)~_)))~par(i,nModes,_) :> + : - //Signal Scaling and stereo - *(4) : NLFM : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/saxophony.dsp b/src/static/examples/physicalModeling/faust-stk/saxophony.dsp deleted file mode 100644 index b6bac050..00000000 --- a/src/static/examples/physicalModeling/faust-stk/saxophony.dsp +++ /dev/null @@ -1,114 +0,0 @@ -declare name "saxophony"; -declare description "Nonlinear WaveGuide Saxophone"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This class implements a hybrid digital waveguide instrument that can generate a variety of wind-like sounds. It has also been referred to as the blowed string model. The waveguide section is essentially that of a string, with one rigid and one lossy termination. The non-linear function is a reed table. The string can be blown at any point between the terminations, though just as with strings, it is impossible to excite the system at either end. If the excitation is placed at the string mid-point, the sound is that of a clarinet. At points closer to the bridge, the sound is closer to that of a saxophone. See Scavone (2002) for more details."; -declare reference "https://ccrma.stanford.edu/~jos/pasp/Woodwinds.html"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -pressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Pressure -[2][tooltip:Breath pressure (a value between 0 and 1)]",1,0,1,0.01); -reedStiffness = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Reed_Stiffness -[2][tooltip:A value between 0 and 1]",0.3,0,1,0.01); -blowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Blow_Position -[2][tooltip:A value between 0 and 1]",0.5,0,1,0.01); -noiseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Noise_Gain",0.05,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[4][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[4][tooltip:A value between 0 and 1]",0.1,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[4][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[4][unit:s][tooltip:Vibrato attack duration]",0.3,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[4][unit:s][tooltip:Vibrato release duration]",0.1,0,2,0.01); - -envelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Attack -[5][unit:s][tooltip:Envelope attack duration]",0.05,0,2,0.01); -envelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Envelope_Release -[5][unit:s][tooltip:Envelope release duration]",0.01,0,2,0.01); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//attack - sustain - release envelope for nonlinearity (declared in instruments.lib) -envelopeMod = en.asr(nonLinAttack,1,envelopeRelease,gate); - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),envelopeMod,freq, - typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//reed table parameters -reedTableOffset = 0.7; -reedTableSlope = 0.1 + (0.4*reedStiffness); - -//the reed function is declared in instruments.lib -reedTable = reed(reedTableOffset,reedTableSlope); - -//Delay lines length in number of samples -fdel1 = (1-blowPosition) * (ma.SR/freq - 3); -fdel2 = (ma.SR/freq - 3)*blowPosition +1 ; - -//Delay lines -delay1 = de.fdelay(4096,fdel1); -delay2 = de.fdelay(4096,fdel2); - -//Breath pressure is controlled by an attack / sustain / release envelope (asr is declared in instruments.lib) -envelope = (0.55+pressure*0.3)*en.asr(pressure*envelopeAttack,1,pressure*envelopeRelease,gate); -breath = envelope + envelope*noiseGain*no.noise; - -//envVibrato is decalred in instruments.lib -vibrato = vibratoGain*envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate)*osc(vibratoFreq); -breathPressure = breath + breath*vibratoGain*os.osc(vibratoFreq); - -//Body filter is a one zero filter (declared in instruments.lib) -bodyFilter = *(gain) : oneZero1(b0,b1) - with{ - gain = -0.95; - b0 = 0.5; - b1 = 0.5; - }; - -instrumentBody(delay1FeedBack,breathP) = delay1FeedBack <: -(delay2) <: - ((breathP - _ <: breathP - _*reedTable) - delay1FeedBack),_; - -process = - (bodyFilter,breathPressure : instrumentBody) ~ - (delay1 : NLFM) : !, - //Scaling Output and stereo - *(gain) : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/sitar.dsp b/src/static/examples/physicalModeling/faust-stk/sitar.dsp deleted file mode 100644 index 0b4b1af2..00000000 --- a/src/static/examples/physicalModeling/faust-stk/sitar.dsp +++ /dev/null @@ -1,48 +0,0 @@ -declare name "Sitar"; -declare description "WaveGuide Sitar"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument implements a sitar plucked string physical model based on the Karplus-Strong algorithm using a randomly modulated delay line."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -resonance = hslider("v:Physical_Parameters/Resonance -[2][tooltip:A value between 0 and 1]",0.7,0,1,0.01)*0.1; - -//==================== SIGNAL PROCESSING ================ - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//excitation envelope (adsr) -envelope = en.adsr(0.001,0.04,1,0.5,gate); - -//the delay length is randomly modulated -targetDelay = ma.SR/freq; -delayLength = targetDelay*((1+(0.5*no.noise)) : si.smooth(0.9992)); -delayLine = de.delay(4096,delayLength); - -//the loop gain control the resonance duration -loopGain = 0.895 + resonance + (freq*0.0000005); -amGain = 0.1*gain; - -//feedback filter is a one zero (declared in instruments.lib) -filter = oneZero1(b0,b1) - with{ - zero = 0.01; - b0 = 1/(1 + zero); - b1 = -zero*b0; - }; - -process = (*(loopGain) : filter + (envelope*no.noise*amGain))~delayLine : *(8) : -stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/tibetanBowl.dsp b/src/static/examples/physicalModeling/faust-stk/tibetanBowl.dsp deleted file mode 100644 index ce13307e..00000000 --- a/src/static/examples/physicalModeling/faust-stk/tibetanBowl.dsp +++ /dev/null @@ -1,155 +0,0 @@ -declare name "tibetanBowl"; -declare description "Banded Waveguide Modeld Tibetan Bowl"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument uses banded waveguide. For more information, see Essl, G. and Cook, P. Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments, Proceedings of the 1999 International Computer Music Conference."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -select = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Excitation_Selector -[2][tooltip:0=Bow; 1=Strike]",0,0,1,1); -integrationConstant = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Integration_Constant -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -baseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Base_Gain -[2][tooltip:A value between 0 and 1]",1,0,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the instrument (Value between 0 and 1)]",0.2,0,1,0.01); -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position on the instrument (Value between 0 and 1)]",0,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -//==================== MODAL PARAMETERS ================ - -preset = 0; - -nMode(0) = 12; - -modes(0,0) = 0.996108344; -basegains(0,0) = 0.999925960128219; -excitation(0,0) = 11.900357 / 10; - -modes(0,1) = 1.0038916562; -basegains(0,1) = 0.999925960128219; -excitation(0,1) = 11.900357 / 10; - -modes(0,2) = 2.979178; -basegains(0,2) = 0.999982774366897; -excitation(0,2) = 10.914886 / 10; - -modes(0,3) = 2.99329767; -basegains(0,3) = 0.999982774366897; -excitation(0,3) = 10.914886 / 10; - -modes(0,4) = 5.704452; -basegains(0,4) = 1.0; -excitation(0,4) = 42.995041 / 10; - -modes(0,5) = 5.704452; -basegains(0,5) = 1.0; -excitation(0,5) = 42.995041 / 10; - -modes(0,6) = 8.9982; -basegains(0,6) = 1.0; -excitation(0,6) = 40.063034 / 10; - -modes(0,7) = 9.01549726; -basegains(0,7) = 1.0; -excitation(0,7) = 40.063034 / 10; - -modes(0,8) = 12.83303; -basegains(0,8) = 0.999965497558225; -excitation(0,8) = 7.063034 / 10; - -modes(0,9) = 12.807382; -basegains(0,9) = 0.999965497558225; -excitation(0,9) = 7.063034 / 10; - -modes(0,10) = 17.2808219; -basegains(0,10) = 0.9999999999999999999965497558225; -excitation(0,10) = 57.063034 / 10; - -modes(0,11) = 21.97602739726; -basegains(0,11) = 0.999999999999999965497558225; -excitation(0,11) = 57.063034 / 10; - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, -typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//the number of modes depends on the preset being used -nModes = nMode(preset); - -//bow table parameters -tableOffset = 0; -tableSlope = 10 - (9*bowPressure); - -delayLengthBase = ma.SR/freq; - -//delay lengths in number of samples -delayLength(x) = delayLengthBase/modes(preset,x); - -//delay lines -delayLine(x) = de.delay(4096,delayLength(x)); - -//Filter bank: bandpass filters (declared in instruments.lib) -radius = 1 - ma.PI*32/ma.SR; -bandPassFilter(x) = bandPass(freq*modes(preset,x),radius); - -//Delay lines feedback for bow table lookup control -baseGainApp = 0.8999999999999999 + (0.1*baseGain); -velocityInputApp = integrationConstant; -velocityInput = velocityInputApp + _*baseGainApp,par(i,(nModes-1),(_*baseGainApp)) :> +; - -//Bow velocity is controlled by an ADSR envelope -maxVelocity = 0.03 + 0.1*gain; -bowVelocity = maxVelocity*en.adsr(0.02,0.005,1,0.01,gate); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLengthBase); - -//----------------------- Algorithm implementation ---------------------------- - -//Bow table lookup (bow is decalred in instruments.lib) -bowing = bowVelocity - velocityInput <: *(bow(tableOffset,tableSlope)) : /(nModes); - -//One resonance -resonance(x) = + : + (excitation(preset,x)*select) : delayLine(x) : *(basegains(preset,x)) : bandPassFilter(x); - -process = - //Bowed Excitation - (bowing*((select-1)*-1) <: - //nModes resonances with nModes feedbacks for bow table look-up - par(i,nModes,(resonance(i)~_)))~par(i,nModes,_) :> + : - //Signal Scaling and stereo - NLFM : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/tunedBar.dsp b/src/static/examples/physicalModeling/faust-stk/tunedBar.dsp deleted file mode 100644 index 1dd6b15b..00000000 --- a/src/static/examples/physicalModeling/faust-stk/tunedBar.dsp +++ /dev/null @@ -1,123 +0,0 @@ -declare name "tunedBar"; -declare description "Nonlinear Banded Waveguide Models"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument uses banded waveguide. For more information, see Essl, G. and Cook, P. Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments, Proceedings of the 1999 International Computer Music Conference."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -select = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Excitation_Selector -[2][tooltip:0=Bow; 1=Strike]",0,0,1,1); -integrationConstant = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Integration_Constant -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -baseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Base_Gain -[2][tooltip:A value between 0 and 1]",1,0,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the instrument (Value between 0 and 1)]",0.2,0,1,0.01); -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position on the instrument (Value between 0 and 1)]",0,0,1,0.01); - -typeModulation = nentry("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Type -[3][tooltip: 0=theta is modulated by the incoming signal; 1=theta is modulated by the averaged incoming signal; -2=theta is modulated by the squared incoming signal; 3=theta is modulated by a sine wave of frequency freqMod; -4=theta is modulated by a sine wave of frequency freq;]",0,0,4,1); -nonLinearity = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity -[3][tooltip:Nonlinearity factor (value between 0 and 1)]",0,0,1,0.01); -frequencyMod = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Modulation_Frequency -[3][unit:Hz][tooltip:Frequency of the sine wave for the modulation of theta (works if Modulation Type=3)]",220,20,1000,0.1); -nonLinAttack = hslider("h:Physical_and_Nonlinearity/v:Nonlinear_Filter_Parameters/Nonlinearity_Attack -[3][unit:s][Attack duration of the nonlinearity]",0.1,0,2,0.01); - -//==================== MODAL PARAMETERS ================ - -preset = 2; - -nMode(2) = 4; - -modes(2,0) = 1; -basegains(2,0) = pow(0.999,1); -excitation(2,0) = 1*gain*gate/nMode(2); - -modes(2,1) = 4.0198391420; -basegains(2,1) = pow(0.999,2); -excitation(2,1) = 1*gain*gate/nMode(2); - -modes(2,2) = 10.7184986595; -basegains(2,2) = pow(0.999,3); -excitation(2,2) = 1*gain*gate/nMode(2); - -modes(2,3) = 18.0697050938; -basegains(2,3) = pow(0.999,4); -excitation(2,3) = 1*gain*gate/nMode(2); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Nonlinear filter ---------------------------- -//nonlinearities are created by the nonlinear passive allpass ladder filter declared in miscfilter.lib - -//nonlinear filter order -nlfOrder = 6; - -//nonLinearModultor is declared in instruments.lib, it adapts allpassnn from miscfilter.lib -//for using it with waveguide instruments -NLFM = nonLinearModulator((nonLinearity : si.smoo),1,freq, -typeModulation,(frequencyMod : si.smoo),nlfOrder); - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//the number of modes depends on the preset being used -nModes = nMode(preset); - -//bow table parameters -tableOffset = 0; -tableSlope = 10 - (9*bowPressure); - -delayLengthBase = ma.SR/freq; - -//delay lengths in number of samples -delayLength(x) = delayLengthBase/modes(preset,x); - -//delay lines -delayLine(x) = de.delay(4096,delayLength(x)); - -//Filter bank: bandpass filters (declared in instruments.lib) -radius = 1 - ma.PI*32/ma.SR; -bandPassFilter(x) = bandPass(freq*modes(preset,x),radius); - -//Delay lines feedback for bow table lookup control -baseGainApp = 0.8999999999999999 + (0.1*baseGain); -velocityInputApp = integrationConstant; -velocityInput = velocityInputApp + _*baseGainApp,par(i,(nModes-1),(_*baseGainApp)) :> +; - -//Bow velocity is controlled by an ADSR envelope -maxVelocity = 0.03 + 0.1*gain; -bowVelocity = maxVelocity*en.adsr(0.02,0.005,0.9,0.01,gate); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLengthBase); - -//----------------------- Algorithm implementation ---------------------------- - -//Bow table lookup (bow is decalred in instruments.lib) -bowing = bowVelocity - velocityInput <: *(bow(tableOffset,tableSlope)) : /(nModes); - -//One resonance -resonance(x) = + : + (excitation(preset,x)*select) : delayLine(x) : *(basegains(preset,x)) : bandPassFilter(x); - -process = - //Bowed Excitation - (bowing*((select-1)*-1) <: - //nModes resonances with nModes feedbacks for bow table look-up - par(i,nModes,(resonance(i)~_)))~par(i,nModes,_) :> + : - //Signal Scaling and stereo - *(4) : NLFM : stereo : instrReverb; - diff --git a/src/static/examples/physicalModeling/faust-stk/uniBar.dsp b/src/static/examples/physicalModeling/faust-stk/uniBar.dsp deleted file mode 100644 index c485f93d..00000000 --- a/src/static/examples/physicalModeling/faust-stk/uniBar.dsp +++ /dev/null @@ -1,100 +0,0 @@ -declare name "UniBar"; -declare description "Nonlinear Banded Waveguide Models"; -declare author "Romain Michon"; -declare copyright "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument uses banded waveguide. For more information, see Essl, G. and Cook, P. Banded Waveguides: Towards Physical Modelling of Bar Percussion Instruments, Proceedings of the 1999 International Computer Music Conference."; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",0.8,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -select = nentry("h:Physical_and_Nonlinearity/v:Physical_Parameters/Excitation_Selector -[2][tooltip:0=Bow; 1=Strike]",0,0,1,1); -integrationConstant = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Integration_Constant -[2][tooltip:A value between 0 and 1]",0,0,1,0.01); -baseGain = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Base_Gain -[2][tooltip:A value between 0 and 1]",1,0,1,0.01); -bowPressure = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Pressure -[2][tooltip:Bow pressure on the instrument (Value between 0 and 1)]",0.2,0,1,0.01); -bowPosition = hslider("h:Physical_and_Nonlinearity/v:Physical_Parameters/Bow_Position -[2][tooltip:Bow position on the instrument (Value between 0 and 1)]",0,0,1,0.01); - -//==================== MODAL PARAMETERS ================ - -preset = 1; - -nMode(1) = 4; - -modes(1,0) = 1; -basegains(1,0) = pow(0.9,1); -excitation(1,0) = 1*gain/nMode(1); - -modes(1,1) = 2.756; -basegains(1,1) = pow(0.9,2); -excitation(1,1) = 1*gain/nMode(1); - -modes(1,2) = 5.404; -basegains(1,2) = pow(0.9,3); -excitation(1,2) = 1*gain/nMode(1); - -modes(1,3) = 8.933; -basegains(1,3) = pow(0.9,4); -excitation(1,3) = 1*gain/nMode(1); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//the number of modes depends on the preset being used -nModes = nMode(preset); - -//bow table parameters -tableOffset = 0; -tableSlope = 10 - (9*bowPressure); - -delayLengthBase = ma.SR/freq; - -//delay lengths in number of samples -delayLength(x) = delayLengthBase/modes(preset,x); - -//delay lines -delayLine(x) = de.delay(4096,delayLength(x)); - -//Filter bank: bandpass filters (declared in instruments.lib) -radius = 1 - ma.PI*32/ma.SR; -bandPassFilter(x) = bandPass(freq*modes(preset,x),radius); - -//Delay lines feedback for bow table lookup control -baseGainApp = 0.8999999999999999 + (0.1*baseGain); -velocityInputApp = integrationConstant; -velocityInput = velocityInputApp + _*baseGainApp,par(i,(nModes-1),(_*baseGainApp)) :> +; - -//Bow velocity is controlled by an ADSR envelope -maxVelocity = 0.03 + 0.1*gain; -bowVelocity = maxVelocity*en.adsr(0.02,0.005,0.9,0.01,gate); - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(delayLengthBase); - -//----------------------- Algorithm implementation ---------------------------- - -//Bow table lookup (bow is decalred in instruments.lib) -bowing = bowVelocity - velocityInput <: *(bow(tableOffset,tableSlope)) : /(nModes); - -//One resonance -resonance(x) = + : + (excitation(preset,x)*select) : delayLine(x) : *(basegains(preset,x)) : bandPassFilter(x); - -process = - //Bowed Excitation - (bowing*((select-1)*-1) <: - //nModes resonances with nModes feedbacks for bow table look-up - par(i,nModes,(resonance(i)~_)))~par(i,nModes,_) :> + : - //Signal Scaling and stereo - *(14) : stereo : instrReverb; diff --git a/src/static/examples/physicalModeling/faust-stk/voiceForm.dsp b/src/static/examples/physicalModeling/faust-stk/voiceForm.dsp deleted file mode 100644 index 7e297df6..00000000 --- a/src/static/examples/physicalModeling/faust-stk/voiceForm.dsp +++ /dev/null @@ -1,125 +0,0 @@ -declare name "voiceForm"; -declare description "Voice Formant Instrument"; -declare author "Romain Michon (rmichon@ccrma.stanford.edu)"; -declare copyright "Romain Michon"; -declare version "1.0"; -declare licence "STK-4.3"; // Synthesis Tool Kit 4.3 (MIT style license); -declare description "This instrument contains an excitation singing wavetable (looping wave with random and periodic vibrato, smoothing on frequency, etc.), excitation noise, and four sweepable complex resonances. Phoneme preset numbers: 0->eee (beet), 1->ihh (bit), 2->ehh (bet), 3->aaa (bat), 4->ahh (father), 5->aww (bought), 6->ohh (bone), 7->uhh (but), 8->uuu (foot), 9->ooo (boot), 10->rrr (bird), 11->lll (lull), 12->mmm (mom), 13->nnn (nun), 14->nng (sang), 15->ngg (bong), 16->fff, 17->sss, 18->thh, 19->shh, 20->xxx, 21->hee (beet), 22->hoo (boot), 23->hah (father), 24->bbb, 25->ddd, 26->jjj, 27->ggg, 28->vvv, 29->zzz, 30->thz, 31->zhh"; - -import("instruments.lib"); - -//==================== GUI SPECIFICATION ================ - -freq = nentry("h:Basic_Parameters/freq [1][unit:Hz] [tooltip:Tone frequency]",440,20,20000,1); -gain = nentry("h:Basic_Parameters/gain [1][tooltip:Gain (value between 0 and 1)]",1,0,1,0.01); -gate = button("h:Basic_Parameters/gate [1][tooltip:noteOn = 1, noteOff = 0]"); - -phoneme = hslider("v:Physical_Parameters/Phoneme -[2][tooltip:0->eee, 1->ihh, 2->ehh, 3->aaa, 4->ahh, 5->aww, 6->ohh, 7->uhh, 8->uuu, 9->ooo, 10->rrr, 11->lll, 12->mmm, 13->nnn, 14->nng, 15->ngg, 16->fff, 17->sss, 18->thh, 19->shh, 20->xxx, 21->hee, 22->hoo, 23->hah, 24->bbb, 25->ddd, 26->jjj, 27->ggg, 28->vvv, 29->zzz, 30->thz, 31->zhh]",4,0,31,1); - -vibratoFreq = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Freq -[3][unit:Hz]",6,1,15,0.1); -vibratoGain = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Gain -[3][tooltip:A value between 0 and 1]",0.05,0,1,0.01); -vibratoBegin = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Begin -[3][unit:s][tooltip:Vibrato silence duration before attack]",0.05,0,2,0.01); -vibratoAttack = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Attack -[3][unit:s][tooltip:Vibrato attack duration]",0.5,0,2,0.01); -vibratoRelease = hslider("h:Envelopes_and_Vibrato/v:Vibrato_Parameters/Vibrato_Release -[3][unit:s][tooltip:Vibrato release duration]",0.1,0,2,0.01); - -voicedEnvelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Voiced_Attack -[4][unit:s][tooltip:Voiced sounds attack duration]",0.01,0,2,0.01); -voicedEnvelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Voiced_Release -[4][unit:s][tooltip:Voiced sounds release duration]",0.01,0,2,0.01); - -noiseEnvelopeAttack = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Noised_Attack -[4][unit:s][tooltip:Noised sounds attack duration]",0.001,0,2,0.001); -noiseEnvelopeRelease = hslider("h:Envelopes_and_Vibrato/v:Envelope_Parameters/Noised_Release -[4][unit:s][tooltip:Noised sounds release duration]",0.001,0,2,0.001); - -//==================== SIGNAL PROCESSING ================ - -//----------------------- Synthesis parameters computing and functions declaration ---------------------------- - -//stereoizer is declared in instruments.lib and implement a stereo spacialisation in function of -//the frequency period in number of samples -stereo = stereoizer(ma.SR/freq); - -//exitation filters (declared in instruments.lib) -onePoleFilter = onePole(b0,a1) - with{ - pole = 0.97 - (gain*0.2); - b0 = 1 - pole; - a1 = -pole; - }; -oneZeroFilter = oneZero1(b0,b1) - with{ - zero = -0.9; - b0 = 1/(1 - zero); - b1 = -zero*b0; - }; - -//implements a formant (resonance) which can be "swept" over time from one frequency setting to another -formSwep(frequency,radius,filterGain) = *(gain_) : bandPass(frequency_,radius) - with{ - //filter's radius, gain and frequency are interpolated - radius_ = radius : si.smoo; - frequency_ = frequency : si.smoo; - gain_ = filterGain : si.smoo; - }; - -//formants parameters are countained in a C++ file -phonemeGains = ffunction(float loadPhonemeGains(int,int), ,""); -phonemeParameters = ffunction(float loadPhonemeParameters(int,int,int), ,""); - -//formants frequencies -ffreq0 = phonemeParameters(phoneme,0,0); -ffreq1 = phonemeParameters(phoneme,1,0); -ffreq2 = phonemeParameters(phoneme,2,0); -ffreq3 = phonemeParameters(phoneme,3,0); - -//formants radius -frad0 = phonemeParameters(phoneme,0,1); -frad1 = phonemeParameters(phoneme,1,1); -frad2 = phonemeParameters(phoneme,2,1); -frad3 = phonemeParameters(phoneme,3,1); - -//formants gains -fgain0 = phonemeParameters(phoneme,0,2) : pow(10,(_/20)); -fgain1 = phonemeParameters(phoneme,1,2) : pow(10,(_/20)); -fgain2 = phonemeParameters(phoneme,2,2) : pow(10,(_/20)); -fgain3 = phonemeParameters(phoneme,3,2) : pow(10,(_/20)); - -//gain of the voiced part od the sound -voiceGain = phonemeGains(phoneme,0) : si.smoo; - -//gain of the fricative part of the sound -noiseGain = phonemeGains(phoneme,1) : si.smoo; - -//formants filters -filter0 = formSwep(ffreq0,frad0,fgain0); -filter1 = formSwep(ffreq1,frad1,fgain1); -filter2 = formSwep(ffreq2,frad2,fgain2); -filter3 = formSwep(ffreq3,frad3,fgain3); - -//----------------------- Algorithm implementation ---------------------------- - -//envelopes (declared in instruments.lib) and vibrato -vibratoEnvelope = envVibrato(vibratoBegin,vibratoAttack,100,vibratoRelease,gate); -voicedEnvelope = en.asr(voicedEnvelopeAttack,1,voicedEnvelopeRelease,gate); -noiseEnvelope = en.asr(noiseEnvelopeAttack,1,noiseEnvelopeRelease,gate); -vibrato = os.osc(vibratoFreq)*vibratoGain*100*vibratoEnvelope; - -//the voice source is generated by an impulse train -//(imptrain defined in oscillator.lib) that is lowpass filtered -voiced = os.imptrain(freq+vibrato) : fi.lowpass3e(3300) : *(voiceGain*voicedEnvelope); - -//ficative sounds are produced by a noise generator -frica = no.noise*noiseEnvelope*noiseGain; - -process = voiced : oneZeroFilter : onePoleFilter : - +(frica) <: filter0,filter1,filter2,filter3 :> + : stereo : - instrReverb; - - diff --git a/src/static/examples/reverb/vital_rev.dsp b/src/static/examples/reverb/vital_rev.dsp new file mode 100644 index 00000000..42370597 --- /dev/null +++ b/src/static/examples/reverb/vital_rev.dsp @@ -0,0 +1,8 @@ +declare name "vital_rev"; +declare version "0.1"; +declare author "David Braun"; +declare description "Vital demo application."; + +import("stdfaust.lib"); + +process = dm.vital_rev_demo; diff --git a/src/static/index.html b/src/static/index.html index 07ac0934..bbed7020 100644 --- a/src/static/index.html +++ b/src/static/index.html @@ -116,6 +116,12 @@ Use AudioWorklet +
+ + +